3、Gazebo仿真环境搭建:安装Gazebo、创建简单世界、加载机器人模型
好,咱们进入仿真环节了。说实话,做机器人开发,没有仿真环境就像闭着眼睛开车——心里没底。Gazebo 是我个人最常用的仿真器,它和 ROS 2 的配合非常默契。这一章,咱们就把仿真地基打牢。
3.1 为什么选择 Gazebo?
市面上仿真器不少,但 Gazebo 在机器人圈子里地位特殊。它开源、物理引擎成熟、传感器模拟逼真,而且和 ROS 2 的接口是原生支持的。你想想看,一个仿真器能直接发布 /scan、/odom 这些话题,省了多少适配的功夫。
我在项目中遇到过用其他仿真器结果雷达数据格式不兼容的情况,折腾了两天才搞定。换成 Gazebo 后,半小时就接上了。嗯,这就是生态的力量。
3.2 安装 Gazebo
ROS 2 Humble 官方推荐的是 Gazebo Fortress(也叫 Ignition Fortress)。安装其实很简单,但有几个坑要注意。
3.2.1 确认 ROS 2 环境
先确保你的 ROS 2 已经装好并且能正常使用。我个人习惯每次开新终端都先 source 一下:
source /opt/ros/humble/setup.bash
3.2.2 安装 Gazebo Fortress
直接用 apt 安装就行:
sudo apt update
sudo apt install ros-humble-ros-gz-sim
这个包会把 Gazebo Fortress 和 ROS 2 的桥接一起装好。装完之后,验证一下:
gz sim --version
如果看到版本号,说明装成功了。
sudo apt remove gazebo*,再装新版。
3.3 创建简单世界
Gazebo 里的「世界」就是一个仿真场景,包含地面、光照、物体等。咱们先建一个最简单的测试用世界。
3.3.1 编写世界文件
世界文件是 SDF 格式的。新建一个文件 my_world.sdf:
<?xml version="1.0" ?>
<sdf version="1.6">
<world name="simple_world">
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://unit_box</uri>
<name>my_box</name>
<pose>1 0 0.5 0 0 0</pose>
</include>
</world>
</sdf>
这个文件定义了一个带地面、阳光和一个方块的世界。说白了,就是最基础的测试环境。
3.3.2 启动世界
gz sim my_world.sdf
你会看到一个 3D 窗口,地面是灰色的,中间有个小方块。嗯,这就是咱们的第一个仿真世界。
model://unit_cylinder,摆在不同位置。我在做导航测试时,通常会在世界里放 5-8 个障碍物,模拟真实走廊环境。
3.4 加载机器人模型
世界有了,接下来把机器人放进去。咱们用 TurtleBot3 作为示例,因为它模型简单、文档齐全,非常适合入门。
3.4.1 获取机器人模型
先安装 TurtleBot3 的模型文件:
sudo apt install ros-humble-turtlebot3-gazebo
装好后,模型文件在 /opt/ros/humble/share/turtlebot3_gazebo/models/ 目录下。
3.4.2 编写启动文件
创建一个 Python 启动文件 start_simulation.py:
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import ExecuteProcess
def generate_launch_description():
# 设置模型路径
model_path = os.path.join(
get_package_share_directory('turtlebot3_gazebo'),
'models',
'turtlebot3_waffle',
'model.sdf'
)
return LaunchDescription([
ExecuteProcess(
cmd=['gz', 'sim', '-r', model_path],
output='screen'
)
])
运行这个文件:
ros2 launch start_simulation.py
你会看到 TurtleBot3 出现在仿真世界里。它带有激光雷达、轮式里程计等传感器,这些数据都会通过 ROS 2 话题发布出来。
3.5 本章知识体系
下面这张图帮你理清本章的核心逻辑:
3.6 常见问题与避坑
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Gazebo 启动后黑屏 | 显卡驱动或 OpenGL 版本问题 | 安装 mesa-utils,检查 glxinfo |
| 模型加载后没有传感器数据 | 模型 SDF 中传感器插件未启用 | 检查模型文件中的 <plugin> 标签 |
| 仿真速度极慢 | 物理引擎更新频率过高 | 降低 <max_step_size> 到 0.001 |
| ROS 2 话题收不到数据 | 桥接节点未启动 | 运行 ros2 run ros_gz_bridge parameter_bridge |
GZ_SIM_RESOURCE_PATH 指定。
好了,到这一步,你的 Gazebo 仿真环境已经搭好了。世界有了,机器人也放进去了。下一章咱们会让这个机器人真正动起来——用键盘控制它走一走,看看传感器数据是不是对的。嗯,先到这里,动手试试吧。