2025年7月3日 星期四

ROS2 +GZ+RVIZ2 完整的 Docker 範本

 這裡是一個 完整的 Docker 範本

用於建立 ROS 2 Humble + Gazebo Classic 11 + RViz2 的開發環境(包含 GUI 支援),

適合你要開發機器人、模擬與視覺化。


✅ 環境設定總覽

組件版本
ROS 2Humble
GazeboClassic v11
RVizRViz2(跟 ROS 2 一起)
Ubuntu22.04
GUI 支援X11(含 xhost 配置)
編譯工具colcon, vcstool, rosdep, xacro, check_urdf, gazebo_ros

📁 建立資料夾結構

bash
mkdir -p ros2_gz_docker_ws cd ros2_gz_docker_ws touch Dockerfile docker-compose.yml .dockerignore

🐳 Dockerfile:建立 ROS2+Gazebo 環境

Dockerfile
FROM ros:humble ENV DEBIAN_FRONTEND=noninteractive # Install common dev tools + GUI + Gazebo Classic RUN apt update && apt install -y \ build-essential \ python3-colcon-common-extensions \ python3-vcstool \ python3-rosdep \ python3-pip \ gazebo11 \ ros-humble-gazebo-ros-pkgs \ x11-apps \ liburdfdom-tools \ ros-humble-xacro \ && rm -rf /var/lib/apt/lists/* # Initialize rosdep RUN rosdep init || true RUN rosdep update # Create workspace RUN mkdir -p /root/ros2_ws/src WORKDIR /root/ros2_ws # Source ROS 2 SHELL ["/bin/bash", "-c"] RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc # Default entrypoint CMD ["bash"]

📦 docker-compose.yml(支援 X11 顯示 RViz/Gazebo)

yaml
version: '3.8' services: ros2dev: build: . container_name: ros2_humble_gz environment: - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - ./src:/root/ros2_ws/src:rw network_mode: host privileged: true stdin_open: true tty: true

🔒 .dockerignore

dockerignore
*.log *.pyc __pycache__/ build/ install/

🚀 啟動步驟

  1. 允許 GUI 分享:

    bash
    xhost +local:root
  2. 建立與啟動容器:

    bash
    docker compose up --build
  3. 進入容器內建套件:

    bash
    colcon build source install/setup.bash ros2 launch your_pkg your_launch_file.py

🧪 測試指令

在容器中執行:

bash
rviz2 # 測試 RViz GUI gazebo # 測試 Gazebo GUI ros2 run demo_nodes_cpp talker ros2 run demo_nodes_cpp listener

🛠️ 可選:加入你自己的 ROS2 專案

放入 src/,然後重新 colcon build 即可,例如:

bash
cd /root/ros2_ws ros2 pkg create my_robot_pkg --build-type ament_python --dependencies rclpy colcon build

🧼 離開時清除

bash
docker compose down xhost -local:root

📁 補充:可安裝其他工具

  • ros-humble-joint-state-publisher-gui

  • ros-humble-rqt-*

  • ros-humble-robot-state-publisher

加進 apt install 區塊即可。


是否需要我也幫你做一個簡單的 roscar4wheel 測試用套件、含 Gazebo+RViz launch?可作為進一步測試。


下面把 「ROS 2 Humble + Gazebo Classic + RViz2」的 Docker 範本 再升級,讓容器可以直接吃到 主機的 GPU(OpenGL/Vulkan 加速)。以下以 NVIDIA GPU 為主要示範,AMD/Intel 在最後也附上簡化做法。

0 ️⃣ 先決條件(主機端)

事項指令 / 文件
NVIDIA 驅動(≥ 470.xx)已安裝在主機nvidia-smi
NVIDIA Container Toolkit 安裝好https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
Docker CLI ≥ 20.10docker --version
X11 正在跑本機(Wayland 需開 XWayland 或改用 XVFB/VNC)echo $DISPLAY
安裝 Container Toolkit 後,Docker 會有 nvidia runtime,可用 --gpus all 啟用。

1 ️⃣ .dockerignore(同前)

dockerignore
*.log *.pyc __pycache__/ build/ install/

2 ️⃣ Dockerfile(加入 GL/Vulkan 依賴)

