4、Gazebo世界构建:使用Building Editor创建静态地图、导入外部3D模型、保存与加载世界

各位同学,欢迎来到第四章。前面几章我们把Gazebo的基本操作和传感器仿真都过了一遍,今天咱们来点实际的——亲手搭建一个完整的仿真世界。

说实话,我刚开始用Gazebo的时候,最头疼的就是建图。那时候项目催得紧,客户要一个带走廊、办公室、仓库的室内环境,我硬是用代码一行一行拼墙,拼了三天三夜……后来才发现有Building Editor这个神器。嗯,今天就把这些经验全部分享给你们。

4.1 Building Editor:从零开始搭一个室内地图

Building Editor是Gazebo自带的建模工具。说白了,它就是个简易的CAD,专门用来画室内地图。你想想看,做机器人路径规划,最常用的场景不就是室内吗?走廊、房间、门、窗户,这些用Building Editor画起来特别快。

4.1.1 启动Building Editor

启动方式有两种:

  1. 在Gazebo主界面,点击菜单栏 Edit → Building Editor
  2. 或者直接按快捷键 Ctrl+B

我个人习惯用快捷键,因为开发过程中频繁切换窗口,鼠标点菜单太慢了。

启动后你会看到一个空白画布,左边是工具栏,右边是属性面板。别被密密麻麻的按钮吓到,常用的其实就那几个。

4.1.2 绘制墙壁和房间

画墙的步骤很简单:

  1. 点击工具栏的 Wall 工具
  2. 在画布上点击起点,拖动到终点,松开鼠标
  3. 在属性面板设置墙的高度(默认2.5米)、厚度(默认0.15米)
我的小技巧:画墙的时候按住 Shift 键,可以强制吸附到水平或垂直方向。这样画出来的墙笔直,不会出现歪歪扭扭的情况。我在项目中吃过这个亏——有一次没按Shift,画出来的走廊宽度不一致,机器人导航时老是撞墙。

画完墙之后,可以用 Room 工具一键生成房间。点击Room工具,在画布上拉一个矩形,它会自动生成四面墙。适合画标准的办公室、实验室这类矩形空间。

4.1.3 添加门和窗户

有了房间,总得有门吧?Building Editor里添加门和窗户非常直观:

  1. 选中一面墙
  2. 点击工具栏的 Door 或 Window 工具
  3. 在墙上点击放置位置
  4. 调整宽度、高度、离地高度等参数

这里要注意一个坑——门的宽度一定要大于机器人宽度。我曾经给一个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拖拽

  1. 在Gazebo主界面,点击 Insert 选项卡
  2. 点击 Add Path,选择模型所在的文件夹
  3. 模型会出现在列表中,直接拖拽到仿真场景中

方式二:通过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>
注意:collision和visual可以共用同一个mesh,也可以分开。如果你想让碰撞检测更精确,可以单独做一个简化版的碰撞模型(比如用几个box拼成桌子的形状),这样仿真计算量更小。

4.2.3 模型放置与调整

模型导入后,用 Translate 和 Rotate 工具调整位置。我建议先把模型放到地面高度(z=0),然后再微调。如果模型悬空了,机器人导航时路径规划会认为那里有障碍物,但实际上模型在空中,机器人可以钻过去——这会导致规划出来的路径很奇怪。

避坑指南:导入的模型如果带有动画(比如旋转门、升降电梯),记得检查动画是否会影响碰撞体。我曾经导入一个带旋转动画的风扇模型,结果风扇叶片每转一圈,碰撞体就跟着转,机器人靠近时被弹飞了……后来我把动画去掉,只保留静态模型才解决。

4.3 保存与加载世界

辛辛苦苦搭好的世界,当然要保存下来。Gazebo的世界文件是 .world 格式,本质上就是一个SDF文件。

4.3.1 保存世界

保存方法很简单:

  1. 点击菜单栏 File → Save World As
  2. 选择保存路径,输入文件名(比如 my_office.world)
  3. 点击保存

保存后,你可以用文本编辑器打开这个.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 本章知识体系

下面这张图总结了本章的核心内容,方便你回顾:

Gazebo世界构建知识体系 Building Editor 绘制墙壁与房间 添加门和窗户 楼梯与多层建筑 导入外部3D模型 格式:.dae / .stl / .obj GUI拖拽导入 SDF文件引用 位置调整与碰撞检测 保存与加载世界 .world文件格式 GUI保存与加载 命令行启动 文件结构解析 核心目标:构建一个可用于路径规划测试的 完整、逼真的仿真环境 ⚠ 常见坑:碰撞体穿透、模型悬空、门宽度不足

4.5 本章小结

这一章我们走完了构建Gazebo世界的完整流程。从Building Editor画墙、加门窗,到导入外部3D模型,再到保存和加载世界文件。每一步我都把项目中踩过的坑告诉你们了,希望能帮大家少走弯路。

说实话,建世界这件事,看起来简单,但要做到「能用」和「好用」之间还是有差距的。我的建议是:先搭一个简单的环境跑通流程,再逐步增加细节。别一开始就想建一个完美的写字楼,那样很容易被各种小问题搞到心态崩溃。

下一章我们会在这个世界里放一个机器人,开始真正的路径规划仿真。到时候你会发现,世界建得好不好,直接决定了路径规划的效果。嗯,到时候再细聊。

课后练习:

  1. 用Building Editor画一个包含3个房间和1条走廊的室内地图
  2. 从网上下载一个办公椅的.dae模型,导入到场景中
  3. 保存为 my_first_world.world,并用命令行加载

可可精品资料库