TIKI-MINI로 시작하는 ROS2 실무
목차

3. 개발 PC 환경

3.6패키지·워크스페이스·colcon

지금까지는 노드 하나를 파일 하나로 실행해 봤습니다. 하지만 실제 로봇 소프트웨어는 노드, 런치 파일, 설정 파일, 메시지 정의가 수십 개씩 모입니다. 이 장에서는 이것들을 정리해 빌드하고, 다른 사람에게 전달하고, 실행할 때 지키는 약속을 다룹니다.

패키지 (Package)

패키지는 ROS2 소프트웨어를 담는 가장 작은 배포 단위입니다. 노드 코드, 런치 파일, 설정 파일 등을 한 폴더에 묶고 이름과 의존성 정보를 package.xml에 적어 둡니다.

  • ros2 run <패키지> <실행파일> 에서 앞의 이름이 패키지 이름입니다.
  • 한 패키지에는 노드가 여러 개 있어도 됩니다.
  • 다른 패키지가 필요하면 package.xml에 의존성으로 적어 둡니다. 예를 들어 std_msgs의 메시지를 쓰는 노드는 std_msgs에 의존합니다.

워크스페이스 (Workspace)

워크스페이스는 여러 패키지의 소스를 모아 한 번에 빌드하는 작업 폴더입니다. 이름은 자유이지만 관례적으로 ros2_ws를 많이 씁니다. 이 교재도 ~/ros2_ws를 씁니다.

아래 파일 트리에서 항목을 눌러 각각의 역할을 확인해 보세요. 회색으로 표시된 폴더는 빌드하면 자동으로 생깁니다.

워크스페이스 루트

패키지 소스와 빌드 결과를 한곳에 모아 둔 폴더입니다. colcon 명령은 항상 이 폴더에서 실행합니다. 이름은 자유이지만 이 교재에서는 ros2_ws를 사용합니다.

소스: 직접 작성하거나 편집하는 항목입니다.

핵심만 표로 다시 묶으면 이렇습니다.

폴더누가 만드나용도
src/사람패키지 소스. 이곳만 직접 편집합니다
build/colcon빌드 중간 산출물
install/colcon실제 실행에 쓰이는 결과물과 setup.bash
log/colcon빌드 로그

OVA의 VM에서 실제 워크스페이스를 열어 보면 이렇습니다.

ls ~/ros2_ws
ls ~/ros2_ws/src
find ~/ros2_ws/src/tiki_slam -type f
colcon list --base-paths ~/ros2_ws/src
VM의 ~/ros2_ws 폴더 목록, src 안의 패키지 두 개, tiki_slam의 파일, colcon list 결과에 번호 표시
  • ① 워크스페이스 루트: 빌드된 상태라 build install log src 네 폴더가 모두 있습니다.
  • ② src/: 패키지 소스는 tiki_navigation과 tiki_slam 두 폴더입니다.
  • ③ 패키지 한 개의 내용: package.xml, CMakeLists.txt, 설정 config/, 런치 launch/
  • ④ colcon list: 패키지 이름, 경로, 빌드 타입(ros.ament_cmake)

언더레이와 오버레이

ROS2 환경은 층(layer) 으로 쌓입니다.

  • 언더레이(underlay): 바닥에 깔린 기본 환경. 보통 /opt/ros/humble에 설치된 ROS2 본체입니다.
  • 오버레이(overlay): 그 위에 덮어 쌓은 내 워크스페이스. 언더레이를 건드리지 않고 패키지를 추가하거나, 같은 이름의 패키지를 대체할 수 있습니다.

환경을 적용하는 것이 source 입니다. 순서는 항상 언더레이 먼저, 오버레이 나중입니다.

source /opt/ros/humble/setup.bash     # 언더레이 (ROS2 본체)
source ~/ros2_ws/install/setup.bash   # 오버레이 (내 워크스페이스)
언더레이와 오버레이2오버레이: ~/ros2_wssource ~/ros2_ws/install/setup.bash내 패키지 추가,같은 이름은 대체1언더레이: /opt/ros/humblesource /opt/ros/humble/setup.bashROS2 본체,건드리지 않음
ROS2 본체(언더레이)를 먼저 source하고 그 위에 내 워크스페이스(오버레이)를 쌓는 순서입니다.

VM의 터미널은 이 두 줄이 이미 적용된 상태로 열립니다. 층이 어떻게 쌓였는지는 AMENT_PREFIX_PATH에서 보입니다.

