본문 바로가기
카테고리 없음

Docker를 통한 ROS2 Humble 재설치: with CUDA & GUI 환경

by Z0e 2025. 3. 13.

 

 

 

 

 

관련 포스팅

 

 

 

 

 

지난 포스팅 Docker를 통한 ROS2 Humble 설치를 진행하고 나서 재부팅 이후에 `qt.qpa.xcb: could not connect to display` 이슈가 발생했다.

qt.qpa.xcb: could not connect to display :1
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.

 

`export DISPLAY=:0`만으로는 해결이 되지 않았고, 호스트에서 `xhost +local:docker` 명령어로 해결이 되었다.

하지만 또 재부팅을 하면 XServer 통신이 끊어지기 때문에 영구 설정을 따로 해주어야 한다.

Troubleshooting도 할 겸, NVIDIA Container Toolkit으로 GPU도 사용할 수 있는 ROS 2 환경을 구축하기 위해 재설치를 진행하려고 한다.

 

 

 

 

ROS 2 in Docker

 

 

Docker 설치

 

Ubuntu 24.04 도커 Docker 설치하기

관련 포스팅Docker 명령어 모음    Docker Desktop Docker Desktop: The #1 Containerization Tool for Developers | DockerDocker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Ma

sohee-zoe.tistory.com

 

 

NVIDIA Container Toolkit 설치

 

NVIDIA Container Toolkit 설치

관련 포스팅Docker 설치Docker 명령어 모음    NVIDIA Container ToolkitDocker 컨테이너 내에서도 NVIDIA GPU를 사용할 수 있도록 지원하는 도구    Installationcurl -fsSL https://nvidia.github.io/libnvidia-container/gpgk

sohee-zoe.tistory.com

 

 

XServer 통신

host에서 도커가 XServer와 통신할 수 있도록 한다.

xhost +local:docker

 

시스템 재부팅 이후에도 컨테이너의 X11 접근 권한이 영구적이도록 설정한다.

echo 'xhost +local:docker' | sudo tee /etc/profile.d/xhost.sh
sudo chmod +x /etc/profile.d/xhost.sh

 

 

 

ROS 2 Humble Docker

docker pull

docker pull osrf/ros:humble-desktop-full

 

docker rm

만약 컨테이너가 이미 존재한다면 삭제한다. 실행 중이라면 `-f` 옵션을 추가하여 강제로 삭제할 수 있다.

docker ps -a
docker rm {container} -f

 

docker run

docker run \
    --name ros2-humble \
    --hostname humble \
    -itd \
    --restart always \
    --privileged \
    --net host \
    --runtime nvidia \
    --gpus all \
    -e DISPLAY=unix$DISPLAY \
    -e QT_X11_NO_MITSHM=1 \
    -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
    -v $HOME/.Xauthority:/root/.Xauthority:rw \
    -v $HOME/project/ros2/humble/ws:/root/ws \
    -w /root/ws \
    osrf/ros:humble-desktop-full

`-v /tmp/.X11-unix:/tmp/.X11-unix:ro` : host의 XServer를 볼륨 형태로 컨테이너와 공유 (readonly)

`-e DISPLAY=unix$DISPLAY` : DISPLAY 환경변수 전달

 

docker exec

docker exec -it ros2-humble /bin/bash

 

 

 

이제 도커 컨테이너에 접속하여 ROS 2 환경을 구축한다.

Install dependencies packages

apt-get update && \
apt-get install -y \
    build-essential \
    cmake \
    curl \
    git \
    nano \
    neovim \
    wget \
    zsh \
    gazebo \
    libbullet-dev \
    python3-colcon-common-extensions \
    python3-flake8 \
    python3-pip \
    python3-pytest-cov \
    python3-rosdep \
    python3-setuptools \
    python3-vcstool \
    ros-humble-desktop
