1. Gazebo与ROS2环境搭建:安装Gazebo与ROS2 Humble,验证通信,启动第一个仿真世界

各位同学,咱们直接进入正题。

做机器人仿真,Gazebo和ROS2就是你的左膀右臂。我刚开始接触这俩东西的时候,光装环境就折腾了两天——版本对不上、依赖冲突、启动报错……说白了,大部分坑都出在「版本匹配」上。今天咱们一步到位,把环境搭得干干净净。

1.1 为什么选ROS2 Humble + Gazebo Fortress?

ROS2 Humble是2022年的长期支持版,稳定到2027年。Gazebo Fortress(也就是Gazebo Ignition的第八代)是官方推荐和Humble搭配的版本。我个人的习惯是:能用LTS就用LTS,别追新,项目做到一半库不兼容,那才叫欲哭无泪。

组件 版本 说明
Ubuntu 22.04 LTS 推荐桌面版,服务器版也行但少图形工具
ROS2 Humble Hawksbill 2022年发布,支持到2027年
Gazebo Fortress (Ignition) 与Humble官方适配
⚠️ 注意: 别用Gazebo Classic(旧版Gazebo 11),它和ROS2 Humble的通信桥接已经过时了。我去年帮一个学生排查问题,折腾半天发现他装的是Classic版本,换回Fortress后一切正常。

1.2 安装ROS2 Humble

安装过程其实就三步:加源、更新、安装。但每一步都有讲究。

第一步:设置语言环境

嗯,这一步很多人会跳过,但locale不对会导致后续编译报错。我吃过这个亏。

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

第二步:添加ROS2源

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

第三步:安装ROS2 Humble桌面版

sudo apt update
sudo apt install ros-humble-desktop

这里我建议装ros-humble-desktop,它包含了Rviz2、rqt等可视化工具。如果你只装ros-humble-base,后面调试的时候还得补装,麻烦。

第四步:配置环境变量

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
💡 小技巧: 如果你同时装了ROS1和ROS2,建议在.bashrc里用别名区分。我一般这样写:
alias ros2='source /opt/ros/humble/setup.bash'
这样每次打开终端,默认不加载任何ROS环境,需要用哪个就敲哪个别名。

1.3 安装Gazebo Fortress

Gazebo Fortress的安装比ROS2还简单。直接一行命令搞定:

sudo apt install ros-humble-ros-gz

等等,你可能会问:「为什么不是直接装Gazebo,而是装ros-gz?」

因为ros-humble-ros-gz这个包会把Gazebo Fortress和ROS2之间的通信桥(ros_gz_bridge)一起装好。你想想看,如果分开装,版本对不上又得排查半天。我当初就是分开装的,结果桥接库版本不匹配,折腾了一下午。

验证安装:

gz sim --version

如果输出类似 Gazebo Simulator, version 6.x.x,说明装好了。

1.4 验证ROS2与Gazebo通信

环境搭好了,咱们得试试它们能不能「说话」。说白了,就是让ROS2发一个话题,Gazebo能收到;或者Gazebo发一个话题,ROS2能订阅到。

第一步:启动Gazebo空世界

gz sim empty.sdf

你会看到一个空荡荡的仿真世界。嗯,别嫌它寒酸,后面咱们会往里面加机器人。

第二步:查看ROS2话题列表

打开另一个终端,运行:

ros2 topic list

正常情况下,你会看到类似这样的输出:

/clock
/parameter_events
/rosout
/tf
/tf_static
/gazebo/resource_paths
/gazebo/worlds

看到/clock和/tf了吗?这说明ROS2已经成功接收到了Gazebo发布的仿真时钟和坐标变换数据。

第三步:手动发一个话题测试

咱们让Gazebo里的物体动一动。先往世界里加一个球体:

