1. Gazebo与ROS2环境搭建

各位同学好,我是你们的讲师。今天咱们来搞定机器人仿真最基础的一步——把Gazebo和ROS2 Humble这对搭档请进你的电脑里。

说实话,我见过太多人在环境搭建这一步就卡住了。有的装了三天装不上,有的装上了跑不起来。其实说白了,只要把版本对应关系搞清楚,整个过程也就十几分钟的事。

1.1 为什么选ROS2 Humble + Gazebo Fortress?

先说说版本选择。ROS2 Humble是2022年的长期支持版本,稳定到2027年。Gazebo这边,我推荐用Gazebo Fortress(也就是Gazebo Ignition的第六个版本)。

为什么这么配?

  • 官方支持:ROS2 Humble官方推荐的就是Gazebo Fortress
  • 接口统一:ros_gz_bridge这个包就是专门给它们俩搭桥的
  • 社区成熟:遇到问题,网上随便一搜就有答案
注意:千万别混着装。比如ROS2 Humble配Gazebo Classic 11,虽然也能用,但很多新功能不支持,调试起来很痛苦。我早期一个项目就吃过这个亏,折腾了两天才发现是版本不匹配。

1.2 安装ROS2 Humble

我的习惯是,先装ROS2,再装Gazebo。顺序别搞反了。

打开终端,一行一行来:

# 设置语言环境
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

# 添加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

# 安装开发工具
sudo apt install ros-dev-tools

装完之后,记得把环境变量加到.bashrc里:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证一下:

ros2 run demo_nodes_cpp talker

如果看到"Hello World"在刷屏,恭喜你,ROS2装好了。

1.3 安装Gazebo Fortress

Gazebo Fortress的安装就简单多了:

sudo apt-get update
sudo apt-get install ignition-fortress

装完跑一下:

ign gazebo

如果看到一个空荡荡的仿真窗口弹出来,说明Gazebo也到位了。

小技巧:我第一次装Gazebo时,窗口弹出来是黑的。后来发现是显卡驱动的问题。如果你也遇到类似情况,试试 export IGN_GPU_CONFIG=0 这个环境变量。

1.4 安装ros_gz_bridge——让它们俩说上话

ROS2和Gazebo是两个独立的系统。要让它们通信,需要一个桥梁——ros_gz_bridge。

sudo apt install ros-humble-ros-gz-bridge

装完之后,我们来验证一下连通性。

打开第一个终端,启动Gazebo:

ign gazebo empty.sdf

打开第二个终端,启动桥接节点:

ros2 run ros_gz_bridge parameter_bridge /clock@rosgraph_msgs/msg/Clock[ignition.msgs.Clock

打开第三个终端,看看话题:

ros2 topic list

你应该能看到 /clock 这个话题。这说明ROS2成功接收到了Gazebo发出的时钟信号。

1.5 理解节点与话题——别被术语吓到

很多新手一听到"节点"、"话题"就头大。其实没那么复杂。

节点,你可以理解成一个独立运行的小程序。比如一个节点负责控制机器人运动,另一个节点负责处理激光雷达数据。

话题,就是节点之间传递数据的通道。一个节点往话题里发数据,另一个节点从话题里读数据。

我画了一张图,帮你理清关系:

ROS2节点 /cmd_vel 发布者 Gazebo节点 /cmd_vel 订阅者 话题 /cmd_vel ros_gz_bridge 桥接 节点通过话题通信,桥接让ROS2和Gazebo互相理解

你看,ROS2节点发布速度指令到 /cmd_vel 话题,Gazebo节点订阅这个话题,然后驱动仿真机器人运动。就这么简单。

1.6 实战小练习:跑通第一个仿真

光说不练假把式。我们来跑一个完整的例子。

第一步,启动一个带小车的Gazebo世界:

ign gazebo -v 4 -r shapes.sdf

第二步,启动桥接,把Gazebo的 /model/vehicle_blue/cmd_vel 话题映射到ROS2:

ros2 run ros_gz_bridge parameter_bridge /model/vehicle_blue/cmd_vel@geometry_msgs/msg/Twist]ignition.msgs.Twist

第三步,发布一个速度指令:

ros2 topic pub /model/vehicle_blue/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0}, angular: {z: 0.5}}"

你应该能看到Gazebo里的小车开始转圈了。

验证连通性的三个关键点:
  1. ros2 topic list 能看到Gazebo的话题
  2. ros2 topic echo /话题名 能看到数据在流动
  3. Gazebo里的物体能响应ROS2发出的指令

1.7 避坑指南

这些年我踩过的坑,今天一次性告诉你:

  • 环境变量没生效:每次打开新终端,记得 source /opt/ros/humble/setup.bash。或者像我一样,直接写进.bashrc里。
  • Gazebo启动报错:多半是显卡驱动问题。试试 export IGN_GPU_CONFIG=0,或者更新一下显卡驱动。
  • 桥接话题对不上:ROS2和Gazebo的话题类型必须一致。用 ros2 topic info /话题名 查看类型,用 ign topic -i /话题名 查看Gazebo侧的类型。
  • 权限问题:如果遇到 Permission denied,检查一下用户组。把当前用户加到 dialout 组里:sudo usermod -aG dialout $USER

嗯,环境搭建这部分就到这里。记住,仿真环境是你的试验田,在这里犯错成本最低。把基础打牢了,后面调参、做算法才能得心应手。


可可精品资料库