더보기
# 미들웨어 구현체 (Fast-RTPS, CycloneDDS)
apt-get install -y \
    ros-humble-rmw-fastrtps-cpp \
    ros-humble-rmw-cyclonedds-cpp

# Gazebo 패키지
apt-get install -y \
    ros-humble-gazebo-ros \
    ros-humble-gazebo-ros-pkgs \
    ros-humble-gazebo-ros2-control

# SLAM 패키지
apt-get install -y \
    ros-humble-slam-toolbox

# Cartographer 패키지
apt-get install -y \
    ros-humble-cartographer \
    ros-humble-cartographer-ros
    
# Navigation2 패키지
apt-get install -y \
    ros-humble-navigation2 \
    ros-humble-nav2-bringup 
    
# ROS2 motion planning 프레임워크
apt-get install -y \
    ros-humble-moveit
    
# 로봇 상태 및 TF 관련 패키지
apt-get install -y \
    ros-humble-joint-state-publisher \
    ros-humble-robot-state-publisher \
    ros-humble-rqt-tf-tree \
    ros-humble-xacro

# 로봇 위치 추정 및 제어 관련 패키지
apt-get install -y \
    ros-humble-robot-localization \
    ros-humble-twist-mux

# 데이터 로깅 및 시각화 패키지
apt-get install -y \
    ros-humble-plotjuggler-ros \
    ros-humble-ros2bag \
    ros-humble-rosbag2-storage-default-plugins

# 하드웨어 인터페이스 패키지
apt-get install -y \
    ros-humble-usb-cam

# turtlebot3 로봇 플랫폼 패키지
apt-get install -y \
    ros-humble-turtlebot3 \
    ros-humble-turtlebot3-msgs
  • `build-essential`: 빌드 도구
  • `libbullet-dev`: Bullet 물리 엔진 라이브러리
  • `python3-colcon-common-extensions`, `python3-vcstool`, `python3-rosdep`, `python3-setuptools`: 빌드 도구 colcon, vcstool, rosdep 등을 위한 Python 패키지
  • `python3-flake8`, `python3-pytest-cov`: Python 코드 스타일 체커와 테스트 도구

 

python packages

python3 -m pip install -U \
  argcomplete \
  flake8-blind-except \
  flake8-builtins \
  flake8-class-newline \
  flake8-comprehensions \
  flake8-deprecated \
  flake8-docstrings \
  flake8-import-order \
  flake8-quotes \
  pytest-repeat \
  pytest-rerunfailures \
  pytest

 

C++ Libraries

apt install --no-install-recommends -y \
  libasio-dev \
  libtinyxml2-dev \
  libcunit1-dev

 

pyqt

apt-get install pyqt5-dev-tools
python3 -m pip install --upgrade pip
python3 -m pip install -U \
    catkin_pkg \
    cryptography \
    empy \
    ifcfg \
    lark-parser \
    lxml \
    netifaces \
    numpy \
    opencv-python \
    pyparsing \
    pyyaml \
    setuptools \
    rosdistro
python3 -m pip install -U pydot PyQt5

 

ZSH in Docker

sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.2.1/zsh-in-docker.sh)" -- \
   -t agnoster \
   -p git \
   -p ssh-agent \
   -p virtualenv \
   -p https://github.com/zsh-users/zsh-autosuggestions \
   -p https://github.com/zsh-users/zsh-completions \
   -p https://github.com/zsh-users/zsh-syntax-highlighting
zsh

 

ssh-keygen

ssh-keygen -t rsa

 

docker exec (zsh)

zsh 설치 이후로 컨테이너에 접속 할 때 `/bin/zsh` 으로 접속할 수 있다.

docker exec -it ros2-humble /bin/zsh

 

 

Envirionment setup

echo 'export LC_NUMERIC="en_US.UTF-8"' >> ~/.zshrc
echo "export DISABLE_AUTO_TITLE=true" >> ~/.zshrc
echo "source /opt/ros/humble/setup.zsh" >> ~/.zshrc
echo "source /usr/share/gazebo/setup.sh" >> ~/.zshrc
더보기