gz service -s /world/empty/create --reqtype gz.msgs.EntityFactory --reptype gz.msgs.Boolean --timeout 1000 --req 'sdf: "<sdf version=\"1.7\"><model name=\"ball\"><pose>0 0 1 0 0 0</pose><link name=\"link\"><collision name=\"collision\"><geometry><sphere><radius>0.2</radius></sphere></geometry></collision><visual name=\"visual\"><geometry><sphere><radius>0.2</radius></sphere></geometry></visual></link></model></sdf>"'

然后通过ROS2发布一个力的话题,让球动起来:

ros2 topic pub /model/ball/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

如果球在Gazebo里滚起来了,恭喜你——通信验证通过!

✅ 验证要点:
  • ROS2能列出Gazebo发布的话题
  • ROS2发布的话题能被Gazebo订阅并产生物理效果
  • 仿真时钟/clock正常跳动

1.5 启动第一个仿真世界

空世界太无聊了,咱们启动一个带地形的世界。Gazebo Fortress自带了一些示例世界:

gz sim -v 4 shapes.sdf

这个shapes.sdf世界里有各种几何体——立方体、球体、圆柱体。你可以用鼠标拖拽它们,感受一下物理引擎的效果。

我个人建议初学者先玩一玩这个shapes.sdf,原因有三:

  • 场景简单,不会卡顿
  • 物体少,方便观察物理碰撞
  • 自带光照,视觉效果舒服

如果你想看看更复杂的场景,可以试试:

gz sim -v 4 fuel.sdf

这个会从Gazebo Fuel服务器下载一个带建筑和植被的世界。不过第一次加载会比较慢,因为要下载模型。

⚠️ 注意: 如果启动fuel.sdf时卡住不动,八成是网络问题。你可以先检查一下能不能访问 https://fuel.gazebosim.org。我在国内某次培训时,整个教室的网络都连不上Fuel,最后只能改用本地世界文件。

1.6 本章知识体系

下面这张图帮你理清今天装的所有东西之间的关系:

Ubuntu 22.04 LTS 操作系统 ROS2 Humble ros2 topic / ros2 pub / Rviz2 Gazebo Fortress gz sim / 物理引擎 / 传感器仿真 ros_gz_bridge 通信桥 发布话题 订阅话题 话题/服务桥接 用户操作:终端命令 / Python脚本 / C++节点

这张图其实就说明了一件事:ROS2负责逻辑和算法,Gazebo负责物理和渲染,中间靠ros_gz_bridge这座桥沟通。你写的控制程序跑在ROS2这边,Gazebo那边模拟出来的传感器数据再通过桥传回来,形成一个闭环。

1.7 常见问题与避坑

最后,我把自己踩过的坑和帮别人解决的典型问题列出来,你遇到了直接对照着查:

问题现象 原因 解决方法
gz sim 命令找不到 Gazebo未正确安装或PATH未配置 检查 dpkg -l | grep gz,确认安装后执行 export PATH=$PATH:/usr/bin/gz
ros2 topic list 为空 Gazebo未启动或桥接未加载 确认Gazebo正在运行,检查 ros2 node list 是否有 /ros_gz_bridge
Gazebo启动后黑屏 显卡驱动问题或OpenGL版本过低 安装显卡驱动:sudo apt install nvidia-driver-525(根据你的显卡型号)
通信桥报版本错误 ros_gz_bridge版本与Gazebo不匹配 统一使用 ros-humble-ros-gz 安装,不要手动编译
💡 我的经验: 如果你用的是虚拟机,建议给虚拟机分配至少4GB内存和2个CPU核心。Gazebo的物理引擎很吃资源,我曾经在2GB内存的虚拟机上跑,Gazebo直接卡死。另外,虚拟机里记得开启3D加速,否则Gazebo的渲染会非常慢。

好了,环境搭好了,通信也验证了。你现在已经拥有了一个可以跑仿真机器人实验的完整平台。下一章咱们会往这个世界里放一个真正的机器人模型,然后让它动起来。

可可精品资料库