4. 第一个仿真世界:加载空世界、添加静态物体、保存世界文件

好,咱们正式开始动手了。

前面几章我们把 Gazebo 装好、环境跑通,说白了就是「枪擦亮了,子弹上膛了」。这一章我们要干三件事:启动一个空世界、往里面塞点东西(地面和墙壁)、最后把这个世界存下来。听起来简单,但这里面的坑,我当年踩过不少。

4.1 启动空世界:从零开始

打开终端,输入下面这行命令:

gazebo --verbose worlds/empty.world

等一下,如果你直接敲 gazebo 然后回车,其实也能启动。但加上 --verbose 参数,终端会打印出详细的日志信息。我个人习惯一直开着这个参数——为什么?因为一旦 Gazebo 崩了(嗯,它确实会崩),你能从日志里找到线索。

启动后你会看到一个灰色的网格地面,中间有个太阳,四周空荡荡的。这就是我们的「空世界」。你想想看,这就像一张白纸,接下来我们要在上面画东西。

小技巧: 如果你觉得视角操作不顺手,按住 Ctrl + Shift 再拖动鼠标,可以平移视角。我刚开始用的时候,经常把模型拖飞出去,后来才发现这个快捷键。

4.2 添加地面:别小看这一步

空世界里其实已经有一个地面了——那个灰色网格。但那个网格是视觉辅助,不是真正的物理地面。如果你在上面放一个球,它会直接掉下去,穿模到无底洞。

我们要添加一个真正的、有物理碰撞的地面。操作步骤:

  1. 点击顶部菜单栏的 Insert 标签
  2. 在下拉列表里找到 Ground Plane
  3. 点击后,鼠标移到场景中,你会看到一个半透明的方块跟着鼠标走
  4. 点击左键放置

就这么简单?嗯,但这里有个细节:放置位置。你最好把地面放在 z = 0 的位置。怎么确认?看左下角的坐标显示。我曾经有一次手抖,把地面放在了 z = 0.01 的位置,结果后面放的所有物体都悬空了 1 厘米,排查了半天才发现。

核心要点: 地面必须放在 z=0 平面,否则后续所有物体的高度都会偏移。

4.3 添加墙壁:学会用模型库

地面有了,接下来加一堵墙。Gazebo 自带的模型库里没有现成的「墙壁」模型,但我们可以用 Box 来替代。

操作步骤:

  1. 点击 Insert 标签
  2. 选择 Box(在列表靠下的位置)
  3. 在场景中点击放置
  4. 选中这个方块,右键 → Edit Model
  5. 在左侧的属性面板里,把尺寸改成:长 2.0、宽 0.2、高 1.0
  6. 位置改成:x = 0, y = 1.5, z = 0.5

为什么 z 要设成 0.5?因为墙壁高度是 1.0,底部在 z=0,中心点就在 z=0.5。这个计算逻辑,说白了就是「高度的一半」。我刚开始做的时候,直接把 z 设成 1.0,结果墙壁悬空了,看起来像一面「漂浮的墙」。

如果你想加四面墙围成一个房间,重复上面的步骤,调整 x 和 y 的位置就行。我个人习惯先加两面墙看看效果,确认没问题再加剩下的。

4.4 保存世界文件:你的第一个成果

场景搭好了,现在把它存下来。点击菜单栏的 File → Save World As,选择保存路径,文件名取 my_first_world.world。

保存后,用文本编辑器打开这个文件看看:

<?xml version="1.0"?>
<sdf version="1.6">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://box</uri>
      <name>wall_1</name>
      <pose>0 1.5 0.5 0 0 0</pose>
    </include>
  </world>
</sdf>

这个文件就是 Gazebo 世界的「配方」。以后你只要运行 gazebo my_first_world.world,就能直接加载这个场景,不用再手动摆放了。

注意: 保存路径不要有中文!Gazebo 对中文路径的支持很差,我曾经因为桌面文件夹叫「仿真项目」,结果死活加载不出来,折腾了半小时才发现是路径问题。

4.5 本章知识体系

下面这张图帮你理清这一章的核心逻辑:

第一个仿真世界搭建流程 启动空世界 gazebo empty.world 添加地面 Ground Plane 添加墙壁 Box 模型 保存世界 .world 文件 关键点:地面 z=0 | 墙壁高度一半 = z 坐标 避坑:保存路径不要有中文 四个步骤环环相扣,每一步都影响后续结果 启动 地面 墙壁 保存

4.6 避坑指南

这一章看起来简单,但我当年踩过的坑,列出来给你参考:

  • 地面穿模:我曾经把地面放在 z=0.1,结果所有物体都悬空。解决办法:选中地面,在属性面板里把 pose 的 z 改成 0。
  • 墙壁位置不对:我刚开始做的时候,墙壁总是歪的。后来发现是旋转角度没清零。记得把 roll、pitch、yaw 都设成 0。
  • 保存后加载失败:有一次我保存了世界文件,第二天打开发现 Gazebo 报错。排查了半天,原来是文件名里有个空格。Gazebo 对空格敏感,建议用下划线代替。
  • 模型库加载慢:第一次点击 Insert 标签时,Gazebo 会从网上下载模型列表。如果网络不好,可能会卡住。这时候耐心等一等,或者检查网络连接。
总结一下: 这一章我们做了三件事——启动空世界、添加地面和墙壁、保存世界文件。你手里现在有一个可以重复加载的仿真场景了。虽然简单,但这是后续所有复杂仿真的基础。把这个流程练熟,后面做机器人导航、传感器仿真的时候,你会感谢现在的自己。
可可精品资料库