模型文件基础:从零认识你的第一个机器人模型
做机器人仿真这么多年,我见过太多新手一上来就急着写代码,结果连模型文件长什么样都没搞清楚。说实话,模型文件就是机器人的「身份证」,Gazebo 能不能认出你的机器人,全看它。
今天咱们就来聊聊模型文件的结构。我会带着你,把一个机器人模型拆开来看。
模型文件长什么样?
一个标准的 Gazebo 模型,通常包含两个核心文件:
- model.config —— 模型的「名片」
- model.sdf —— 模型的「身体」
这两个文件缺一不可。我刚开始做项目时,有次只放了 model.sdf,结果 Gazebo 死活加载不出来。折腾了半天才发现,原来是忘了写 model.config。
model.config:模型的身份证
这个文件说白了就是告诉 Gazebo:「我叫什么名字,是谁做的,版本是多少」。内容很简单,但格式必须对。
<?xml version="1.0"?>
<model>
<name>my_robot</name>
<version>1.0.0</version>
<sdf version="1.6">model.sdf</sdf>
<author>
<name>张三</name>
<email>zhangsan@example.com</email>
</author>
<description>
一个简单的两轮差速机器人模型
</description>
</model>
嗯,这里要注意:<sdf version="1.6"> 这个版本号不能乱写。我见过有人写了 1.7,结果 Gazebo 直接报错。建议统一用 1.6,兼容性最好。
model.sdf:机器人的身体构造
这个文件才是重头戏。它定义了机器人的所有物理部件:形状、大小、重量、颜色,甚至关节怎么动。
一个最简单的 SDF 模型长这样:
<?xml version="1.0"?>
<sdf version="1.6">
<model name="my_robot">
<link name="base_link">
<pose>0 0 0.1 0 0 0</pose>
<inertial>
<mass>1.0</mass>
<inertia>
<ixx>0.1</ixx>
<iyy>0.1</iyy>
<izz>0.1</izz>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyz>0.0</iyz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.5 0.3 0.2</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.5 0.3 0.2</size>
</box>
</geometry>
<material>
<ambient>0.8 0.2 0.2 1.0</ampient>
</material>
</visual>
</link>
</model>
</sdf>
看到没?一个 link 就包含了三部分:
- inertial —— 惯性参数,说白了就是重量和转动惯量
- collision —— 碰撞检测用的形状
- visual —— 你看到的视觉效果
我个人习惯把 collision 和 visual 设成一样的大小。为什么?因为如果碰撞体比视觉体小,机器人可能会「穿模」——看着碰到了,实际没碰到。我曾经因为这个 bug 排查了一整天。
SDF 格式入门:别被 XML 吓到
SDF 其实就是 XML 的一种变体。你只要记住几个核心标签:
| 标签 | 作用 | 必填? |
|---|---|---|
| <link> | 定义刚体部件 | 是 |
| <joint> | 定义连接关系 | 有多个 link 时必填 |
| <pose> | 位置和姿态 | 推荐填写 |
| <geometry> | 形状定义 | 是 |
| <material> | 颜色材质 | 否 |
你想想看,一个机器人无非就是一堆 link 通过 joint 连起来。每个 link 有自己的形状和重量,joint 决定了它们怎么动。就这么简单。
模型坐标系:别搞反了方向
坐标系这个问题,我吃过不少亏。Gazebo 用的是右手坐标系:
- X 轴 —— 向前
- Y 轴 —— 向左
- Z 轴 —— 向上
为什么强调这个?因为很多 CAD 软件用的是不同的坐标系。比如 SolidWorks 默认 Z 轴向上,但有些软件 Y 轴向上。导入模型时如果不做转换,你的机器人可能会「躺」在地上。
每个 link 都有自己的局部坐标系。<pose> 标签里的六个数字,前三个是位置 (x, y, z),后三个是旋转 (roll, pitch, yaw)。单位分别是米和弧度。
<pose>0 0 0.1 0 0 0</pose>
这表示:在父坐标系的原点,向上偏移 0.1 米,没有旋转。
知识体系总览
下面这张图,帮你理清模型文件的核心结构:
好了,模型文件的基础就这些。说白了就是两个文件:一个告诉系统「我是谁」,一个告诉系统「我长什么样」。坐标系记住右手法则,别搞反了就行。
下一节我们会动手写一个真正的机器人模型,到时候你会看到这些知识点是怎么串起来的。