echo $AMENT_PREFIX_PATH | tr ':' '\n'
ros2 pkg prefix tiki_slam
ros2 pkg prefix turtlesim
ros2 pkg executables turtlesim
AMENT_PREFIX_PATH를 한 줄씩 나눈 결과, tiki_slam과 turtlesim의 위치, turtlesim 실행 파일 목록에 번호 표시
  • ① 오버레이 두 개: ~/ros2_ws/install/ 아래의 tiki_slam, tiki_navigation
  • ② 언더레이 /opt/ros/humble: 목록의 맨 뒤에 있습니다. 앞에 있는 층이 먼저 검색됩니다.
  • ③ ros2 pkg prefix: 패키지가 어느 층에 있는지 알려 줍니다. tiki_slam은 오버레이, turtlesim은 언더레이입니다.
  • ④ ros2 pkg executables: ros2 run turtlesim <실행파일>에 쓸 수 있는 이름 네 개

공식 문서에 따르면 install/ 안에는 setup.bash와 local_setup.bash가 있는데 둘은 이렇게 다릅니다.

  • local_setup.bash: 이 워크스페이스의 패키지만 추가합니다.
  • setup.bash: 이 워크스페이스에 더해, 이전에 source한 환경도 함께 포함합니다.

초보 단계에서는 install/setup.bash를 쓰면 됩니다.

패키지 종류: ament_python과 ament_cmake

패키지는 빌드 타입에 따라 만드는 방식이 다릅니다.

빌드 타입언어설정 파일이 교육에서
ament_pythonPythonsetup.py, setup.cfg사용합니다
ament_cmakeC++ (및 메시지 정의 등)CMakeLists.txt구조만 알아 둡니다

ament_cmake 패키지는 package.xml과 CMakeLists.txt로 구성됩니다. 이 교육은 Python(rclpy)으로 진행하므로 ament_python만 직접 만듭니다. 다만 TIKI-MINI 구동 패키지처럼 다른 사람이 만든 패키지에는 C++ 패키지도 많으니, 두 종류가 있다는 것은 알아 두세요.

Python 패키지의 파일

ros2 pkg create --build-type ament_python my_first_pkg로 만들면 다음 구조가 생깁니다. (위 파일 트리 체험기와 같은 구조입니다.)

my_first_pkg/
├── package.xml            # 패키지 정보와 의존성
├── setup.py               # 설치 방법, 실행 파일 등록(entry_points)
├── setup.cfg              # 실행 파일 설치 위치
├── resource/
│   └── my_first_pkg       # 패키지 표식(빈 파일)
├── my_first_pkg/          # 파이썬 모듈 (코드는 여기에)
│   └── __init__.py
└── test/                  # 코드 스타일 검사 등 테스트

package.xml

패키지의 이름·버전·설명·라이선스·관리자와 의존성을 적는 XML 파일입니다. 의존성 태그 중 자주 쓰는 것은 이 정도입니다.

<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>

VM에 설치된 turtlesim의 package.xml로 각 항목을 확인해 봅니다.

cat /opt/ros/humble/share/turtlesim/package.xml
turtlesim의 package.xml 내용에서 이름, buildtool_depend, depend, build_type에 번호 표시
  • ① name과 version: 패키지 이름과 버전
  • ② buildtool_depend: 빌드에 쓰는 도구. 여기서는 ament_cmake입니다.
  • ③ depend: 빌드와 실행에 모두 필요한 패키지
  • ④ build_type: 빌드 방식. ament_python 패키지라면 이 자리에 ament_python이 적힙니다.

exec_depend는 "실행할 때 필요한 패키지"입니다. ros2 pkg create에 --dependencies rclpy std_msgs 옵션을 주면 이 줄을 자동으로 넣어 주기도 하지만 직접 적어도 됩니다.

setup.py와 entry points

Python 파일을 ros2 run으로 실행하려면 "실행 파일 이름 = 모듈:함수" 형태로 등록해야 합니다. 이 등록 부분이 setup.py의 entry_points입니다.

entry_points={
    'console_scripts': [
        'talker = my_first_pkg.talker:main',
    ],
},

이 한 줄은 다음을 뜻합니다.

  • talker: ros2 run my_first_pkg talker에서 쓰는 실행 파일 이름
  • my_first_pkg.talker: my_first_pkg/talker.py 모듈
  • main: 그 파일 안의 함수

노드 파일을 새로 만들었다면 반드시 여기에 등록하고 다시 빌드해야 합니다. 등록하지 않으면 ros2 run이 실행 파일을 찾지 못합니다.

colcon: 빌드 도구

colcon은 워크스페이스의 모든 패키지를 의존 순서에 맞춰 한 번에 빌드·테스트하는 도구입니다. 항상 워크스페이스 루트(예: ~/ros2_ws)에서 실행합니다. src/ 안에서 실행하면 그 자리에 build/, install/, log/가 생겨 버립니다.

