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 工具。然后直接在画布上点击起点,拖动到终点,松开鼠标——一面墙就画好了。
我曾经犯过一个低级错误:画墙时没注意对齐,结果墙与墙之间留了缝隙。机器人跑起来直接穿模,激光雷达数据全乱套了。所以,画墙时一定要让端点吸附到网格点上。
画一个简单的矩形房间:
- 点击左上角网格点(0,0)
- 拖动到右上角(4,0)
- 继续画右墙(4,0)→(4,3)
- 画下墙(4,3)→(0,3)
- 最后画左墙(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米高的箱子:
- 选择Box模型
- 设置尺寸:长0.5m,宽0.5m,高0.5m
- 位置设为(2.0, 1.5, 0)——房间正中央
- 颜色随便选,我一般用灰色,看着顺眼
个人经验:障碍物不要放太多,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的核心就是“画图→加东西→保存”。别想得太复杂,它就是个可视化工具。真正难的是后面让机器人在这个环境里动起来——那是后面章节的事。