`~/.zshrc`

source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.zsh
source /usr/share/vcstool-completion/vcs.zsh
source /usr/share/colcon_cd/function/colcon_cd.sh
export _colcon_cd_root=~/ws

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# export RMW_IMPLEMENTATION=rmw_connext_cpp
# export RMW_IMPLEMENTATION=rmw_gurumdds_cpp

# export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})'
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
export RCUTILS_COLORIZED_OUTPUT=1
export RCUTILS_LOGGING_USE_STDOUT=0
export RCUTILS_LOGGING_BUFFERED_STREAM=1

autoload -U bashcompinit
bashcompinit
eval "$(register-python-argcomplete3 ros2)"
eval "$(register-python-argcomplete3 colcon)"

alias rosdi="rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y"
alias cbuild="colcon build --symlink-install"
alias ssetup="source ~/ws/install/local_setup.zsh"

alias cyclone="export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp"
alias fastdds="export RMW_IMPLEMENTATION=rmw_fastrtps_cpp"

alias killgazebo='killall -9 gazebo & killall -9 gzserver & killall -9 gzclient'

alias cb='cd ~/ws && colcon build --symlink-install'
alias cbs='colcon build --symlink-install'
alias cbp='colcon build --symlink-install --packages-select'
alias cbu='colcon build --symlink-install --packages-up-to'
alias ct='colcon test'
alias ctp='colcon test --packages-select'
alias ctr='colcon test-result'

alias rt='ros2 topic list'
alias re='ros2 topic echo'
alias rn='ros2 node list'

alias testpub='ros2 run demo_nodes_cpp talker'
alias testsub='ros2 run demo_nodes_cpp listener'
alias testpubimg='ros2 run image_tools cam2image'
alias testpubimgshow='ros2 run image_tools cam2image --ros-args -p show_camera:=true'
alias testsubimg='ros2 run image_tools showimage'
source ~/.zshrc

 

 

Test

ROS 컨테이너 2개를 열어 topic subscriber `listener`, topic publisher `talker` 예제를 테스트 해볼 수 있다.

ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_cpp listener

 

 

결론

이제 xhost 설정으로 재부팅 이후에도 RViz2와 같은 GUI 프로그램도 잘 띄워지고, `--runtime nvidia` 옵션으로 인해 CUDA도 사용 가능하다.

nvidia-smi

 

 

 

참고

 

docker에서 컨테이너 gui 실행하기

우분투의 그래픽은 시스템이 아니다. 프로그램이다. 그래서 리눅스 서버버전을 실행하면 gui가 없던 것!! 우분투는 `Xorg`라는 그래픽 프로그램을 이용한다. 즉, 얘가 있어야 그래픽을 띄워줄 수

conservative-vector.tistory.com

 

ubuntu 22.04에 ROS 2 humble 설치 + colcon + Gazebo

ROS 2 humble 설치 이미 너무 좋은 레퍼런스가 있어 첨부하고 후처리 과정만 추가적으로 서술하겠습니다. ubuntu 22.04에 ROS 2 설치1. 리눅스의 로케일을 UTF-8로 설정해 줍니다. 먼저 apt의 업데이트 및

cobang.tistory.com

 

Docker Run \ -이름 ROS2-HUMBLE \ -hostname 겸손 \ -ITD \ -restart Always \ -privileged \ -네트 호스트 \ -런타임 nvidia \ -gpus all \ -e 디스플레이 = unix $ display \ -e qt_x11_no_mitshm = 1 \ -v /tmp/.x11-unix:/tmp/.x11-unix:RO \ -v $ home/.xauthority : /root/.xauthority : rw \ -V $ 홈/프로젝트/ROS2/HUMBLE/WS :/ROT/WS \ -w /root /ws \ OSRF/ROS : 겸손한 Desktop-full