1 · URDF 模型基础
各位好,我是你们这门课的老朋友。今天咱们聊聊 URDF——机器人描述领域绕不开的一个东西。你想想看,做机器人仿真、建模仿真、甚至实物调试,第一步总得把机器人“说清楚”吧?URDF 就是干这个的。
什么是 URDF?
URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的文本文件,用来描述机器人的运动学、动力学、外观、甚至传感器位置。
我最早接触 URDF 是在做六轴机械臂仿真的时候。当时导师丢给我一个 .urdf 文件,让我在 Gazebo 里跑起来。我打开一看——好家伙,全是 <link> 和 <joint> 标签。后来才明白,这玩意儿就是机器人的“骨架说明书”。
URDF 在机器人系统中的作用
URDF 不是用来写业务逻辑的,它是给工具看的。ROS、Gazebo、MoveIt、Rviz……这些主流框架都靠 URDF 来理解你的机器人长什么样。
- 可视化 —— Rviz 加载 URDF 后直接显示 3D 模型,调试超直观。
- 运动学计算 —— 正逆解、TF 树全靠 URDF 里的关节定义。
- 碰撞检测 —— 规划路径时,URDF 的碰撞几何体用来算是否干涉。
- 仿真物理 —— Gazebo 读取 URDF 的惯性参数、摩擦系数,模拟真实动力学。
我记得有一次做移动机器人底盘,轮子没加摩擦参数,仿真里原地打滑。查了半天,就是 URDF 里少写了一行 <dynamics friction="0.8"/>。嗯,细节决定成败。
URDF 文件结构概览
一个标准的 URDF 文件,根标签是 <robot>,里面包含若干 <link> 和 <joint>。咱们直接看个迷你例子:
<robot name="simple_arm">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.1 0.05"/>
</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"/>
</joint>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.02"/>
</geometry>
</visual>
</link>
</robot>
这个模型描述了一个简单的两连杆臂:一个底座方块,一根旋转关节连着一根圆柱臂。你可能会问:“为什么关节里要写 origin 和 axis?” 因为关节的位置和旋转轴决定了运动学树怎么长。
URDF 知识体系一览
下面这张图是我自己梳理的 URDF 核心脉络,帮你快速建立全局感:
从图上你能看到,URDF 的核心就是 Link 和 Joint 这对搭档。Link 定义“有什么零件”,Joint 定义“零件之间怎么动”。再往上,ROS 生态里的工具直接消费这个描述。
parent 和 child 搞反了,结果 Rviz 里机械臂拧成了麻花。记住:parent 靠近基座,child 远离基座。方向反了,运动学树就乱了。
小结一下
URDF 不是什么高深的东西,它就是一份“机器人说明书”。用 XML 写清楚每个零件的形状、位置、关节类型,剩下的交给工具去解析。我个人觉得,学 URDF 最好的方式就是动手改一个现成的模型,比如把机械臂的连杆长度改一改,看看 Rviz 里怎么变。
这一章我们只搭了框架。下一章开始,我们会深入 XML 语法和每个标签的细节。嗯,不过那是后话了。先把基础概念吃透,后面写代码才不慌。