3、Gazebo仿真器入门:界面介绍、加载世界模型、添加传感器与机器人模型

各位同学,欢迎来到Gazebo的世界。

说实话,我第一次接触Gazebo的时候,心里是有点发怵的。一个黑乎乎的窗口,一堆看不懂的按钮,加载个模型还要敲命令行。但后来我发现,这东西其实没那么玄乎。你把它想象成一个「虚拟实验室」就行了——你可以在里面搭场景、放机器人、装传感器,甚至模拟物理碰撞。

这一章,我们就来把这个实验室的门推开。我会带你走一遍Gazebo的界面、加载世界、添加传感器和机器人模型。嗯,都是基本功,但也是后面所有联调实验的地基。

3.1 Gazebo界面长什么样?

启动Gazebo很简单。终端里敲一行命令:

gazebo

或者你想加载一个现成的世界:

gazebo worlds/empty.world

窗口弹出来之后,你会看到几个主要区域。我习惯从左到右、从上到下给你捋一遍:

  • 3D场景视图:中间最大的那块区域。所有模型、机器人、传感器都在这里显示。你可以用鼠标拖拽旋转视角,滚轮缩放。
  • 左侧面板(World / Insert):左边竖着的一条。World选项卡显示当前世界里的所有模型列表;Insert选项卡用来往场景里添加新模型。
  • 顶部工具栏:平移、旋转、缩放、选择模式。还有播放/暂停仿真时间的按钮。
  • 底部状态栏:显示仿真时间、实时因子、迭代次数。实时因子接近1说明仿真跑得流畅。
我的小习惯:刚打开Gazebo时,如果场景里什么都没有,别慌。先点一下「Insert」选项卡,从模型库里拖一个地面或者障碍物进去,看看物理引擎动不动。这是最快验证Gazebo是否正常工作的方式。

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会卡在加载界面半天不动。后来我发现,最好把自定义模型放在~/.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话题。你想想看,后面做路径规划的时候,这个数据就是避障的输入。

关键点:传感器必须挂载到一个link上,并且要有对应的plugin才能和ROS通信。没有plugin,传感器只是摆设。

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报错说「找不到模型」。后来发现是URDF里引用的mesh文件路径是相对路径,而Gazebo的工作目录不对。解决办法:要么用路径,要么把mesh文件放到~/.gazebo/models/下。

3.5 本章知识结构图

下面这张图帮你理清本章的核心逻辑。从Gazebo界面出发,到加载世界、添加传感器、添加机器人,每一步都是后面联调的基础。

Gazebo仿真器入门知识结构 Gazebo仿真器 界面介绍 加载世界模型 添加传感器 添加机器人模型 3D场景 / 面板 / 工具栏 激光雷达 / 摄像头 / IMU URDF / SDF / spawn_entity 基础操作 → 模型加载 → 传感器集成 → 机器人部署

你看,整个流程其实就四个步骤。界面是操作环境,世界是场景地基,传感器是感知器官,机器人是执行主体。四者缺一不可。

3.6 小结

这一章我们走了一遍Gazebo的入门操作。你学会了:

  • 认识Gazebo的界面布局
  • 加载和编写世界文件
  • 在URDF中添加传感器
  • 用spawn_entity命令加载机器人模型

说实话,这些操作看起来简单,但后面所有复杂的联调实验都建立在这之上。我建议你亲手敲一遍代码,把那个差速小车加载进去,再给它装个激光雷达。哪怕只是看着雷达数据在终端里打印出来,那种成就感也是实实在在的。

嗯,下一章我们会深入Gazebo的物理引擎和插件系统。到时候你会发现,仿真和真实世界的差距,其实比你想的要小得多。

可可精品资料库