관련 포스팅
지난 포스팅 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 환경을 구축하기 위해 재설치를 진행하려고 한다.
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도 사용 가능하다.
참고
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