1. 仿真环境搭建
说实话,每次带新人入门机器人开发,我最头疼的就是环境搭建这一步。不是技术有多难,而是坑太多。我自己当年折腾Gazebo和ROS2的安装,前前后后重装了三次系统。嗯,今天咱们就把这事一次说清楚。
1.1 为什么非要用Gazebo?
你想想看,真机调试一次的成本有多高?电池要充、场地要清、安全员要盯着,万一撞了还得修。仿真就不一样了——随便撞,随便重启,零成本。
Gazebo是目前最主流的机器人仿真器之一。它和ROS2的配合,说白了就像发动机和变速箱的关系。我个人习惯把Gazebo叫做「机器人的虚拟训练场」。你在里面跑过的算法,拿到真机上至少能省一半的调试时间。
核心逻辑:Gazebo负责物理仿真(重力、碰撞、摩擦力),ROS2负责通信与控制。两者通过gazebo_ros_pkgs这个桥梁连接。
1.2 安装前的准备工作
先看看你的系统。我建议用Ubuntu 22.04,搭配ROS2 Humble。为什么?因为这是目前最稳定的组合。我在项目里踩过Foxy的坑,也试过Rolling的雷,最后老老实实回到了Humble。
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS | 别用20.04,有些包会冲突 |
| ROS2 | Humble Hawksbill | LTS版本,支持到2027年 |
| Gazebo | Gazebo Fortress | 与ROS2 Humble原生兼容 |
注意:千万不要用apt直接装Gazebo 11。那个版本是给ROS1用的。我曾经在项目里搞混过,结果仿真死活跑不起来,查了两天才发现是版本不匹配。
1.3 安装ROS2 Humble
这一步其实很简单,但很多人会卡在源的选择上。我直接给出一套经过验证的流程:
# 1. 设置语言环境
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
# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
# 3. 添加GPG密钥
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
# 4. 添加仓库到源列表
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 5. 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop
# 6. 安装开发工具
sudo apt install ros-dev-tools
装完之后,记得在~/.bashrc里加上这行:
source /opt/ros/humble/setup.bash
然后source ~/.bashrc一下。验证安装:
ros2 run demo_nodes_cpp talker
如果看到「Hello World」不断输出,恭喜你,ROS2装好了。
1.4 安装Gazebo Fortress
Gazebo Fortress的安装比ROS2还简单。但有个坑——它和ROS2的通信包需要单独装。
# 安装Gazebo Fortress
sudo apt install ignition-fortress
# 安装ROS2与Gazebo的桥梁
sudo apt install ros-humble-ros-ign-bridge
# 安装Gazebo的ROS2工具包
sudo apt install ros-humble-gazebo-ros-pkgs
小技巧:装完后运行ign gazebo --version检查版本。如果显示6.x,说明装对了。我曾经见过有人装成了Gazebo Classic,那个版本号是7.x,完全两码事。
1.5 创建你的第一个仿真世界
好了,环境搭好了,咱们来建个世界。别一上来就搞复杂场景,先弄个空地,放个机器人进去跑跑。
创建一个.sdf文件,这是Gazebo的世界描述文件。我习惯把它放在工作空间的worlds目录下:
mkdir -p ~/ros2_ws/src/my_robot/worlds
cd ~/ros2_ws/src/my_robot/worlds
touch empty_world.sdf
用文本编辑器打开empty_world.sdf,写入以下内容:
<?xml version="1.0" ?>
<sdf version="1.6">
<world name="my_first_world">
<physics name="default" type="ode">
<real_time_update_rate>1000</real_time_update_rate>
<max_step_size>0.001</max_step_size>
</physics>
<scene>
<ambient>0.4 0.4 0.4 1.0</ambient>
<background>0.7 0.7 0.7 1.0</background>
<shadows>true</shadows>
</scene>
<light name="sun" type="directional">
<pose>0 0 10 0 0 0</pose>
<diffuse>0.8 0.8 0.8 1.0</diffuse>
<specular>0.2 0.2 0.2 1.0</specular>
<direction>-0.5 0.1 -0.9</direction>
</light>
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
</world>
</sdf>
这个文件定义了一个最简单的世界:一块地面、一束阳光、一套物理引擎。够用了。
1.6 启动仿真世界
启动Gazebo,加载这个世界:
ign gazebo ~/ros2_ws/src/my_robot/worlds/empty_world.sdf
如果一切顺利,你会看到一个灰色的地面,上面有光影效果。嗯,这就是你的第一个仿真世界。
验证是否成功:在另一个终端运行ign topic -l,如果看到一堆话题列表,说明Gazebo和ROS2的通信已经打通了。
1.7 往世界里加点东西
光有地面太单调了。咱们加个盒子,再放个圆柱体。修改empty_world.sdf,在</world>之前加入:
<model name="box">
<pose>1 0 0.5 0 0 0</pose>
<link name="link">
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
<material>
<ambient>0.8 0.2 0.2 1.0</ambient>
</material>
</visual>
</link>
</model>
<model name="cylinder">
<pose>-1 0 0.5 0 0 0</pose>
<link name="link">
<collision name="collision">
<geometry>
<cylinder>
<radius>0.5</radius>
<length>1.0</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.5</radius>
<length>1.0</length>
</cylinder>
</geometry>
<material>
<ambient>0.2 0.2 0.8 1.0</ambient>
</material>
</visual>
</link>
</model>
重新加载世界,你会看到一个红色盒子和一个蓝色圆柱体。你可以用鼠标拖拽它们,看看物理引擎怎么处理碰撞。
1.8 本章知识体系
下面这张图,是我自己梳理的本章核心逻辑。你看一眼,心里就有谱了:
1.9 避坑指南
最后,分享几个我当年踩过的坑:
- 版本不匹配:我曾经把ROS2 Foxy和Gazebo Fortress混着装,结果桥接包死活编译不过。后来老老实实全换成Humble+Fortress,一次搞定。
- 环境变量没生效:很多人装完ROS2,忘了
source,然后跑来问我为什么ros2命令找不到。嗯,检查一下~/.bashrc吧。 - 显卡驱动问题:Gazebo需要OpenGL支持。如果你在虚拟机里跑,记得开启3D加速。我在VMware里折腾过,不开加速的话,Gazebo启动后一片黑。
- 防火墙拦截:ROS2的通信走DDS,有时候会被防火墙拦住。如果你发现两个节点互相找不到,试试
sudo ufw disable(不推荐长期关闭,调试用而已)。
我的习惯:每次装完环境,我都会跑一遍ros2 run demo_nodes_cpp talker和ros2 run demo_nodes_py listener,确认通信正常。然后再启动Gazebo,加载一个简单世界。两步都过了,基本就稳了。
好了,第一章就到这里。你的第一个仿真世界已经跑起来了。接下来,咱们可以往里面放机器人了。
可可精品资料库