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