1. URDF 入门:什么是 URDF、它在 ROS 中的作用、文件结构概览
大家好,欢迎来到这门课。
我是你们的老朋友,一个在机器人堆里摸爬滚打了十几年的工程师。今天咱们正式开始聊 URDF。
URDF 是什么?说白了,它就是机器人的“身份证”加“骨架说明书”。
1.1 什么是 URDF?
URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。它是一个基于 XML 的语言,专门用来描述机器人的结构。
你可以把它想象成一张“机器人骨架图”。这张图里记录了:
- 机器人有哪些部件(比如:机身、左臂、右臂、轮子)
- 这些部件长什么样(形状、尺寸、颜色)
- 部件之间怎么连接的(关节类型、位置、朝向)
- 每个部件有多重、重心在哪、转动惯量是多少
我记得刚入行那会儿,有个同事把 URDF 当成了“万能配置文件”,想把 PID 参数也写进去。结果折腾了两天,系统直接崩溃。嗯,这里要记住:URDF 只管“长什么样”和“怎么动”,不管“怎么控制”。
1.2 URDF 在 ROS 中的作用
在 ROS 生态里,URDF 几乎是所有机器人应用的起点。为什么这么说?
你想想看,一个机器人要导航、要抓东西、要避障,它首先得知道自己长什么样吧?
URDF 在 ROS 中主要干这几件事:
- 提供运动学模型:告诉 ROS 机器人有多少个关节、每个关节能怎么转、连杆之间是什么关系。这是
robot_state_publisher节点计算 TF 变换的基础。 - 可视化与仿真:在 RViz 里看到机器人模型,或者在 Gazebo 里做仿真,都离不开 URDF。没有 URDF,你看到的就只是一堆坐标轴在乱飘。
- 碰撞检测与规划:MoveIt! 等运动规划库需要知道机器人的几何形状,才能做避障和路径规划。URDF 里定义的碰撞模型就是干这个的。
- 参数统一管理:所有结构相关的参数(连杆长度、关节限位、惯性参数)都集中在一个文件里,方便修改和维护。
我曾经在一个 AGV 项目里,因为 URDF 里轮子半径写错了 2 毫米,导致里程计累计误差越来越大,导航定位直接飘到墙外面去了。排查了整整一个下午,最后发现是 URDF 的问题。从那以后,我每次写完 URDF 都会用 check_urdf 工具先验证一遍。
1.3 URDF 文件结构概览
URDF 文件的结构其实很清晰。它由两种核心元素组成:连杆(link) 和 关节(joint)。
- link:描述机器人的一个刚性部件。比如一个基座、一个手臂段、一个轮子。
- joint:描述两个 link 之间的连接关系。比如一个旋转关节、一个滑动关节。
一个最简单的 URDF 文件,至少包含一个 link 和一个 joint。下面是一个示例:
<robot name="simple_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</visual>
</link>
<joint name="base_to_arm" type="fixed">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</joint>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.02"/>
</geometry>
<origin xyz="0 0 0.15" rpy="0 0 0"/>
</visual>
</link>
</robot>
这个例子描述了一个简单的机器人:一个方形的基座,上面固定了一根圆柱形的臂。
URDF 文件的基本结构可以用下面这张图来概括:
从这张图可以看得很清楚:URDF 文件以 <robot> 为根,下面包含多个 <link> 和 <joint>。每个 link 可以定义外观、碰撞模型和惯性参数;每个 joint 则定义了两个 link 之间的连接关系。
1.4 关键概念对比
为了帮你快速理清思路,我把 link 和 joint 的核心区别整理成了表格:
| 对比项 | link(连杆) | joint(关节) |
|---|---|---|
| 本质 | 刚性部件 | 连接关系 |
| 必填属性 | name | name, type |
| 核心子元素 | visual, collision, inertial | parent, child, origin, axis |
| 常见类型 | — | fixed, revolute, prismatic, continuous |
| 在 TF 树中的角色 | 坐标系节点 | 坐标系变换 |
1.5 关节类型速览
URDF 支持 6 种关节类型,但常用的只有 4 种。我列出来给你看看:
- fixed:固定关节,两个 link 之间没有相对运动。比如基座和机身之间的连接。
- revolute:旋转关节,绕一个轴转动,有角度限位。比如机械臂的肘关节。
- prismatic:滑动关节,沿一个轴直线移动,有位移限位。比如升降台。
- continuous:连续旋转关节,没有角度限位,可以一直转。比如轮子。
- floating:浮动关节,6 自由度运动,很少用。
- planar:平面关节,在平面上运动,也很少用。
我个人习惯,在项目初期先用 fixed 关节把整体骨架搭起来,然后再逐步替换成可动关节。这样调试起来比较稳,不会一上来就遇到运动学冲突。
1.6 本章小结
好了,这一章的内容就这些。我们聊了:
- URDF 是机器人的“骨架说明书”,用 XML 描述结构和运动学关系。
- 它在 ROS 中的作用是提供模型、支持可视化和仿真、辅助运动规划。
- 文件结构以
<robot>为根,核心是 link 和 joint 的交替组合。