macOS에서 Docker로 ROS 개발 환경 구축하기

0

Docker로 ROS를 구축하면 macOS에서 깔끔하고 효율적인 개발 환경을 마련할 수 있다. 이 글은 Docker 설치, ROS 이미지 받기 및 실행, GUI 지원을 위한 XQuartz 설정, X11 포워딩으로 컨테이너 실행 방법을 설명한다. 다음 단계들을 따르면 macOS 터미널에서 rviz, rqt 같은 ROS 도구들을 매끄럽게 실행할 수 있다.

macOS의 Docker

Docker는 Linux 애플리케이션을 실행하기 위한 격리된 환경을 제공하므로, macOS에서 ROS를 개발하기에 이상적인 선택이다. macOS는 Linux 컨테이너를 기본으로 지원하지 않으므로, Docker는 백그라운드에서 경량 Linux 가상 머신을 실행한다.

Docker 설치

  1. Docker Desktop for Mac을 다운로드하여 설치한다.
  2. 또는 brew로 Docker를 설치할 수 있다.
    brew install --cask docker
    
  3. Docker를 열고 실행 중인지 확인한다.

ROS Docker 이미지 받기

Docker를 설치한 후, 다음 단계는 ROS 이미지를 받아 컨테이너를 실행하는 것이다. 공식 Docker 이미지는 Docker Hub나,

Docker Desktop에서 찾을 수 있다.

나는 ROS noetic 이미지(Ubuntu 20.04용)를 선택하여 실행했다.

docker pull ros:noetic-ros-core

사전 설치된 도구가 더 많은 ROS 이미지를 받고 싶다면, 이미지 크기를 확인하여 ros:noetic-robot이나 ros:noetic-perception 같은 더 큰 것을 선택하면 된다.

ROS 컨테이너 실행

ROS Docker 컨테이너를 생성하고 접속하려면 다음을 실행한다되.

docker run -it ros:noetic /bin/bash

또한 컨테이너의 새 터미널을 열고 싶다면 다음을 사용한다.

docker exec -it [container name] /bin/bash

기타 기본적인 Docker 명령은 다음과 같다.

# Show the available images
docker images

# Show the history of an image
docker history [image name]

# Show the running containers
docker ps

# Show all containers
docker ps -a

# Execute a command in a running container
docker exec [container name] [command]

# Create a new image from the changed container
docker commit -m [description] [container name] [image repository]:[tag]

ROS 설치를 따라 ROS 패키지를 설치한 후, rqt_graph를 실행하면, 아래 스크린샷과 같은 오류가 발생할 수 있다.

컨테이너는 격리된 환경이므로 호스트 시스템의 디스플레이 서버에 직접 접근할 수 없다. 따라서 GUI 애플리케이션(rvizrqt 등)은 호스트와 클라이언트 기기 사이의 다리 역할을 하는 X server 없이는 동작하지 않는다. GUI를 지원하려면 X server, 구체적으로 macOS에서는 XQuartz를 설정해야 한다.

X server (XQuartz) 설치

ROS 도구는 그래픽 애플리케이션을 위해 X11에 의존하므로, macOS용 X server 실행 프로그램인 XQuartz를 설치하고 설정해야 한다.

  1. XQuartz를 다운로드하여 설치하거나, brew를 사용한다.
    brew install --cask xquartz
    
  2. 설치 후 컴퓨터를 재시작한다.
  3. XQuartz를 열고 Preferences → Security 로 이동한다.
  4. Allow connections from network clients 를 체크한다.

X server 설정으로 Docker 실행

Docker 컨테이너가 X server를 사용할 수 있게 하려면 다음이 필요하다.

  • xhost를 이용해 연결을 허용한다.
  • 컨테이너를 시작할 때 환경 변수를 전달한다.

다음은 GUI를 지원하는 ROS 컨테이너를 실행하는 스크립트다.

# run_docker.sh
#!/bin/bash
PS_NAME=sangillee

xhost + # allow any host to connect to the X server
xhost + $(hostname) # specifically allow the local machine to connect
export HOSTNAME=$(hostname)

docker stop $PS_NAME 2>/dev/null # stop container with the same name to prevent conflict
docker rm $PS_NAME 2>/dev/null # remove the container with the same name

docker run \
    --name $PS_NAME \
    -e QT_X11_NO_MITSHM=1 \
    -e DISPLAY=host.docker.internal:0 \
    --hostname $(hostname) \
    --network host \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -it $1 /bin/bash

주요 옵션 설명

  • -e QT_X11_NO_MITSHM=1: 컨테이너에 공유 메모리를 사용하지 않는다.
  • -e DISPLAY=host.docker.internal:0: 디스플레이 환경 변수를 컨테이너에 전달한다.
  • -v /tmp/.X11-unix:/tmp/.X11-unix: 통신을 위해 X11 소켓을 마운트한다.
  • --network host: 더 나은 성능과 연결성을 위해 호스트 네트워크를 사용한다.

이제 컨테이너 안에서 ROS GUI 애플리케이션 rqt_graph를 실행할 수 있다.

결론

Docker와 XQuartz를 사용하면 macOS에서 완전한 GUI 지원과 함께 ROS를 실행할 수 있다. 이 접근법은 시스템을 수정하지 않고도 깔끔한 개발 환경을 마련할 수 있게 한다.