本文最后更新于:2025年12月11日 下午
Gazebo 是一个功能强大的开源三维机器人仿真器,本文记录安装测试过程。
简介
Gazebo 是一个功能强大的开源三维机器人仿真器。它允许您在逼真、物理属性准确的虚拟世界中开发、测试和验证机器人算法,而无需依赖实体机器人。它与ROS有着深度的集成,是机器人研究和开发领域的标准工具之一。
版本信息
针对 Ubuntu 操作系统, 整理自 https://gazebosim.org/docs/latest/getstarted/ 和 https://gazebosim.org/docs/harmonic/ros_installation/
Gazebo 版本
ROS 版本
Ubuntu 版本
Gazebo 支持时间
Gazebo Jetty (LTS)
ROS 2 Rolling
Ubuntu 24.04 Noble
2025.9 - 2030.9
Gazebo Harmonic (LTS)
ROS 2 Jazzy (LTS)
Ubuntu 24.04 Noble
2023.9 - 2028.9
Gazebo Fortress (LTS)
ROS 2 Humble (LTS)
Ubuntu 22.04 Jammy
2021.9 - 2026.9
安装
我尝试在 Ubuntu 22 下 Docker 安装 Gazebo Harmonic LTS, 对应 ROS 2 Jazzy 和 Ubuntu 24.04 Nobel
官方镜像拉取
可选方案为 jazzy-simulation 或者 jazzy-desktop-full-noble 再安装 gazebo,这里选择拉取 jazzy-desktop-full-noble
1 2 3 4 5 6 7 8 docker pull osrf/ros:jazzy-simulation docker pull osrf/ros:jazzy-desktop-full docker pull osrf/ros:jazzy-desktop-full-noble
镜像大小 ( 2025.12.11)
1 2 3 4 REPOSITORY TAG IMAGE ID CREATED SIZEosrf /ros jazzy-desktop-full 28 eebd242e2b 3 weeks ago 4 .57 GBosrf /ros jazzy-desktop-full-noble 28 eebd242e2b 3 weeks ago 4 .57 GBosrf /ros jazzy-simulation 538 ba2204611 3 weeks ago 2 .4 GB
宿主机图形界面配置
在宿主机终端执行以下命令,允许容器连接图形界面:
1 2 3 4 5 6 7 8 9 cd ~/ros2_gazebo_docker xhost +local :touch /tmp/.docker.xauth xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge
镜像 / 容器构建
创建文件结构:
1 2 3 4 ros2_gazebo_docker/ ├── Dockerfile # 构建自定义镜像 ├── docker-compose.yml # 定义和运行容器服务 └── src/ # 用于挂载你的ROS工作空间代码
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 FROM osrf/ros:jazzy-desktop-full-nobleENV DEBIAN_FRONTEND=noninteractiveRUN apt-get update && \ apt-get install -y --no-install-recommends \ ros-jazzy-ros-gz \ ros-jazzy-ros2-control \ ros-jazzy-ros2-controllers \ ros-jazzy-gz-ros2-control \ git \ vim \ wget \ && rm -rf /var/lib/apt/lists/*RUN echo "source /opt/ros/jazzy/setup.bash" >> /home/ubuntu/.bashrc
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 services: ros2_gz_sim: build: . image: my_ros2_gz_sim:1.0.0 container_name: ros2_gz_sim_compose network_mode: host environment: - DISPLAY=${DISPLAY} - XAUTHORITY=/tmp/.docker.xauth - XDG_RUNTIME_DIR=/tmp/runtime-$USER - NVIDIA_VISIBLE_DEVICES=all - NVIDIA_DRIVER_CAPABILITIES=all volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - /tmp/.docker.xauth:/tmp/.docker.xauth:rw - ./src:/home/${USER:-YOUR_HOST_USERNAME} /workspace/src:rw user: "${UID:-1000} :${GID:-1000} " stdin_open: true tty : true command : bash -c "source /opt/ros/jazzy/setup.bash && exec bash"
构建镜像,执行:
成功后得到镜像:
1 2 3 REPOSITORY TAG IMAGE ID CREATED SIZEros2_gazebo_docker -ros2_gz_sim latest b2b505ea54fd 6 seconds ago 4 .66 GB
构建容器:
成功后容器运行:
1 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES655824e0d3d3 ros2_gazebo_docker-ros2_gz_sim "/ros_entrypoint.sh …" 9 minutes ago Up 9 minutes ros2_gz_sim_compose
基础测试
1 docker exec -it ros2_gz_sim_compose bash
1 bash -c "source /opt/ros/jazzy/setup.bash && exec bash"
测试 Gazebo Harmonic 是否安装成功
成功输出:
1 2 3 Gazebo Sim, version 8 .9 .0 Copyright (C) 2018 Open Source Robotics Foundation.Released under the Apache 2 .0 License.
启动 Gazebo 世界测试
弹出图形界面:
Empty:
NAO
测试 ROS 2 环境
正常输出:
1 2 3 4 5 6 $ ros2 doctor/opt/ ros/jazzy/ lib/python3.12/ site-packages/ros2doctor/ api/__init__.py: 122 : UserWarning: Fail to call PackageCheck class functions./opt/ ros/jazzy/ lib/python3.12/ site-packages/ros2doctor/ api/__init__.py: 122 : UserWarning: Fail to call PlatformCheck class functions. All 3 checks passed
出现 All 3 checks passed 说明 ROS 2 Jazzy 环境在核心层面是健康的。
RViz2 实例启动测试
测试 ROS 2 核心通信
1 2 3 ros2 run demo_nodes_cpp talker ros2 run demo_nodes_cpp listener
正常情况下 listener 可以接受到消息
测试 Gazebo 启动与 ROS 桥接
在第一个终端运行:
1 gz sim -r visualize_lidar.sdf
此时可以在第二个终端查看 gz 内部发布的话题
正常输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 $ gz topic -l /clock /gazebo/resource_paths /gui/camera/pose /gui/currently_tracked /gui/track /lidar /lidar/points /lidar2 /lidar2/points /model/vehicle_blue/odometry /model/vehicle_blue/tf /sensors/marker /stats /world/visualize_lidar_world/clock /world/visualize_lidar_world/dynamic_pose/info /world/visualize_lidar_world/pose/info /world/visualize_lidar_world/scene/deletion /world/visualize_lidar_world/scene/info /world/visualize_lidar_world/state /world/visualize_lidar_world/stats /model/vehicle_blue/cmd_vel /model/vehicle_blue/enable
启动桥接 ,这里我们以 /clock 话题为例
1 ros2 run ros_gz_bridge parameter_bridge /clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock
命令中使用了 @ 符号来分隔话题名和ROS类型,然后使用 [ 符号来指定方向(从Gazebo到ROS)并跟上Gazebo的内部类型 gz.msgs.Clock。
正常输出
1 2 $ ros2 run ros_gz_bridge parameter_bridge /clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock [INFO ] [1765442253.247335555] [ros_gz_bridge]: Creating GZ->ROS Bridge: [/clock (gz.msgs.Clock) -> /clock (rosgraph_msgs/msg/Clock)] (Lazy 0)
开启第三个终端查看 ros topic
正常输出:
1 2 3 4 $ ros2 topic list /clock /parameter_events /rosout
查看数据流:
正常输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 --- clock: sec: 900 nanosec: 757000000 --- clock: sec: 900 nanosec: 758000000 --- clock: sec: 900 nanosec: 759000000 --- clock: sec: 900 nanosec: 760000000 --- clock: sec: 900 nanosec: 761000000 ---
转移 Gazebo 的雷达话题到 ROS
在第一个终端运行:
1 gz sim -r visualize_lidar.sdf
桥接话题:
1 2 3 ros2 run ros_gz_bridge parameter_bridge \ /lidar/points@sensor_msgs/msg/PointCloud2[gz.msgs.PointCloudPacked \ /model/vehicle_blue/odometry@nav_msgs/msg/Odometry[gz.msgs.Odometry
查看 ROS 话题
1 2 3 4 5 $ ros2 topic list /lidar/points /model/vehicle_blue/odometry /parameter_events /rosout
新增 /lidar/points 和 /model/vehicle_blue/odometry 表明符合预期
查看雷达数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $ ros2 topic echo /lidar/points --once | head -20 header: stamp: sec: 1565 nanosec: 300000000 frame_id: model_with_lidar/link/gpu_lidar height: 16 width: 640 fields: - name: x offset: 0 datatype: 7 count: 1 - name: y offset: 4 datatype: 7 count: 1 - name: z offset: 8 datatype: 7 count: 1
rviz2 可视化点云
启动 rviz2
在 RViz2 中:
点击左下角 Add 。
选择 By topic ,找到并选择 /lidar/points 下的 PointCloud2。
将 Global Options 中的 Fixed Frame 修改为点云消息头中的 frame_id(即 model_with_lidar/link/gpu_lidar)。
总结
我们从零开始,在Ubuntu 22.04宿主机上,成功创建了一个包含 ROS 2 Jazzy 和 Gazebo Harmonic 的Docker容器,解决了图形显示、网络通信等一系列问题,最终成功打通了仿真与ROS之间的数据桥接。
参考资料
文章链接:
https://www.zywvvd.com/notes/study/robotic/simulation/gazebo/gazebo-install/