1. URDF 入门:什么是 URDF、它在 ROS 中的作用、文件结构概览

大家好,欢迎来到这门课。

我是你们的老朋友,一个在机器人堆里摸爬滚打了十几年的工程师。今天咱们正式开始聊 URDF。

URDF 是什么?说白了,它就是机器人的“身份证”加“骨架说明书”。

1.1 什么是 URDF?

URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。它是一个基于 XML 的语言,专门用来描述机器人的结构。

你可以把它想象成一张“机器人骨架图”。这张图里记录了:

  • 机器人有哪些部件(比如:机身、左臂、右臂、轮子)
  • 这些部件长什么样(形状、尺寸、颜色)
  • 部件之间怎么连接的(关节类型、位置、朝向)
  • 每个部件有多重、重心在哪、转动惯量是多少
核心要点: URDF 只描述“静态结构”和“运动学关系”,不描述控制逻辑、传感器数据处理或规划算法。

我记得刚入行那会儿,有个同事把 URDF 当成了“万能配置文件”,想把 PID 参数也写进去。结果折腾了两天,系统直接崩溃。嗯,这里要记住:URDF 只管“长什么样”和“怎么动”,不管“怎么控制”。

1.2 URDF 在 ROS 中的作用

在 ROS 生态里,URDF 几乎是所有机器人应用的起点。为什么这么说?

你想想看,一个机器人要导航、要抓东西、要避障,它首先得知道自己长什么样吧?

URDF 在 ROS 中主要干这几件事:

  1. 提供运动学模型:告诉 ROS 机器人有多少个关节、每个关节能怎么转、连杆之间是什么关系。这是 robot_state_publisher 节点计算 TF 变换的基础。
  2. 可视化与仿真:在 RViz 里看到机器人模型,或者在 Gazebo 里做仿真,都离不开 URDF。没有 URDF,你看到的就只是一堆坐标轴在乱飘。
  3. 碰撞检测与规划:MoveIt! 等运动规划库需要知道机器人的几何形状,才能做避障和路径规划。URDF 里定义的碰撞模型就是干这个的。
  4. 参数统一管理:所有结构相关的参数(连杆长度、关节限位、惯性参数)都集中在一个文件里,方便修改和维护。
我的经验: 我建议你在项目一开始就把 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 子元素 • <visual>:可视化外观 • <collision>:碰撞模型 • <inertial>:惯性参数 joint 子元素 • <parent>:父连杆 • <child>:子连杆 • <origin>:相对位姿 • <axis>:关节旋转/移动轴 URDF 文件结构要点 • 一个 <robot> 标签包含所有内容,name 属性必填 • link 和 joint 交替出现,形成树状结构 • 每个 joint 必须有且仅有一个 parent 和一个 child

从这张图可以看得很清楚: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 树中的角色 坐标系节点 坐标系变换
常见误区: 很多新手会把 link 和 joint 搞混。记住一句话:link 是“零件”,joint 是“连接件”。一个机器人可以有 N 个 link 和 N-1 个 joint(如果是树状结构)。如果 joint 数量比 link 少,说明有些 link 是“悬空”的,ROS 会报错。

1.5 关节类型速览

URDF 支持 6 种关节类型,但常用的只有 4 种。我列出来给你看看:

  • fixed:固定关节,两个 link 之间没有相对运动。比如基座和机身之间的连接。
  • revolute:旋转关节,绕一个轴转动,有角度限位。比如机械臂的肘关节。
  • prismatic:滑动关节,沿一个轴直线移动,有位移限位。比如升降台。
  • continuous:连续旋转关节,没有角度限位,可以一直转。比如轮子。
  • floating:浮动关节,6 自由度运动,很少用。
  • planar:平面关节,在平面上运动,也很少用。

我个人习惯,在项目初期先用 fixed 关节把整体骨架搭起来,然后再逐步替换成可动关节。这样调试起来比较稳,不会一上来就遇到运动学冲突。

1.6 本章小结

好了,这一章的内容就这些。我们聊了:

  • URDF 是机器人的“骨架说明书”,用 XML 描述结构和运动学关系。
  • 它在 ROS 中的作用是提供模型、支持可视化和仿真、辅助运动规划。
  • 文件结构以 <robot> 为根,核心是 link 和 joint 的交替组合。