第1章 · URDF基础概念

什么是URDF · 在ROS中的作用 · 文件结构解析

URDF 核心 📌 统一机器人描述格式 ⚙️ ROS 模型描述标准 📂 link + joint 树 连杆 · 惯性 · 碰撞 关节类型 · 运动学 URDF = 机器人模型的“骨架” + “关节字典”

1.1 什么是URDF?

URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的文本文件,用来描述机器人的物理结构——长什么样、有哪些部件、部件之间怎么连接。

我最早接触 URDF 是在做差分轮动底盘的时候。当时想给机器人加一个激光雷达支架,结果发现只要改几行 XML,就能在仿真里看到完整的底盘+雷达模型。嗯,这种“所见即所得”的感觉,确实让人上瘾。

核心要点: URDF 只描述机器人的运动学和动力学属性,不包含控制逻辑或传感器数据处理。它就是一个“模型说明书”。

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 文件放在机器人功能包的 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 种关节类型,我按使用频率排了个序:

  1. continuous —— 连续旋转关节(轮子、转台),没有角度限制。
  2. revolute —— 有限旋转关节(关节臂),有角度上下限。
  3. prismatic —— 滑动关节(伸缩机构),沿直线运动。
  4. fixed —— 固定连接(传感器支架),两个 link 之间无相对运动。
  5. floating —— 浮动关节(6自由度),一般用于移动基座与世界的连接。
  6. planar —— 平面关节(2平移+1旋转),不常用。

我个人最常用的是 continuous 和 revolute。做四轮小车时,四个轮子全是 continuous;做机械臂时,每个关节都是 revolute 加限位。

1.6 一个小经验

刚开始写 URDF 的人,容易把 <origin> 里的 rpy 搞混。记住:rpy 是 roll、pitch、yaw,单位是弧度。我曾经把 pitch 和 roll 写反,结果轮子斜着装在底盘上,跑起来像螃蟹。嗯,调试的时候差点笑出声。

另外,<visual> 和 <collision> 可以共用同一个 geometry,但为了性能,碰撞模型通常用更简单的形状(比如用 box 代替 mesh)。

本章小结: URDF 是 ROS 机器人模型的基石。它用 link 和 joint 搭建出完整的运动学树,支撑起可视化、仿真、导航等一系列功能。理解文件结构、熟悉核心标签,是后续所有章节的基础。