从 Blender 建模到 Gazebo 仿真:海上工业平台仿真场景搭建全流程
前言
这篇文章记录了在Blender, Gazebo中搭建仿真环境的全流程。本项目研究的是机器人在工业场景下的应用,需要一个尽可能真实的仿真环境来验证机器人的自主巡检能力。
建模对象是一个海上制氢平台,搭建的场景尺寸约 30m × 15m × 3m,包含主楼、集装箱、管道、储罐、楼梯和栏杆等典型海上平台结构,如图所示。
系统整体由三部分构成:
- Blender构建三维场景模型
- Gazebo生成带碰撞体的仿真环境
- 机器人系统集成进去完成导航和巡检
本文重点介绍前两部分,机器人系统是参照B站up主 “鱼香ROS机器人” 的视频来进行搭建的,有兴趣的朋友可以参考学习,这一部分只做简单说明。
一、系统架构
整个工作流程如下:
- 在 Blender 中参照平台结构建立可视化模型,导出为
.obj或.dae文件 - 将模型导入 Gazebo,自动生成碰撞模型,保存为
.world文件 - 通过 ROS 2 的 launch 文件将机器人系统集成到仿真场景中,完成导航和自主巡检
二、Blender 建模与导出
2.1 建模思路
Blender 是一款免费开源的三维建模软件,支持完整的 3D 制作流程,在工业设计和机器人仿真领域有广泛应用。
建模时应遵循:用简化几何体代替精细模型。仿真环境的核心需求是准确的碰撞检测,所以平台上的所有结构都用基础几何形体来近似表达,同时对模型表面做了适当细分(4-5次),以保证后续碰撞体生成的精度。
建模完成后,需要在导出前确认所有物体的 Scale 均已应用为 1(在属性面板 → Item → Scale 中检查),未应用的缩放会导致导入 Gazebo 后尺寸异常。
2.2 导出设置
在顶部菜单选择:
File → Export → Wavefront (.obj)或者:
File → Export → Collada (.dae)⚠️关键设置:导出窗口中务必将Up Axis 设为 Z,Forward Axis 设为 Y。忽略这一步会导致模型导入 Gazebo 后出现方向错乱(通常表现为模型躺倒)。如果仍有错误可以继续调整轴向设置。
此项目中将导出文件命名为offshore_visual.obj,这里是保存在桌面。
三、将模型导入 Gazebo
导出的.obj或.dae文件有两种方式导入 Gazebo,可根据需求选择。
方案一:使用 Gazebo Model Editor 导入(自动生成 collision)
Gazebo 内置的 Model Editor 可以直接导入 mesh 文件并自动生成对应的 collision model,省去手动编写 SDF 碰撞参数的工作,更加快捷直观,而且生成的collision model精度与视觉模型匹配,较为精准,是首推的导入方法。
操作步骤:
- 打开 Gazebo,点击菜单
Edit → Model Editor - 在左侧Insert面板中点击Custom Shapes
- 点击Browse,选择导出的
offshore_visual.obj - 点击Import完成导入
- 退出
Model Editor, 点击Gazebo中的save world as保存文件到 ROS 包的 world 目录,例如:
/path/src/fishbot_description/world/offshore_platform.worldGazebo 会基于 mesh 几何形状自动生成碰撞体,导入后可在 Model Editor 中进一步调整位置和属性,也可以添加一些部件如阀门和障碍物。
验证碰撞模型是否生成
打开新的终端,执行:
gazebo /path/src/fishbot_description/world/offshore_platform.world在world列表中右击offshore_platform → view → collision。就能看到场景的碰撞模型是否能正常生成。
方案二:手动创建配置文件
这种方式通过手动编写配置文件来加载模型,适合需要精确控制模型参数或手动添加新物品的场景。
第一步:建立目录结构
打开终端,执行:
mkdir-p~/.gazebo/models/offshore_platform/meshes将.obj文件(以及.mtl材质文件,如果有)复制进去:
cp~/Desktop/offshore_visual.obj ~/.gazebo/models/offshore_platform/meshes/cp~/Desktop/offshore_visual.mtl ~/.gazebo/models/offshore_platform/meshes/要验证是否复制成功,执行:
ls -R ~/.gazebo/models/offshore_platform随后的结构应该如下所示:
~/.gazebo/models/offshore_platform: meshes ~/.gazebo/models/offshore_platform/meshes: offshore_visual.obj offshore_visual.mtl第二步:创建 model.config
用nano来打开和编辑model.config文件。
nano是 Linux 系统自带的命令行文本编辑器,直接在终端里打开和编辑文件,不需要图形界面。
model.config是 Gazebo 识别模型的入口文件,Gazebo 启动时会扫描~/.gazebo/models/下的所有目录,通过读取这个文件来注册模型并将其显示在 Insert 面板中。
打开新的终端,执行:
nano~/.gazebo/models/offshore_platform/model.config随后编辑model.config文件
<?xml version="1.0"?><model><name>offshore_platform</name><version>1.0</version><sdfversion="1.6">model.sdf</sdf><author><name>user</name><email>user@example.com</email></author><description>offshore platform model for Gazebo Classic.</description></model>保存退出:Ctrl+O→ 回车 →Ctrl+X
第三步:创建 model.sdf
同样用nano打开并编辑model.sdf文件。
model.sdf 是模型的核心描述文件,SDF(Simulation Description Format)是 Gazebo 专用的格式,用来定义模型在仿真中的完整信息,包括:
- visual:模型的视觉外观,也就是在 Gazebo 中看到的样子,这里直接引用了从 Blender 导出的 .obj 文件
- collision:碰撞体,定义模型的物理边界,机器人与环境的碰撞检测就依赖这部分。碰撞体不需要和视觉模型完全一致,通常用简单的 box、cylinder 来近似,以降低计算开销
- static设为true:将模型设为静态,意味着它不会受重力或碰撞力影响而移动,适合用于固定的场景物体
每一个collision块都通过pose指定位置和姿态(x y z roll pitch yaw),通过 geometry指定形状和尺寸(单位:m)。
打开终端,执行:
nano~/.gazebo/models/offshore_platform/model.sdf编辑model.sdf文件
<?xml version="1.0" ?><sdfversion="1.6"><modelname="offshore_platform"><static>true</static><linkname="platform_link"><!-- visual --><visualname="platform_visual"><geometry><mesh><uri>model://offshore_platform/meshes/offshore_visual.obj</uri><scale>1 1 1</scale></mesh></geometry></visual><!-- ========================= 1) floor ========================= --><collisionname="deck_collision"><pose>0 0 0 0 0 0</pose><geometry><box><size>30 15 0.1</size></box></geometry></collision><!-- ========================= 2) main building ========================= --><collisionname="main_building_collision"><pose>-12 -1.5 1 0 0 0</pose><geometry><box><size>6 12 2</size></box></geometry></collision><!-- ========================= 3) containers ========================= --><collisionname="mid_equipment_collision"><pose>-4 -3 1 0 0 0</pose><geometry><box><size>6 8 2</size></box></geometry></collision>保存退出:Ctrl+O→ 回车 →Ctrl+X
编辑完成后打开 Gazebo,在左侧Insert面板中找到offshore_platform并插入场景。这时场景的视觉模型应该能够正常显示了。在world列表中右击offshore_platform → view → collision。就能看到场景的碰撞模型是否能正常生成。
点击Gazebo中的save world as保存文件到 ROS 包的 world 目录:
/path/src/fishbot_description/world/offshore_platform.world💡 上面的 SDF 只包含了部分碰撞体作为示例实际场景中需要为每一个结构都添加对应的 块,工作量较大。推荐的做法是将模型的各部件尺寸和坐标整理后提供给 AI,让它直接生成model.sdf文件,再自己逐一校对调整。
可以看到,手动生成的碰撞模型精度没有自动生成的那么高,这也是我第一次尝试的方法。后来觉得不够高效,遂直接使用方案一自动生成的方法。
四、集成机器人系统
机器人系统基于 ROS 2 Galactic 开发,运行在 Ubuntu 20.04 上,具体的搭建过程请参考UP主 “鱼香ROS” 的视频。该系统主要由四个功能包组成:
- Description Package:定义机器人的 URDF/XACRO 模型,包含 LiDAR、Camera、IMU 等传感器的配置,以及 Gazebo 仿真的 launch 文件。
- Navigation Package:基于 Nav2 框架实现自主导航,使用预先通过 SLAM Toolbox 构建的地图完成定位和路径规划。
- Application Package:提供独立调用的功能节点,包括位姿初始化、位置获取、单点导航和路径点跟随。
- AutoPatrol Package:实现自动巡检逻辑,机器人按预定路径点依次巡逻,到达每个点后自动拍摄并保存图像。
将机器人集成到自定义 world 中只需修改gazebo.sim.launch.py中的 world 路径:
default_gazebo_world_path=os.path.join(urdf_package_path,'world','offshore_platform.world')常见问题
地面闪烁(Z-fighting)
场景地面与 Gazebo 默认的ground_plane模型重叠时会出现闪烁。解决方法:在左侧 World 列表中找到ground_plane,右键 → View →Wireframe,将其切换为线框模式即可。
最后的最后,感谢大伙对这篇文章感兴趣并看到这里,新人第一次尝试在CSDN发文章,如果觉得有帮助,希望获得各位的点赞收藏加关注!