3、Gazebo仿真器入门:界面介绍、加载世界模型、添加传感器与机器人模型
各位同学,欢迎来到Gazebo的世界。
说实话,我第一次接触Gazebo的时候,心里是有点发怵的。一个黑乎乎的窗口,一堆看不懂的按钮,加载个模型还要敲命令行。但后来我发现,这东西其实没那么玄乎。你把它想象成一个「虚拟实验室」就行了——你可以在里面搭场景、放机器人、装传感器,甚至模拟物理碰撞。
这一章,我们就来把这个实验室的门推开。我会带你走一遍Gazebo的界面、加载世界、添加传感器和机器人模型。嗯,都是基本功,但也是后面所有联调实验的地基。
3.1 Gazebo界面长什么样?
启动Gazebo很简单。终端里敲一行命令:
gazebo
或者你想加载一个现成的世界:
gazebo worlds/empty.world
窗口弹出来之后,你会看到几个主要区域。我习惯从左到右、从上到下给你捋一遍:
- 3D场景视图:中间最大的那块区域。所有模型、机器人、传感器都在这里显示。你可以用鼠标拖拽旋转视角,滚轮缩放。
- 左侧面板(World / Insert):左边竖着的一条。World选项卡显示当前世界里的所有模型列表;Insert选项卡用来往场景里添加新模型。
- 顶部工具栏:平移、旋转、缩放、选择模式。还有播放/暂停仿真时间的按钮。
- 底部状态栏:显示仿真时间、实时因子、迭代次数。实时因子接近1说明仿真跑得流畅。
3.2 加载世界模型
Gazebo里的「世界」说白了就是一个场景描述文件,后缀是.world。里面定义了地面、光照、重力、物理参数,还有你放进去的模型。
举个例子,我们加载一个带障碍物的世界:
gazebo worlds/office.world
你会看到一个办公室场景——有桌子、椅子、墙壁。机器人可以在里面跑。
如果你想自己写一个世界文件,其实就是一个SDFormat格式的XML。我贴一个最简单的例子:
<?xml version="1.0" ?>
<sdf version="1.6">
<world name="my_world">
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://cinder_block</uri>
<name>block1</name>
<pose>1 0 0.1 0 0 0</pose>
</include>
</world>
</sdf>
保存成my_world.world,然后:
gazebo my_world.world
你就会看到地上多了一个水泥砖块。嗯,就是这么简单。
~/.gazebo/models/目录下,这样引用起来最省心。
3.3 添加传感器
传感器是机器人的「眼睛」和「耳朵」。Gazebo里支持激光雷达、摄像头、IMU、接触传感器等等。
添加传感器有两种方式:
- 通过Insert面板:在左侧Insert选项卡里,找到传感器模型,拖到场景里。但这种方式比较粗糙,传感器没有挂载到机器人上。
- 通过SDF/URDF文件:在机器人模型描述文件里直接定义传感器。这是正规做法。
我拿激光雷达举个例子。在URDF里加一段:
<gazebo reference="laser_link">
<sensor type="ray" name="head_laser">
<pose>0 0 0 0 0 0</pose>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
<min_angle>-3.14159</min_angle>
<max_angle>3.14159</max_angle>
</horizontal>
</scan>
<range>
<min>0.1</min>
<max>30.0</max>
</range>
</ray>
<plugin name="laser_controller" filename="libgazebo_ros_ray_sensor.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
</sensor>
</gazebo>
这段代码定义了一个360度激光雷达,扫描范围30米,数据发布到/scan话题。你想想看,后面做路径规划的时候,这个数据就是避障的输入。
3.4 添加机器人模型
机器人模型通常用URDF或SDF描述。URDF是ROS生态的标准,SDF是Gazebo的原生格式。我个人更推荐用URDF,因为和ROS的兼容性更好。
加载一个机器人模型到Gazebo,最常用的命令是:
ros2 launch gazebo_ros spawn_entity.launch.py \
entity_name:=my_robot \
file:=/path/to/robot.urdf
或者用SDF:
ros2 launch gazebo_ros spawn_entity.launch.py \
entity_name:=my_robot \
file:=/path/to/robot.sdf
举个例子,我们加载一个差速驱动小车:
ros2 launch gazebo_ros spawn_entity.launch.py \
entity_name:=diff_drive_robot \
file:=~/ros2_ws/src/my_robot_description/urdf/diff_drive.urdf
你会看到小车出现在场景中央。如果它一动不动,别急——你还需要给车轮加一个差速驱动插件。这个我们后面章节会细讲。
~/.gazebo/models/下。
3.5 本章知识结构图
下面这张图帮你理清本章的核心逻辑。从Gazebo界面出发,到加载世界、添加传感器、添加机器人,每一步都是后面联调的基础。
你看,整个流程其实就四个步骤。界面是操作环境,世界是场景地基,传感器是感知器官,机器人是执行主体。四者缺一不可。
3.6 小结
这一章我们走了一遍Gazebo的入门操作。你学会了:
- 认识Gazebo的界面布局
- 加载和编写世界文件
- 在URDF中添加传感器
- 用spawn_entity命令加载机器人模型
说实话,这些操作看起来简单,但后面所有复杂的联调实验都建立在这之上。我建议你亲手敲一遍代码,把那个差速小车加载进去,再给它装个激光雷达。哪怕只是看着雷达数据在终端里打印出来,那种成就感也是实实在在的。
嗯,下一章我们会深入Gazebo的物理引擎和插件系统。到时候你会发现,仿真和真实世界的差距,其实比你想的要小得多。