第三节:模型基础——模型概念、文件格式与放置方法
各位同学,今天我们来聊聊Gazebo仿真里的“模型”。
模型是什么?说白了,就是机器人的“数字替身”。你想想看,真机调试多贵啊——摔一次几千块,烧一块板子可能上万。仿真模型就是让你在虚拟世界里随便折腾,零成本试错。
我个人习惯把模型分成三类:机器人本体模型(比如你设计的四轮小车)、环境模型(地面、墙壁、障碍物)、传感器模型(激光雷达、摄像头)。这三类在Gazebo里都是用同一种方式描述的,只是用途不同。
3.1 模型文件格式:SDF vs URDF
Gazebo支持两种模型格式:SDF(Simulation Description Format)和URDF(Unified Robot Description Format)。
我在项目中遇到过不少新手上来就问:“到底学哪个?”我的建议是:URDF是ROS的亲儿子,SDF是Gazebo的亲儿子。如果你主要用ROS,从URDF入手;如果你直接操作Gazebo,SDF更原生。
| 特性 | URDF | SDF |
|---|---|---|
| 起源 | ROS社区 | Gazebo团队 |
| 支持物理属性 | 有限(需扩展) | 原生完整支持 |
| 支持多机器人 | 单文件单机器人 | 单文件多机器人 |
| 闭链结构 | 不支持 | 支持 |
| 推荐场景 | ROS + MoveIt | 纯Gazebo仿真 |
嗯,这里要注意:URDF其实不能直接描述摩擦力、阻尼这些物理参数。Gazebo会通过一个叫gazebo_ros_control的插件来补充。而SDF天生就带这些,省事不少。
3.2 模型文件结构解剖
不管用哪种格式,核心结构都差不多。我拿一个最简单的“盒子模型”来拆解:
<!-- SDF格式示例 -->
<?xml version="1.0" ?>
<sdf version="1.6">
<model name="my_box">
<link name="body">
<collision name="collision">
<geometry>
<box>
<size>0.5 0.5 0.5</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.5 0.5 0.5</size>
</box>
</geometry>
<material>
<ambient>1 0 0 1</ambient>
</material>
</visual>
<inertial>
<mass>1.0</mass>
<inertia>
<ixx>0.083</ixx>
<iyy>0.083</iyy>
<izz>0.083</izz>
</inertia>
</inertial>
</link>
</model>
</sdf>
看到没?一个模型由link(刚体部件)组成。每个link有三个关键部分:
- collision:碰撞检测用的几何体。Gazebo用这个算物理碰撞,不是用visual。
- visual:你看到的形状和颜色。可以比collision更精细,但物理上不参与。
- inertial:质量、惯性张量。这个决定了物体怎么被推动、怎么旋转。
3.3 从模型库加载模型
Gazebo自带一个在线模型库,里面有好几百个现成模型。怎么用?
- 打开Gazebo,点击左侧的“Insert”选项卡
- 你会看到一堆分类:Robots、Objects、Buildings...
- 点一下想要的模型,然后在场景里点一下,就放上去了
但说实话,在线加载有时候很慢。我个人习惯先把常用模型下载到本地:
# 下载模型库到本地
git clone https://github.com/osrf/gazebo_models.git ~/.gazebo/models
# 然后设置环境变量
export GAZEBO_MODEL_PATH=$HOME/.gazebo/models
这样加载速度会快很多。你想想看,每次仿真都要从GitHub拉模型,网络一卡就等半天,多耽误事。
3.4 手动放置模型
手动放置模型有两种方式:图形界面拖拽和命令行/代码控制。
图形界面方式:
- 点击“Insert” → 选择模型 → 在场景中点击放置
- 放置后可以用“Translate”工具(快捷键T)移动
- 用“Rotate”工具(快捷键R)旋转
- 按Ctrl+Z可以撤销操作
命令行方式(更精确):
# 通过ros服务放置模型
rosservice call /gazebo/spawn_sdf_model "{
model_name: 'my_robot',
model_xml: '<?...>',
initial_pose: {
position: {x: 1.0, y: 2.0, z: 0.5},
orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
}
}"
rospy的spawn_model函数。我曾经帮一个客户搭建物流仿真环境,手动拖了50个货架,累得手酸。后来写了个循环脚本,3秒搞定。
3.5 模型知识体系总览
下面这张图是我自己整理的模型知识结构,帮你快速建立全局认知:
📌 核心要点回顾:
- 模型 = link(部件)+ joint(关节)+ plugin(插件)
- 每个link必须有collision、visual、inertial三件套
- URDF适合ROS用户,SDF适合纯Gazebo用户
- 模型加载优先用本地库,避免网络延迟
好了,模型基础就讲到这里。记住一句话:模型是仿真的基石。模型建得不对,后面所有仿真结果都是错的。我见过太多人花几周调控制算法,最后发现是模型参数写错了——白白浪费时间。
可可精品资料库