Docker로 ROS 2 개발 입문하기
Docker로 ROS 2 개발 입문하기
이 가이드는 Docker를 사용해 ROS 2 어플리케이션을 컨테이너화하는 방법을 상세히 설명해요.
출처: 문서
본문
감사의 말: 이 가이드는 커뮤니티 기여예요. Docker는 이 가이드에 기여한 Shakirth Anisha 님께 감사를 전해요.
ROS 2 는 로봇 어플리케이션을 구축하기 위한 소프트웨어 라이브러리와 도구의 집합이에요. 분산 노드 간의 실시간 안전한 통신을 위해 DDS(Data Distribution Service)를 사용하므로, 로봇 공학과 자율 시스템에 이상적이에요.
무엇을 배울까요?
이 가이드에서 배울 내용:
- Docker Hub의 공식 ROS 2 베이스 이미지 사용하기
- Ubuntu 컨테이너에서 ROS 2 실행하기
- ROS 2 패키지와 의존성 설치하기
- 로컬 개발용 개발 컨테이너 설정하기
- Turtlesim으로 완전한 엔드투엔드 예제 실행하기
사전 요구사항
시작하기 전에 다음에 익숙한지 확인해주세요:
- Docker Desktop : Docker Desktop이 설치되고 실행 중이어야 해요.
- Docker 개념 : 이미지와 컨테이너 같은 핵심 Docker 개념을 이해해야 해요.
- ROS 2 개념 : 노드, 패키지, 토픽, 서비스 같은 개념에 대한 기본 이해.
다음은 무엇인가요?
Docker와 dev 컨테이너를 사용해 ROS 2 개발 환경을 설정하는 것부터 시작해요.
컨테이너에서 ROS 2 실행하기
개요
이 섹션에서는 공식 ROS 2 이미지를 사용해 격리된 Docker 컨테이너에서 ROS 2를 실행하고, ROS 2가 작동하는지 확인하며, 개발·테스트를 위한 추가 ROS 2 패키지를 설치해요.
컨테이너에서 ROS 2 실행
ROS 2를 시작하는 가장 빠른 방법은 공식 Docker 이미지 를 사용하는 거예요. 이미지를 내려받고, 컨테이너를 시작하고, 대화형 bash 셸을 열려면:
공식 ROS 2 Docker 이미지를 내려받아 실행해주세요:
$ docker run -it ros:humble
이 가이드는 Humble 배포판을 사용해요. humble 을 rolling , jazzy , iron 같은 다른 지원 배포판으로 바꿀 수 있어요.
참고: 이 환경은 임시적이며 영속성을 유지하지 않아요. 만든 파일이나 설치한 패키지는 컨테이너가 중지되거나 제거되면 모두 삭제돼요.
ROS 2가 작동하는지 확인해주세요:
$ echo $ROS_DISTRO
다음 같은 출력이 보여야 해요:
humble
ROS 2 패키지 설치
공식 ROS 2 이미지에는 핵심 패키지가 포함돼 있어요. 추가 패키지를 설치하려면 apt 패키지 관리자를 사용해주세요:
패키지 관리자를 업데이트해주세요:
$ sudo apt update
원하는 패키지를 설치해주세요:
$ sudo apt install $PACKAGE_NAME
$PACKAGE_NAME 을 설치하려는 패키지로 바꿔주세요. 흔히 사용되는 패키지로는:
- ros-humble-turtlesim - 시각화·시뮬레이션 도구
- ros-humble-rviz2 - 3D 시각화 도구
- ros-humble-rqt - Qt 기반 ROS 그래픽 도구
- ros-humble-demo-nodes-cpp - C++ 데모 노드
- ros-humble-demo-nodes-py - Python 데모 노드
- ros-humble-colcon-common-extensions - 빌드 시스템 확장
요약
이 섹션에서 공식 ROS 2 Docker 이미지를 내려받고 대화형 세션을 시작했으며, apt로 추가 ROS 2 패키지를 설치해 컨테이너의 기능을 확장했어요.
다음 단계
다음 섹션에서는 세션 간에 코드와 수정 사항이 저장되도록 영구 워크스페이스를 구성할 거예요.
ROS 2 워크스페이스 빌드 및 개발
개요
이 섹션에서는 Docker와 개발 컨테이너를 사용해 ROS 2 워크스페이스를 설정하고, 워크스페이스 레이아웃을 검토하며, Visual Studio Code에서 워크스페이스를 열고 컨테이너 안에서 ROS 2 프로젝트를 편집·빌드해요.
샘플 ROS 2 워크스페이스 가져오기
일관된 워크스페이스는 여러 배포판에서 ROS 2 프로젝트와 빌드 아티팩트를 관리하는 것을 단순화해요.
터미널을 열고 샘플 워크스페이스 리포지토리를 클론해주세요:
$ git clone https://github.com/shakirth-anisha/docker-ros2-workspace.git
$ cd docker-ros2-workspace
이후로 Linux 사용자는 ws_linux 폴더를, macOS 사용자는 ws_mac 을 사용할 수 있어요.
워크스페이스 구조를 확인해주세요:
ws_linux/
├── compose.yml
├── Dockerfile
└── src/
├── package1/
└── package2/
ws_mac/
├── compose.yml
├── Dockerfile
└── src/
├── package1/
└── package2/
워크스페이스 레이아웃 탐구
- compose.yml : Docker Compose가 ROS 2 컨테이너를 빌드·실행하는 방법을 정의하며, 마운트, 환경 변수, 네트워킹 설정을 포함해요.
- Dockerfile : ROS 2 개발 이미지를 빌드해요. 공식 ROS 2 베이스 이미지를 사용하고, 비루트 개발 사용자를 만들며, 필요한 시스템 및 ROS 2 의존성을 설치해요.
- src : 모든 ROS 2 패키지를 포함해요. 이 디렉터리는 활성 워크스페이스로 컨테이너에 마운트돼요.
컨테이너 열기 및 빌드
다음 명령을 실행해 컨테이너를 빌드하고 시작해주세요:
Linux의 경우:
$ cd ws_linux
$ docker compose up -d
$ docker compose exec ros2 /bin/bash
macOS의 경우:
$ cd ws_mac
$ docker compose up -d
$ docker compose exec ros2 /bin/bash
이 명령은 Dockerfile 에 정의된 Docker 이미지를 빌드하고 백그라운드에서 컨테이너를 시작해요.
참고: 첫 실행 시 CLI가 베이스 ROS 2 이미지를 내려받고 필요한 의존성을 설치하므로 이미지 빌드에 몇 분이 걸릴 수 있어요. 이후 시작은 훨씬 빨라져요.
컨테이너가 실행되면 exec 를 사용해 안에서 명령을 실행해주세요:
$ docker compose exec ros2 /bin/bash
컨테이너 터미널 안에서 환경을 확인해주세요:
$ echo $ROS_VERSION
$ which colcon
모든 명령이 컨테이너 안에서 성공적으로 실행되어야 해요.
ROS 2 배포판 전환
Dockerfile 의 베이스 이미지를 humble 에서 rolling , jazzy , iron 같은 다른 배포판으로 업데이트해주세요.
요약
이 섹션에서 구조화된 워크스페이스를 만들고, 개발 도구가 포함된 Dockerfile을 작성하고, Docker Compose 설정을 구성하는 방법을 배웠어요. 이제 내 ROS 2 개발 환경이 어떤 머신에서도 일관되고 재현 가능한 설정으로 준비됐어요.
다음 단계
다음 섹션에서 Turtlesim으로 완전한 엔드투엔드 예제를 실행할 거예요.
Turtlesim으로 완전한 예제 실행하기
개요
Turtlesim은 노드, 토픽, 서비스 같은 기본 ROS 2 개념을 보여주는 간단한 시뮬레이션 도구예요. 이 섹션에서는 Turtlesim으로 완전한 예제를 실행하고, 거북이를 제어하며, 토픽을 모니터링하고, rqt로 시스템을 시각화해요.
디스플레이 포워딩 구성
Linux
Docker가 내 X 서버에 접근하도록 허용해주세요:
$ xhost +local:docker
macOS
macOS에서는 XQuartz를 사용해 X11 지원을 제공해요. Homebrew로 XQuartz를 설치하세요:
$ brew install --cask xquartz
Applications에서 XQuartz를 열고 Preferences > Security 로 이동해 Allow connections from network clients 를 활성화해주세요. 변경 사항이 적용되도록 컴퓨터를 재시작해주세요.
재부팅 후 터미널을 열고 로컬 연결을 허용해주세요:
$ defaults write org.xquartz.X11 nolisten_tcp -bool false
$ xhost +localhost
$ xhost + 127.0.0.1
컨테이너 시작
워크스페이스 섹션과 같은 Docker Compose 설정으로 컨테이너를 시작해주세요.
Linux의 경우:
$ cd ws_linux
$ docker compose up -d
$ docker compose exec ros2 /bin/bash
macOS의 경우:
$ cd ws_mac
$ docker compose up -d
$ docker compose exec ros2 /bin/bash
Turtlesim 설치 및 실행
컨테이너 안에서 Turtlesim 패키지를 설치해주세요:
패키지 관리자를 업데이트해주세요:
$ sudo apt update
Turtlesim 패키지를 설치해주세요:
$ sudo apt install -y ros-humble-turtlesim
Turtlesim 노드를 실행해주세요:
$ ros2 run turtlesim turtlesim_node
그리드에 거북이가 있는 창이 내 데스크톱에 나타나야 해요.
거북이 제어
새 터미널을 열고 같은 컨테이너에 연결한 다음 키보드 텔레옵 노드를 시작해주세요:
$ ros2 run turtlesim turtle_teleop_key
이 노드는 키보드로 거북이를 제어할 수 있게 해줘요. 화살표 키를 사용해 거북이를 앞, 뒤, 왼쪽, 오른쪽으로 움직이세요. Ctrl+C 를 눌러 텔레옵 노드를 중지하세요.
거북이를 창 주위로 움직여보세요. 움직이면서 경로를 그리는 것을 볼 수 있을 거예요.
토픽 모니터링
또 다른 터미널을 열고 같은 컨테이너에 연결한 다음 모든 활성 토픽을 나열해주세요:
$ ros2 topic list
다음 같은 출력이 보여야 해요:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
특정 토픽에 대한 정보를 얻으려면:
$ ros2 topic info /turtle1/pose
토픽 타입과 어떤 노드가 게시·구독하는지 볼 수 있어요.
rqt로 시스템 시각화
또 다른 터미널을 열고 같은 컨테이너에 연결한 다음 패키지 관리자를 업데이트해주세요:
$ sudo apt update
rqt를 설치해주세요:
$ sudo apt install -y 'ros-humble-rqt*'
rqt를 시작해주세요:
$ ros2 run rqt_gui rqt_gui
rqt 창이 나타나야 해요. rqt는 ROS 2 시스템을 시각화·모니터링하는 여러 유용한 플러그인을 제공해요.
Node Graph
Plugins > Introspection > Node Graph 로 이동해 노드 그래프를 탐구할 수 있어요. 노드와 토픽이 선으로 연결된 모습을 보여주는 새 탭이 열려요. 이 시각화는 텔레옵 노드가 Turtlesim 노드에 속도 명령을 보내고, Turtlesim 노드가 토픽을 통해 위치 데이터를 다시 게시하는 방법을 보여줘요.
Topic Monitor
Plugins > Topics > Topic Monitor 로 이동해 활성 토픽을 모니터링할 수 있어요. 모든 활성 토픽과 그 현재 값을 표시하는 새 탭이 열려요. /turtle1/pose 옆의 눈 아이콘을 선택해 모니터링하세요. 거북이를 움직이면 내 명령에 따라 위치와 방향이 변하는 pose 값이 실시간으로 업데이트되는 것을 볼 수 있어요.
Service Caller
Plugins > Services > Service Caller 를 사용해 rqt에서 서비스를 호출할 수 있어요. /turtle1/teleport_absolute 같은 서비스를 선택하고 요청 필드에 값을 입력한 다음 Call 을 선택해 요청을 보내주세요.
Plots
시간에 따른 토픽 데이터를 그리려면 Plugins > Visualization > Plot 으로 이동하세요. 예를 들어 Plot 창에서 Topic 필드에 /turtle1/pose/x 를 입력하고 Enter를 누르세요. 거북이를 움직이면 X 위치가 시간에 따른 그래프로 표시되는 것을 볼 수 있어요.
ROS 2 서비스 호출
Turtlesim은 거북이 위치 재배치와 경로 지우기 같은 동작을 위한 서비스를 제공해요.
사용 가능한 서비스를 나열해주세요:
$ ros2 service list
다음 같은 서비스가 보여야 해요: /turtle1/set_pen (펜 색상과 너비 변경), /turtle1/teleport_absolute (거북이를 특정 위치로 이동), /turtle1/teleport_relative (거북이를 현재 위치 기준으로 이동).
거북이를 새 위치로 텔레포트해주세요:
$ ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 1.0, y: 3.0, theta: 0.0}"
거북이가 지정된 위치 (1.0, 3.0) 로 즉시 이동해야 해요.
간단한 게시자 만들기
거북이를 프로그래밍 방식으로 제어하는 속도 명령을 게시하는 Python 스크립트를 만들어주세요. 새 터미널에서 move_turtle.py 라는 파일을 만들어주세요:
import rclpy
from geometry_msgs.msg import Twist
import time
def main():
rclpy.init()
node = rclpy.create_node('turtle_mover')
publisher = node.create_publisher(Twist, 'turtle1/cmd_vel', 10)
# Create a twist message
msg = Twist()
msg.linear.x = 2.0 # Move forward at 2 m/s
msg.angular.z = 1.0 # Rotate at 1 rad/s
# Publish the message
for i in range(50):
publisher.publish(msg)
time.sleep(0.1)
# Stop the turtle
msg.linear.x = 0.0
msg.angular.z = 0.0
publisher.publish(msg)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
스크립트를 실행해주세요:
$ python3 move_turtle.py
거북이가 5초 동안 원형 운동으로 움직인 후 멈춰야 해요.
요약
이 섹션에서 디스플레이 포워딩을 구성하고, Turtlesim 노드를 사용하고, 노드와 토픽을 검사하며, rqt로 시스템을 시각화했어요. 마지막으로 ROS 2 서비스와 상호작용하고 거북이를 프로그래밍 방식으로 움직이는 간단한 게시자를 만들었어요.
이 기본 개념들은 실제 센서와 액추에이터가 있는 실제 로봇 어플리케이션에 직접 적용돼요.
관련 리소스
- ROS 2 Turtlesim 튜토리얼
- ROS 2 개념
- Geometry Messages
더 알아보기 (Learn more)
- ROS 2
- Docker 개발 컨테이너
- Turtlesim