Dockerfile
FROM ros:humble ENV DEBIAN_FRONTEND=noninteractive SHELL ["/bin/bash", "-c"] # 1) 系統&編譯工具 + Gazebo + 常用 ROS 工具 RUN apt update && apt install -y \ build-essential \ python3-colcon-common-extensions \ python3-vcstool \ python3-rosdep \ python3-pip \ gazebo \ ros-humble-gazebo-ros-pkgs \ liburdfdom-tools \ ros-humble-xacro \ mesa-utils \ && rm -rf /var/lib/apt/lists/* # 2) 初始化 rosdep RUN rosdep init || true && rosdep update # 3) 建立工作區 RUN mkdir -p /root/ros2_ws/src WORKDIR /root/ros2_ws # 4) 預載 ROS 環境 RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc CMD ["bash"]

不用把 NVIDIA 驅動裝進映像檔——nvidia‑docker 會自動把主機驅動與 OpenGL/Vulkan .so 掛進容器。


3 ️⃣ docker-compose.yml(核心:--gpus all + X11 & CUDA env)

yaml
version: "3.8" services: ros2dev: build: . container_name: ros2_humble_gz_gpu # ---------- GPU ---------- deploy: resources: reservations: devices: - capabilities: [gpu] # 若不支援 compose 的 deploy,亦可在 CLI: `docker compose --profile=gpu up --build` runtime: nvidia environment: - NVIDIA_VISIBLE_DEVICES=all # 或 "0,1" 指定 GPU - NVIDIA_DRIVER_CAPABILITIES=graphics,utility,video,compute - DISPLAY=${DISPLAY} - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - ./src:/root/ros2_ws/src:rw network_mode: host privileged: true stdin_open: true tty: true

如果不用 docker‑compose

bash
docker build -t ros2_humble_gz_gpu . xhost +local:root docker run --gpus all -it \ --env DISPLAY=$DISPLAY \ --env QT_X11_NO_MITSHM=1 \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v $(pwd)/src:/root/ros2_ws/src \ --network host \ --privileged \ --name ros2_humble_gz_gpu \ ros2_humble_gz_gpu

4 ️⃣ 啟動與測試

bash
# 啟動(compose) xhost +local:root docker compose up --build # 或 CLI 版,見上段 # 容器內測試 GPU glxinfo | grep "OpenGL renderer" # 應顯示你的 NVIDIA GPU 名稱 glxgears # 看到齒輪跑起來即成功 # Gazebo & RViz2 gazebo # 應開啟 Gazebo GUI,FPS > 60 (依硬體) rviz2 # RViz2 正常顯示

5 ️⃣ 將工作區與 GUI 整合

  1. 把你的 ROS2 套件放到 宿主機 src/,會自動同步進容器 /root/ros2_ws/src

  2. 容器內執行:

    bash
    cd /root/ros2_ws rosdep install --from-paths src -ir colcon build --symlink-install source install/setup.bash
  3. 啟動你的 launch:

    bash
    ros2 launch roscar4wheel bringup_gz.launch.py gui:=true

6 ️⃣ AMD / Intel GPU 小抄

  • Mesa OpenGL 基本上已包含在映像檔,主機要啟用 --device=/dev/dri

    bash
    docker run -it \ --device /dev/dri:/dev/dri \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ ros2_humble_gz_gpu
  • 若用 Wayland → 開 xhost +si:localuser:root + QT_QPA_PLATFORM=wayland/XWayland 。


常見問題速解

症狀解法
Gazebo 黑畫面 / RViz 閃退確定 glxinfo 已顯示 GPU;若無,多半是 xhost 或 NVIDIA runtime 未正確安裝
libGL 找不到升級驅動或重新安裝 NVIDIA Container Toolkit
FPS 很低檢查 Docker 沒跑在 --cap-add=SYS_PTRACE 之類 sandbox,必要時關 vblank

現在你有了 GPU 加速 的 ROS 2 + Gazebo Classic + RViz2 Docker 環境!
如要加入 ros_gz_bridge、Gazebo Sim Ignition 或 CUDA pytorch 等,只要在 Dockerfile 補裝對應套件並保持 --gpus all 即可。

沒有留言:

張貼留言