本文最后更新于: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 JazzyUbuntu 24.04 Nobel

官方镜像拉取

可选方案为 jazzy-simulation 或者 jazzy-desktop-full-noble 再安装 gazebo,这里选择拉取 jazzy-desktop-full-noble

1
2
3
4
5
6
7
8
# 如果拉取 jazzy-simulation
docker pull osrf/ros:jazzy-simulation

# 如果拉取 jazzy-desktop-full-noble
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         SIZE
osrf/ros jazzy-desktop-full 28eebd242e2b 3 weeks ago 4.57GB
osrf/ros jazzy-desktop-full-noble 28eebd242e2b 3 weeks ago 4.57GB
osrf/ros jazzy-simulation 538ba2204611 3 weeks ago 2.4GB

宿主机图形界面配置

在宿主机终端执行以下命令,允许容器连接图形界面:

1
2
3
4
5
6
7
8
9
# 进入项目目录
cd ~/ros2_gazebo_docker

# 1. 允许所有本地客户端连接(简易方式,适合开发环境)
xhost +local:

# 2. 创建一个X11认证文件,使容器内用户有权访问宿主机X服务
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-noble

# 避免安装过程中的交互式提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新软件包列表并安装 Gazebo Harmonic 及ROS桥接
# ros-jazzy-ros-gz 包会自动拉取 gz-harmonic 和所有必要的依赖
RUN 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/*


# 自动 source ROS 环境
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: . # 在当前目录查找 Dockerfile 进行构建
image: my_ros2_gz_sim:1.0.0
container_name: ros2_gz_sim_compose # 容器名称
# 关键配置:使用主机网络模式,这对ROS节点通信至关重要
network_mode: host
# 环境变量:用于图形显示和用户权限
environment:
- DISPLAY=${DISPLAY}
- XAUTHORITY=/tmp/.docker.xauth # 用于X11认证
- XDG_RUNTIME_DIR=/tmp/runtime-$USER
- NVIDIA_VISIBLE_DEVICES=all # 如需使用GPU加速,请保留此行
- NVIDIA_DRIVER_CAPABILITIES=all
# 卷挂载:共享X11套接字、认证文件和代码目录
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 # 等同于 docker run -i
tty: true # 等同于 docker run -t
# 容器启动后运行的命令:一个交互式bash shell
command: bash -c "source /opt/ros/jazzy/setup.bash && exec bash"

构建镜像,执行:

1
docker-compose build

成功后得到镜像:

1
2
3
REPOSITORY                                                                          TAG                        IMAGE ID       CREATED         SIZE
ros2_gazebo_docker-ros2_gz_sim latest b2b505ea54fd 6 seconds ago 4.66GB

构建容器:

1
docker-compose up -d

成功后容器运行:

1
2
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS         PORTS     NAMES
655824e0d3d3 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
  • 激活 ros 环境
1
bash -c "source /opt/ros/jazzy/setup.bash && exec bash"
测试 Gazebo Harmonic 是否安装成功
1
gz sim --version

成功输出:

1
2
3
Gazebo Sim, version 8.9.0
Copyright (C) 2018 Open Source Robotics Foundation.
Released under the Apache 2.0 License.
启动 Gazebo 世界测试
1
gz sim

弹出图形界面:

Empty:

NAO

测试 ROS 2 环境
1
ros2 doctor

正常输出:

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 实例启动测试
1
rviz2

测试 ROS 2 核心通信
1
2
3
# 开启两个 ros 终端 分别运行
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_cpp listener

正常情况下 listener 可以接受到消息

测试 Gazebo 启动与 ROS 桥接

在第一个终端运行:

1
gz sim -r visualize_lidar.sdf

此时可以在第二个终端查看 gz 内部发布的话题

1
gz topic -l

正常输出:

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
ros2 topic list

正常输出:

1
2
3
4
$ ros2 topic list
/clock
/parameter_events
/rosout

查看数据流:

1
ros2 topic echo /clock

正常输出:

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

1
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 JazzyGazebo Harmonic 的Docker容器,解决了图形显示、网络通信等一系列问题,最终成功打通了仿真与ROS之间的数据桥接。

参考资料



文章链接:
https://www.zywvvd.com/notes/study/robotic/simulation/gazebo/gazebo-install/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

机器人仿真平台 Gazebo 安装记录
https://www.zywvvd.com/notes/study/robotic/simulation/gazebo/gazebo-install/
作者
Yiwei Zhang
发布于
2025年12月11日
许可协议