第1章 · URDF基础入门
URDF,全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它就是 ROS 世界里用来描述机器人长什么样、胳膊腿怎么连的一套“机器人身份证”。我刚开始接触 ROS 时,觉得这东西不就是个 XML 嘛,能有多复杂?后来被真实机器人的关节限位坑过一次之后,才老老实实回来啃 URDF 的细节。
这一章,咱们就踏踏实实把 URDF 的底子打好。你不需要一次记住所有标签,但得明白它为什么存在、怎么组织、以及 link 和 joint 这两个核心概念。
什么是 URDF?
URDF 是一种基于 XML 的文本格式。它用纯文本描述机器人的运动学树、几何形状、惯性参数、颜色材质等等。你可以把它想象成机器人的“骨架说明书”——告诉 ROS 你的机器人有几节骨头、每节骨头长什么样、关节能怎么转。
我个人习惯把 URDF 文件拆成两部分看:描述外观(视觉、碰撞)和描述运动(关节类型、父子关系)。很多初学者只盯着外观,结果一做运动规划就报错,就是因为 joint 的限位或者轴方向没写对。
URDF 在 ROS 中的作用
在 ROS 生态里,URDF 几乎是所有机器人相关工具的起点。你想想看:
- 可视化 —— RViz 通过 URDF 显示机器人模型;
- 仿真 —— Gazebo 需要 URDF 来加载机器人(加上一些仿真插件);
- 运动规划 —— MoveIt 基于 URDF 构建规划场景、求解运动学;
- 导航 —— 虽然导航主要用地图,但机器人 footprint 也常从 URDF 获取。
我记得有一次帮同事调试,他的机器人始终无法在 RViz 中显示正确的姿态。折腾了半天,发现是 URDF 里 joint 的 parent 和 child 写反了。嗯,这种错误其实挺常见的,所以一开始就要理清父子关系。
URDF 文件结构解析
一个标准的 URDF 文件,根标签是 <robot>,里面包含若干 <link> 和 <joint>。来看一个最简示例:
<robot name="simple_arm">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
<joint name="shoulder_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1"/>
</joint>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.4" radius="0.04"/>
</geometry>
</visual>
</link>
</robot>
结构其实很清晰:<robot> 是根,里面 link 和 joint 交替出现,形成一棵树。每个 joint 连接两个 link,并且定义了相对位置和旋转。
<axis>,结果关节默认绕着 Z 轴转,但我的机器人需要绕 Y 轴旋转。MoveIt 规划出来的轨迹完全不对。所以,关节轴一定要显式声明,别偷懒。
机器人模型的基本组成:link 与 joint
这是 URDF 最核心的两个概念。我习惯用人体来类比:
- link(连杆) —— 相当于骨骼,是刚体部分。每个 link 有视觉、碰撞、惯性参数。你可以把它想象成机器人的“一块铁”。
- joint(关节) —— 相当于关节,连接两个 link,并决定它们之间的相对运动。joint 有类型:固定、旋转、棱柱、浮动等。
下面这个表格总结了最常见的 joint 类型,我建议你收藏一下:
| 类型 | 说明 | 自由度 | 常见用途 |
|---|---|---|---|
| fixed | 固定连接,不能运动 | 0 | 连接传感器、支架 |
| revolute | 旋转关节,有角度限位 | 1 | 肩关节、肘关节 |
| continuous | 连续旋转,无角度限位 | 1 | 车轮、转台 |
| prismatic | 平移关节,有位置限位 | 1 | 伸缩臂、滑轨 |
| floating | 6自由度浮动 | 6 | 移动基座(很少直接用) |
你可能会问:为什么 joint 这么重要?因为 MoveIt 做运动规划时,就是通过 joint 的值来计算机器人位形的。没有正确的 joint 定义,规划器根本不知道你的机器人能怎么动。
好了,第一章的内容就是这些。link 和 joint 就像机器人的“单词”,后面几章我们会用这些单词写出完整的“句子”——也就是真正的机器人模型。我个人建议你现在就打开一个文本编辑器,照着上面的例子写一个最简单的 URDF,然后用 check_urdf 工具检查一下。实践出真知嘛。