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官方适配 |
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
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 本章知识体系
下面这张图帮你理清今天装的所有东西之间的关系:
这张图其实就说明了一件事: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 安装,不要手动编译 |
好了,环境搭好了,通信也验证了。你现在已经拥有了一个可以跑仿真机器人实验的完整平台。下一章咱们会往这个世界里放一个真正的机器人模型,然后让它动起来。
可可精品资料库