第1章 · URDF基础入门

URDF,全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它就是 ROS 世界里用来描述机器人长什么样、胳膊腿怎么连的一套“机器人身份证”。我刚开始接触 ROS 时,觉得这东西不就是个 XML 嘛,能有多复杂?后来被真实机器人的关节限位坑过一次之后,才老老实实回来啃 URDF 的细节。

这一章,咱们就踏踏实实把 URDF 的底子打好。你不需要一次记住所有标签,但得明白它为什么存在、怎么组织、以及 link 和 joint 这两个核心概念。

URDF 知识体系 · 第一章核心 URDF 基础 在ROS中的作用 机器人描述 · 仿真 · 规划 文件结构解析 XML树 · 标签 · 属性 link + joint 刚体 · 运动副 · 树结构 link 是骨头,joint 是关节 —— 机器人模型就是一棵“运动树”

什么是 URDF?

URDF 是一种基于 XML 的文本格式。它用纯文本描述机器人的运动学树、几何形状、惯性参数、颜色材质等等。你可以把它想象成机器人的“骨架说明书”——告诉 ROS 你的机器人有几节骨头、每节骨头长什么样、关节能怎么转。

我个人习惯把 URDF 文件拆成两部分看:描述外观(视觉、碰撞)和描述运动(关节类型、父子关系)。很多初学者只盯着外观,结果一做运动规划就报错,就是因为 joint 的限位或者轴方向没写对。

💡 一句话记忆: URDF = 机器人的“身份证 + 骨架 + 运动说明书”。

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,并且定义了相对位置和旋转。

🔧 避坑指南: 我曾经在写 joint 时忘了加 <axis>,结果关节默认绕着 Z 轴转,但我的机器人需要绕 Y 轴旋转。MoveIt 规划出来的轨迹完全不对。所以,关节轴一定要显式声明,别偷懒。

机器人模型的基本组成:link 与 joint

这是 URDF 最核心的两个概念。我习惯用人体来类比:

  • link(连杆) —— 相当于骨骼,是刚体部分。每个 link 有视觉、碰撞、惯性参数。你可以把它想象成机器人的“一块铁”。
  • joint(关节) —— 相当于关节,连接两个 link,并决定它们之间的相对运动。joint 有类型:固定、旋转、棱柱、浮动等。

下面这个表格总结了最常见的 joint 类型,我建议你收藏一下:

类型说明自由度常见用途
fixed固定连接,不能运动0连接传感器、支架
revolute旋转关节,有角度限位1肩关节、肘关节
continuous连续旋转,无角度限位1车轮、转台
prismatic平移关节,有位置限位1伸缩臂、滑轨
floating6自由度浮动6移动基座(很少直接用)

你可能会问:为什么 joint 这么重要?因为 MoveIt 做运动规划时,就是通过 joint 的值来计算机器人位形的。没有正确的 joint 定义,规划器根本不知道你的机器人能怎么动。

⚠️ 注意: 每个 joint 必须有且仅有一个 parent link 和一个 child link。不能出现“多父节点”或“环路”(除非使用特殊插件)。URDF 本质是一棵树,不是图。

好了,第一章的内容就是这些。link 和 joint 就像机器人的“单词”,后面几章我们会用这些单词写出完整的“句子”——也就是真正的机器人模型。我个人建议你现在就打开一个文本编辑器,照着上面的例子写一个最简单的 URDF,然后用 check_urdf 工具检查一下。实践出真知嘛。