第1章 · URDF基础概念
什么是URDF · 在ROS中的作用 · 文件结构解析
1.1 什么是URDF?
URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的文本文件,用来描述机器人的物理结构——长什么样、有哪些部件、部件之间怎么连接。
我最早接触 URDF 是在做差分轮动底盘的时候。当时想给机器人加一个激光雷达支架,结果发现只要改几行 XML,就能在仿真里看到完整的底盘+雷达模型。嗯,这种“所见即所得”的感觉,确实让人上瘾。
1.2 URDF 在 ROS 中的作用
在 ROS 生态里,URDF 几乎是所有机器人模型的“通用语言”。你想想看,没有 URDF 的话,每个节点都得自己写一套几何描述,那得多乱?
- 可视化 —— RViz 直接加载 URDF,你就能看到机器人三维模型,还能拖动关节。
- 仿真 —— Gazebo 等仿真器通过 URDF 获取惯性、碰撞参数,实现物理模拟。
- 导航与规划 —— move_base、AMCL 等模块通过 URDF 知道机器人 footprint,避免规划路径时把自己卡住。
- 坐标变换 —— robot_state_publisher 自动发布 TF 树,所有部件之间的坐标关系一目了然。
我记得有一次,团队里新同事把 link 的 origin 写反了,结果机器人模型在 RViz 里“身首异处”。排查了半天,最后发现就是 URDF 里一个坐标偏移写错了。自那以后,我每次写完 URDF 都会用 check_urdf 工具扫一遍。
urdf/ 目录下,并用 xacro 做参数化,方便后期维护。
1.3 URDF 文件结构解析
一个标准的 URDF 文件,本质上是一棵由 <link> 和 <joint> 组成的树。根节点通常是一个 <robot> 标签,里面包含若干 link 和 joint。
来看一个最简示例:
<robot name="simple_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<origin xyz="0.2 0.15 0" rpy="0 0 0"/>
</joint>
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.05" length="0.04"/>
</geometry>
</visual>
</link>
</robot>
这个模型描述了一个底盘(base_link)和左边一个轮子。joint 定义了轮子相对于底盘的安装位置和旋转类型。
1.4 核心标签速查
| 标签 | 作用 | 常用子标签 |
|---|---|---|
| <robot> | 根元素,包含 name 属性 | link, joint |
| <link> | 定义刚体部件(视觉、碰撞、惯性) | visual, collision, inertial |
| <joint> | 定义两个 link 之间的连接关系 | parent, child, origin, axis, limit |
| <visual> | 外观几何(用于显示) | geometry, origin, material |
| <collision> | 碰撞检测几何(通常比 visual 更简化) | geometry, origin |
| <inertial> | 惯性参数(质量、惯性张量) | mass, inertia |
<inertial> 里忘了填 <inertia> 矩阵,结果 Gazebo 仿真时机器人直接“飘”起来。每个 link 都必须有完整的惯性数据,否则物理引擎会罢工。
1.5 关节类型一览
URDF 支持 6 种关节类型,我按使用频率排了个序:
- continuous —— 连续旋转关节(轮子、转台),没有角度限制。
- revolute —— 有限旋转关节(关节臂),有角度上下限。
- prismatic —— 滑动关节(伸缩机构),沿直线运动。
- fixed —— 固定连接(传感器支架),两个 link 之间无相对运动。
- floating —— 浮动关节(6自由度),一般用于移动基座与世界的连接。
- planar —— 平面关节(2平移+1旋转),不常用。
我个人最常用的是 continuous 和 revolute。做四轮小车时,四个轮子全是 continuous;做机械臂时,每个关节都是 revolute 加限位。
1.6 一个小经验
刚开始写 URDF 的人,容易把 <origin> 里的 rpy 搞混。记住:rpy 是 roll、pitch、yaw,单位是弧度。我曾经把 pitch 和 roll 写反,结果轮子斜着装在底盘上,跑起来像螃蟹。嗯,调试的时候差点笑出声。
另外,<visual> 和 <collision> 可以共用同一个 geometry,但为了性能,碰撞模型通常用更简单的形状(比如用 box 代替 mesh)。