4、Gazebo世界构建:使用Building Editor创建静态地图、导入外部3D模型、保存与加载世界
各位同学,欢迎来到第四章。前面几章我们把Gazebo的基本操作和传感器仿真都过了一遍,今天咱们来点实际的——亲手搭建一个完整的仿真世界。
说实话,我刚开始用Gazebo的时候,最头疼的就是建图。那时候项目催得紧,客户要一个带走廊、办公室、仓库的室内环境,我硬是用代码一行一行拼墙,拼了三天三夜……后来才发现有Building Editor这个神器。嗯,今天就把这些经验全部分享给你们。
4.1 Building Editor:从零开始搭一个室内地图
Building Editor是Gazebo自带的建模工具。说白了,它就是个简易的CAD,专门用来画室内地图。你想想看,做机器人路径规划,最常用的场景不就是室内吗?走廊、房间、门、窗户,这些用Building Editor画起来特别快。
4.1.1 启动Building Editor
启动方式有两种:
- 在Gazebo主界面,点击菜单栏 Edit → Building Editor
- 或者直接按快捷键 Ctrl+B
我个人习惯用快捷键,因为开发过程中频繁切换窗口,鼠标点菜单太慢了。
启动后你会看到一个空白画布,左边是工具栏,右边是属性面板。别被密密麻麻的按钮吓到,常用的其实就那几个。
4.1.2 绘制墙壁和房间
画墙的步骤很简单:
- 点击工具栏的 Wall 工具
- 在画布上点击起点,拖动到终点,松开鼠标
- 在属性面板设置墙的高度(默认2.5米)、厚度(默认0.15米)
画完墙之后,可以用 Room 工具一键生成房间。点击Room工具,在画布上拉一个矩形,它会自动生成四面墙。适合画标准的办公室、实验室这类矩形空间。
4.1.3 添加门和窗户
有了房间,总得有门吧?Building Editor里添加门和窗户非常直观:
- 选中一面墙
- 点击工具栏的 Door 或 Window 工具
- 在墙上点击放置位置
- 调整宽度、高度、离地高度等参数
这里要注意一个坑——门的宽度一定要大于机器人宽度。我曾经给一个30cm宽的差速机器人配了60cm宽的门,理论上够用对吧?结果机器人带着传感器支架,转弯半径大了一点点,每次过门都要蹭一下。后来我把门改到80cm才解决。
4.1.4 添加楼梯和楼层
Building Editor支持多层建筑。点击 Stairs 工具,可以添加直梯或旋转楼梯。我个人建议新手先别碰旋转楼梯,那个参数调起来比较麻烦。直梯就三个参数:台阶高度、台阶深度、台阶数量,调好就能用。
添加楼梯后,点击 Add Floor 按钮,可以创建第二层。每一层的墙壁、房间、门都是独立的,你可以分别编辑。
4.2 导入外部3D模型
Building Editor画出来的都是简单的几何体。但真实场景中,我们需要桌子、椅子、货架、设备这些复杂物体。这时候就要导入外部3D模型了。
4.2.1 支持的模型格式
Gazebo主要支持三种格式:
| 格式 | 说明 | 我的建议 |
|---|---|---|
| .dae (Collada) | 最推荐,支持纹理和动画 | 首选格式,兼容性最好 |
| .stl | 只包含几何信息,无纹理 | 适合简单物体,文件小 |
| .obj | 支持纹理,但有时材质会丢失 | 能用,但需要额外处理 |
我在项目中用过很多次.dae格式。有一次从网上下载了一个精美的办公桌模型,.obj格式的,导入后纹理全丢了,变成一片灰色。后来转成.dae格式,纹理就正常了。所以我的习惯是——能用.dae就用.dae。
4.2.2 模型导入步骤
导入模型有两种方式:
方式一:通过GUI拖拽
- 在Gazebo主界面,点击 Insert 选项卡
- 点击 Add Path,选择模型所在的文件夹
- 模型会出现在列表中,直接拖拽到仿真场景中
方式二:通过SDF文件引用
这种方式更灵活,适合批量导入:
<model name="office_desk">
<static>true</static>
<link name="desk_body">
<collision name="collision">
<geometry>
<mesh>
<uri>model://office_desk/mesh.dae</uri>
<scale>1 1 1</scale>
</mesh>
</geometry>
</collision>
<visual name="visual">
<geometry>
<mesh>
<uri>model://office_desk/mesh.dae</uri>
<scale>1 1 1</scale>
</mesh>
</geometry>
</visual>
</link>
</model>
4.2.3 模型放置与调整
模型导入后,用 Translate 和 Rotate 工具调整位置。我建议先把模型放到地面高度(z=0),然后再微调。如果模型悬空了,机器人导航时路径规划会认为那里有障碍物,但实际上模型在空中,机器人可以钻过去——这会导致规划出来的路径很奇怪。
4.3 保存与加载世界
辛辛苦苦搭好的世界,当然要保存下来。Gazebo的世界文件是 .world 格式,本质上就是一个SDF文件。
4.3.1 保存世界
保存方法很简单:
- 点击菜单栏 File → Save World As
- 选择保存路径,输入文件名(比如 my_office.world)
- 点击保存
保存后,你可以用文本编辑器打开这个.world文件看看。里面包含了所有模型的位置、颜色、物理属性等信息。我有时候会直接编辑这个文件来批量修改参数,比在GUI里一个一个点快多了。
4.3.2 加载世界
加载世界也有两种方式:
GUI方式: File → Open World,选择你的.world文件
命令行方式:
gazebo ~/my_worlds/my_office.world
我个人更推荐命令行方式,因为可以写脚本批量启动不同的世界。比如测试导航算法时,我写了一个脚本,循环启动10个不同的世界,每个世界跑一遍算法,自动记录结果。这样一晚上能跑完所有测试,第二天直接看数据。
4.3.3 世界文件的组织
一个完整的.world文件结构大致如下:
<?xml version="1.0" ?>
<sdf version="1.6">
<world name="my_office">
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://ground_plane</uri>
</include>
<!-- 这里是你添加的所有模型 -->
<model name="wall_1">
...
</model>
<model name="desk_1">
...
</model>
</world>
</sdf>
注意,sun 和 ground_plane 是Gazebo自带的模型,每个世界都需要包含它们。如果你忘了加地面,机器人会直接掉进无底深渊……别问我怎么知道的。
4.4 本章知识体系
下面这张图总结了本章的核心内容,方便你回顾:
4.5 本章小结
这一章我们走完了构建Gazebo世界的完整流程。从Building Editor画墙、加门窗,到导入外部3D模型,再到保存和加载世界文件。每一步我都把项目中踩过的坑告诉你们了,希望能帮大家少走弯路。
说实话,建世界这件事,看起来简单,但要做到「能用」和「好用」之间还是有差距的。我的建议是:先搭一个简单的环境跑通流程,再逐步增加细节。别一开始就想建一个完美的写字楼,那样很容易被各种小问题搞到心态崩溃。
下一章我们会在这个世界里放一个机器人,开始真正的路径规划仿真。到时候你会发现,世界建得好不好,直接决定了路径规划的效果。嗯,到时候再细聊。
课后练习:
- 用Building Editor画一个包含3个房间和1条走廊的室内地图
- 从网上下载一个办公椅的.dae模型,导入到场景中
- 保存为 my_first_world.world,并用命令行加载