2、搭建第一个仿真世界:使用Building Editor创建静态环境、添加墙壁与障碍物、保存.world文件

说实话,很多初学者一上来就想着跑复杂的机器人算法,结果连个像样的仿真环境都没有。我当年也是这样,直接在空荡荡的Gazebo里测试激光雷达,数据全是乱七八糟的反射——后来才明白,仿真世界的质量直接决定了你的算法能不能复现。

这一节,我们就从零开始,用Building Editor搭一个能用的静态环境。说白了,就是给机器人画个“家”,有墙、有障碍物,能跑起来。

2.1 Building Editor是什么?

Building Editor是Gazebo自带的一个2D编辑器。你想想看,它就像画图软件,只不过画出来的东西能直接变成3D仿真世界。

我个人习惯先画平面图,再生成3D模型。这样思路清晰,不容易出错。Building Editor的核心逻辑就是:画墙→加障碍物→保存为.world文件。

核心知识点:

  • Building Editor生成的是静态环境,不能移动物体
  • 它基于2D平面图自动生成3D模型
  • 输出格式是SDF(Simulation Description Format)

2.2 启动Building Editor

启动方式很简单,在终端里敲一行命令:

gazebo --verbose ~/catkin_ws/src/my_robot/worlds/empty.world

嗯,这里要注意:必须先有一个空的.world文件。我刚开始就卡在这一步,以为直接敲gazebo就能进编辑器,结果弹出来的是默认世界。

进入Gazebo后,点击菜单栏的 Edit → Building Editor,就会弹出2D编辑窗口。你会看到一个网格画布,这就是你的“图纸”。

小技巧:网格的每个格子默认是1米×1米。我建议你先在脑子里规划好房间尺寸,比如4米×3米的房间,就画4×3个格子。

2.3 添加墙壁

画墙是第一步。在Building Editor左侧工具栏,点击 Wall 工具。然后直接在画布上点击起点,拖动到终点,松开鼠标——一面墙就画好了。

我曾经犯过一个低级错误:画墙时没注意对齐,结果墙与墙之间留了缝隙。机器人跑起来直接穿模,激光雷达数据全乱套了。所以,画墙时一定要让端点吸附到网格点上。

画一个简单的矩形房间:

  1. 点击左上角网格点(0,0)
  2. 拖动到右上角(4,0)
  3. 继续画右墙(4,0)→(4,3)
  4. 画下墙(4,3)→(0,3)
  5. 最后画左墙(0,3)→(0,0)

画完后,你会看到墙壁自动变成了3D预览。默认墙高是2.5米,厚度0.15米。这些参数可以在右侧属性面板里改。

避坑指南:我曾经把墙高设成0.5米,结果机器人直接跨过去了。墙高至少要比机器人高,一般2米以上比较稳妥。

2.4 添加障碍物

光有墙壁太单调了。真实场景里总得有桌子、柱子、箱子吧?Building Editor提供了几种基础障碍物:

障碍物类型 用途 我常用的尺寸
Box(立方体) 模拟箱子、桌子 0.5m × 0.5m × 0.5m
Cylinder(圆柱体) 模拟柱子、垃圾桶 半径0.3m,高1.0m
Mesh(网格模型) 导入自定义模型 需要提前准备.dae文件

点击左侧工具栏的 Furniture 按钮,选择 Add,然后选一个模型拖到画布上。你可以调整它的位置、尺寸和旋转角度。

举个例子,我在房间中央放一个0.5米高的箱子:

  1. 选择Box模型
  2. 设置尺寸:长0.5m,宽0.5m,高0.5m
  3. 位置设为(2.0, 1.5, 0)——房间正中央
  4. 颜色随便选,我一般用灰色,看着顺眼

个人经验:障碍物不要放太多,3-5个就够了。我第一次做仿真时放了十几个箱子,结果机器人导航算法直接卡死——环境太复杂,路径规划算不过来。

2.5 保存.world文件

画完环境后,点击 File → Save As,选择保存路径。我建议统一放在 ~/catkin_ws/src/你的项目/worlds/ 目录下。

文件名要见名知意,比如 simple_room.world。保存后,用文本编辑器打开看看:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="simple_room">
    <include>
      <uri>model://sun</uri>
    </include>
    <model name="wall_1">
      <pose>0 0 1.25 0 0 0</pose>
      <link name="link">
        <collision name="collision">
          <geometry>
            <box>
              <size>4 0.15 2.5</size>
            </box>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <box>
              <size>4 0.15 2.5</size>
            </box>
          </geometry>
        </visual>
      </link>
    </model>
    <!-- 其他墙壁和障碍物类似 -->
  </world>
</sdf>

看到没?Building Editor自动帮你生成了SDF格式的模型描述。每个墙壁、障碍物都变成了一个<model>标签,包含碰撞模型和可视化模型。

小技巧:保存后,用 gazebo simple_room.world 直接打开,看看效果。如果墙壁位置不对,回到Building Editor微调,再保存覆盖就行。

2.6 验证你的世界

打开保存的.world文件,你应该能看到:

  • 一个封闭的矩形房间
  • 房间中央有一个箱子
  • 地面是平坦的(默认有地面)
  • 有光照(默认有太阳)

如果一切正常,恭喜你——第一个仿真世界搭建完成了!

我曾经带过一个实习生,他画完环境后死活加载不出来。后来发现是文件名里带了中文,Gazebo不识别。所以,文件名和路径里不要有中文和空格,这是血的教训。

2.7 本章知识结构图

下面这张图总结了Building Editor的核心流程,我画出来方便你对照操作:

Building Editor 搭建流程 启动编辑器 Edit → Building Editor 绘制墙壁 Wall工具 → 画矩形 添加障碍物 Furniture → Add 保存.world File → Save As 验证加载 gazebo xxx.world 微调优化 回到编辑器修改 循环迭代直到满意 最终输出:.world 文件(SDF格式) 包含墙壁、障碍物的碰撞模型和可视化模型

这张图把整个流程串起来了。你照着走一遍,基本不会出大问题。如果卡住了,多半是文件路径或者命名的问题——检查一下就好。

总结一下:Building Editor的核心就是“画图→加东西→保存”。别想得太复杂,它就是个可视化工具。真正难的是后面让机器人在这个环境里动起来——那是后面章节的事。

可可精品资料库