cd ~/ros2_ws
colcon build                                # 모든 패키지 빌드
colcon build --packages-select my_first_pkg # 지정한 패키지만 빌드
colcon build --symlink-install              # Python 소스 수정 시 재빌드 불필요
colcon test                                 # 테스트 실행
colcon test-result --verbose                # 테스트 결과 자세히 보기
옵션의미
--packages-select <이름>지정한 패키지만 빌드합니다. 시간이 줄어듭니다
--packages-up-to <이름>그 패키지와 그것이 의존하는 패키지까지 빌드합니다
--symlink-install파일을 복사하지 않고 링크를 걸어 둡니다. Python 코드를 고쳐도 다시 빌드할 필요가 없습니다
--event-handlers console_direct+로그 파일에만 남던 빌드 출력을 터미널에도 바로 보여 줍니다

--symlink-install은 개발 중에 매우 편리하지만 만능은 아닙니다. 새 파일을 추가하거나 setup.py(entry points)·package.xml을 바꿨다면 다시 빌드해야 합니다.

의존성 설치: rosdep

rosdep은 받아온 패키지에 필요한 시스템 패키지를 한꺼번에 설치해 주는 도구입니다. 워크스페이스 루트에서 다음과 같이 씁니다.

rosdep install -i --from-path src --rosdistro humble -y

모두 설치되어 있으면 All required rosdeps installed successfully가 출력됩니다. 직접 작성한 간단한 패키지에서는 필요 없는 경우가 많지만 다른 사람의 패키지를 src/에 넣었을 때는 꼭 실행하세요.

전체 흐름

src/에 패키지 작성 → colcon build → source install/setup.bash → ros2 run <패키지> <실행파일>

코드를 고치고 다시 실행하는 반복 루프가 바로 이 흐름입니다. 3.7장에서 실제로 해 봅니다.

빌드하고 실행하는 반복 흐름src/에 작성패키지 소스직접 편집하는 곳colcon build워크스페이스 루트에서build/ install/ log/sourceinstall/setup.bash터미널마다ros2 run패키지 이름실행 파일 이름코드를 고치면 다시 빌드--symlink-install이면 Python 소스 수정은 재빌드 불필요
src/에 작성한 패키지를 빌드하고 source한 뒤 실행하는 흐름입니다. 코드를 고치면 다시 빌드 단계로 돌아갑니다.

한눈에 정리

  1. 패키지는 ROS2 소프트웨어의 배포 단위이고 package.xml에 이름과 의존성을 적는다.
  2. 워크스페이스는 src/에 소스를 두고 빌드하면 build/ install/ log/가 생긴다. 직접 편집하는 곳은 src/뿐이다.
  3. ROS2 본체(언더레이) 위에 내 워크스페이스(오버레이)를 쌓는다. source는 언더레이 먼저, 터미널마다 해야 한다.
  4. Python 패키지(ament_python)는 setup.py의 entry_points에 등록해야 ros2 run으로 실행된다.
  5. colcon build는 워크스페이스 루트에서 실행하고 --packages-select와 --symlink-install을 자주 쓴다.

확인 문제

Q1. 새 터미널을 열고 ros2 run my_first_pkg talker를 실행했더니 패키지를 찾을 수 없다고 합니다. 가장 먼저 의심할 것은?

워크스페이스를 source하지 않았을 가능성이 가장 큽니다. source ~/ros2_ws/install/setup.bash를 실행한 뒤 다시 시도합니다. (이미 했다면 빌드가 성공했는지, entry point가 등록되었는지를 확인합니다.)

Q2. colcon build를 ~/ros2_ws/src 안에서 실행하면 어떤 문제가 생기나요?

build/, install/, log/가 src/ 안에 만들어져 워크스페이스 구조가 어긋납니다. colcon은 항상 워크스페이스 루트(~/ros2_ws)에서 실행해야 합니다.

Q3. --symlink-install로 빌드한 뒤 talker.py의 메시지 문장을 고쳤습니다. 다시 빌드해야 할까요? 새 노드 파일을 추가하고 setup.py에 등록했다면요?

문장만 고친 경우에는 다시 빌드하지 않아도 반영됩니다(노드를 다시 실행하면 됩니다). 새 파일을 추가하고 entry_points를 바꾼 경우에는 다시 colcon build가 필요합니다.

다음 장

다음은 3.7장입니다. 이 장의 내용을 바탕으로 워크스페이스에 첫 패키지를 직접 만들고 빌드합니다.