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
- ① 워크스페이스 루트: 빌드된 상태라
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 # 오버레이 (내 워크스페이스)
VM의 터미널은 이 두 줄이 이미 적용된 상태로 열립니다. 층이 어떻게 쌓였는지는 AMENT_PREFIX_PATH에서 보입니다.
echo $AMENT_PREFIX_PATH | tr ':' '\n'
ros2 pkg prefix tiki_slam
ros2 pkg prefix turtlesim
ros2 pkg executables 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_python | Python | setup.py, setup.cfg | 사용합니다 |
ament_cmake | C++ (및 메시지 정의 등) | 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
- ①
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장에서 실제로 해 봅니다.
한눈에 정리
- 패키지는 ROS2 소프트웨어의 배포 단위이고
package.xml에 이름과 의존성을 적는다. - 워크스페이스는
src/에 소스를 두고 빌드하면build/ install/ log/가 생긴다. 직접 편집하는 곳은src/뿐이다. - ROS2 본체(언더레이) 위에 내 워크스페이스(오버레이)를 쌓는다.
source는 언더레이 먼저, 터미널마다 해야 한다. - Python 패키지(
ament_python)는setup.py의entry_points에 등록해야ros2 run으로 실행된다. 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장입니다. 이 장의 내용을 바탕으로 워크스페이스에 첫 패키지를 직접 만들고 빌드합니다.