第1章 · URDF基础入门

什么是URDF?机器人描述格式的起源与核心思想。

各位好,我是你们这门课的老朋友。做机器人仿真这么多年,我越来越觉得——URDF 就像机器人的“身份证”。没有它,你的机器人就是个没名没姓的铁疙瘩。今天咱们就来聊聊,URDF 到底是个啥,它从哪来,以及它背后那个简单的要命的核心思想。

1.1 从一段“痛苦”的经历说起

我记得刚入行那会儿,团队里做导航的同事天天抱怨:“这个轮子到底装在哪?底盘高度是多少?” 每个人手里一份 Excel 表格,标着各种尺寸,但一放到仿真里就乱套。后来我们统一用 URDF 描述机器人,所有信息都写在一个文件里。嗯,世界清净了。

说白了,URDF 就是 Unified Robot Description Format(统一机器人描述格式)的缩写。它用 XML 语言把机器人的身体结构、关节、传感器、甚至外观颜色,全都说清楚。你想想看,一个机器人有多少个连杆?关节怎么转?轮子半径多大?这些信息,URDF 全包了。

💡 核心思想就一句话: 用树形结构描述机器人的运动链。每个刚体是一个 <link>,每个活动关节是一个 <joint>,父子关系构成一棵树。

1.2 起源:为什么会有URDF?

大概在 2008 年左右,ROS 刚刚起步。那时候大家描述机器人各用各的格式——有人用 XML,有人写脚本,还有人直接在代码里硬编码尺寸。我见过最离谱的,是把机器人参数写在 Excel 里,然后手动转成 C++ 结构体……

所以 ROS 社区决定搞一个统一标准。URDF 就这么诞生了。它借鉴了当时一些工业机器人描述语言的经验,但更轻量、更贴近科研和教学。我个人觉得,URDF 最大的贡献不是语法多漂亮,而是让“仿真”和“真机”用同一套参数。你调好的模型,直接拿去跑 Gazebo,再也不用二次翻译。

🔧 避坑指南: 我曾经在项目里见过有人把 URDF 当成“一次性文件”,写完就不管了。结果真机换了个电机,URDF 没更新,仿真和实物对不上,查了两天 bug。记住:URDF 是活文档,必须和实物同步。

1.3 URDF 的核心思想:树、坐标、复用

URDF 的设计哲学其实特别朴素。我总结成三个词:

  • 树形结构 —— 机器人从基座开始,每个零件挂在上一个零件下面。没有环,没有交叉,就是一棵树。
  • 坐标变换 —— 每个 <joint> 定义了两个连杆之间的相对位置和旋转。你想想看,只要知道每个关节的变换,整个机器人的姿态就全算出来了。
  • 可复用 —— 虽然原生 URDF 不支持变量和宏,但后来 Xacro 补上了这个短板(后面章节会细讲)。但即便只用纯 URDF,你也可以通过 <include> 等方式组织文件。
URDF 核心思想 🌳 树形结构 link / joint 父子关系 📐 坐标变换 原点 · 旋转 · 平移 ♻️ 可复用 Xacro / 模块化 基座 link 关节 joint 连杆 link 传感器 碰撞模型 视觉 所有元素通过树形坐标组合成完整机器人描述

1.4 一个最简单的URDF长什么样?

别急着写复杂模型。咱们先看一个只有两个连杆和一个关节的“哑铃”模型。你感受一下结构:

<?xml version="1.0"?>
<robot name="my_first_robot">
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder length="0.2" radius="0.05"/>
            </geometry>
        </visual>
    </link>

    <joint name="joint1" type="fixed">
        <parent link="base_link"/>
        <child link="top_link"/>
        <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </joint>

    <link name="top_link">
        <visual>
            <geometry>
                <sphere radius="0.08"/>
            </geometry>
        </visual>
    </link>
</robot>

你看,<robot> 是根标签,里面包着 <link> 和 <joint>。每个 link 定义外观(visual),joint 定义父子关系。就这么简单。我刚开始学的时候,觉得这玩意儿跟搭积木一样——一个零件一个零件往上堆。

⚠️ 注意: URDF 要求所有 joint 必须连接两个不同的 link,不能出现悬空的 joint。而且整棵树只能有一个根 link(没有父 joint 的那个)。如果你忘了定义根 link,Rviz 会直接报错。

1.5 为什么 URDF 至今仍是主流?

有人可能会问:现在都 2025 年了,为什么还在用 URDF?其实我也用过其他格式,比如 SDF、MJCF。但 URDF 在 ROS 生态里太深了。你随便找一个开源机器人,几乎都有 URDF 文件。而且它足够简单——一个文本编辑器就能改,不需要编译,不需要数据库。

我个人习惯把 URDF 比作“机器人的简历”。它不完美,但招聘方(ROS、Gazebo、MoveIt)都认它。你想想看,生态的力量有多强大。

特性URDFSDFMJCF
ROS 原生支持✅ 一等公民✅ 支持需转换
学习曲线低中中高
动态仿真需配合 Gazebo原生支持原生支持
可读性高(XML 直观)中中
适用场景ROS 机器人原型复杂仿真环境物理引擎调优

▲ 不同机器人描述格式的简单对比。URDF 在 ROS 领域依然是最通用的选择。

💬 我的经验: 如果你只是做 ROS 仿真、导航、机械臂控制,URDF 完全够用。别被其他格式吓到。等你把 URDF 玩熟了,再去看 SDF 会觉得豁然开朗。

1.6 本章小结

URDF 不是什么高深的东西。它就是一套用 XML 写机器人“骨架”的规则。核心思想是树形结构 + 坐标变换。起源是为了让 ROS 生态里的机器人能互相理解。你只要记住:link 是骨头,joint 是关节,剩下的都是细节。

下一章我们会把 URDF 放到 ROS 的大背景里,看看它到底怎么跟节点、话题、TF 玩到一起。不过别急,先把今天的概念消化掉。嗯,咱们慢慢来。