3 · 第一个URDF文件
创建最简单的机器人模型(单连杆)· 用 urdf_to_graphiz 可视化
说实话,很多教程一上来就让你写一个完整的机器人,底盘、轮子、传感器全塞进去。我个人习惯相反——先做一个“能跑起来”的最小模型。哪怕只是一个孤零零的连杆,只要它能被解析、被可视化,你就已经迈出了最扎实的一步。
这一章,我们就来写第一个URDF文件。它只有一个连杆,没有关节,没有运动学。听起来简单?嗯,但这里面藏着不少细节。我当年第一次写URDF时,连标签大小写都搞错过,折腾了半小时才发现……
3.1 单连杆模型长什么样?
说白了,一个连杆就是机器人身上的一个刚体部件。它可以是一块金属、一个外壳,甚至只是一个抽象的参考坐标系。在URDF里,我们用 <link> 标签来描述它。
下面这个例子,定义了一个名叫 base_link 的连杆。它有一个视觉外观(一个圆柱体),以及一个碰撞形状(也是圆柱体)。
<?xml version="1.0"?>
<robot name="my_first_robot">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.2" radius="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</visual>
<collision>
<geometry>
<cylinder length="0.2" radius="0.1"/>
</geometry>
</collision>
</link>
</robot>
3.2 保存文件 & 命名规范
把上面的代码保存为 first_robot.urdf。我个人建议文件名全部小写,用下划线分隔。虽然URDF解析器不强制,但团队协作时统一风格能省很多麻烦。
| 元素 | 要求 | 我的经验 |
|---|---|---|
| 文件名 | 小写 + .urdf 后缀 | 别用空格!我曾经被空格坑过,后来一律用下划线 |
| robot name | 字母开头,无特殊符号 | 最好和项目名一致,方便识别 |
| link name | 语义清晰,如 base_link | 我习惯用 snake_case |
3.3 使用 urdf_to_graphiz 可视化
URDF 自带了一个命令行小工具叫 urdf_to_graphiz。它能根据你的URDF文件生成一张结构图,展示连杆和关节的树状关系。虽然我们现在只有一个连杆,但跑一下这个工具,能确认你的文件被正确解析了。
在终端里运行:
urdf_to_graphiz first_robot.urdf
如果一切正常,你会看到类似这样的输出:
Created file first_robot.gv
Created file first_robot.pdf
✅ 看到这两个文件生成,就说明你的URDF语法没问题,工具链也通了。我第一次成功跑出PDF时,还挺有成就感的——虽然只是一个圆柱体。
打开 first_robot.pdf(或者用任何能打开 .gv 的工具),你会看到一个单独的方框,里面写着 base_link。没有关节,没有连线,就一个孤零零的节点。但别小看它——这是你亲手搭建的第一个机器人模型。
urdf_to_graphiz 时报错 “Error: no element found”,八成是XML格式问题。检查第一行 <?xml version="1.0"?> 有没有写对,或者文件是不是保存成了UTF-8 with BOM。我那次就是编辑器偷偷加了BOM,折腾了十分钟。
3.4 验证模型的其他方法
除了 graphiz,你还可以用 check_urdf 命令做基础检查:
check_urdf first_robot.urdf
它会输出连杆数量、关节数量,以及一些基本统计。对于单连杆模型,输出大概是这样:
robot name: my_first_robot
---------- Successfully Parsed XML ----------
Number of links: 1
Number of joints: 0
---------- link: base_link
看到 “Successfully Parsed XML” 就放心了。我个人习惯把 check_urdf 和 urdf_to_graphiz 组合使用,一个查数据,一个看结构,互补。
3.5 关于坐标系和原点
你可能注意到了,我们在 <origin> 里写了 xyz="0 0 0" rpy="0 0 0"。对于单连杆来说,这个原点就是连杆自身的参考系中心。圆柱体的几何中心就在 (0,0,0),没有旋转。
你想想看,如果以后给这个连杆加上关节,关节的位置就是相对于这个原点来定义的。所以一开始就把原点搞清楚,后面会省很多事。
0.2,长度改成 0.4,重新运行 urdf_to_graphiz 和 check_urdf。观察输出有什么变化?——其实结构图完全一样,因为graphiz只显示拓扑,不显示尺寸。但 check_urdf 会正常解析新的几何参数。
好了,第一个URDF文件已经跑通了。你有了一个可以被解析、被可视化的单连杆模型。虽然它不会动,但它是你机器人模型的基石。下一章我们会深入连杆的各个细节,但今天先享受一下“Hello World”级别的成就感吧。