1 · URDF 模型基础

各位好,我是你们这门课的老朋友。今天咱们聊聊 URDF——机器人描述领域绕不开的一个东西。你想想看,做机器人仿真、建模仿真、甚至实物调试,第一步总得把机器人“说清楚”吧?URDF 就是干这个的。

什么是 URDF?

URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的文本文件,用来描述机器人的运动学、动力学、外观、甚至传感器位置。

我最早接触 URDF 是在做六轴机械臂仿真的时候。当时导师丢给我一个 .urdf 文件,让我在 Gazebo 里跑起来。我打开一看——好家伙,全是 <link> 和 <joint> 标签。后来才明白,这玩意儿就是机器人的“骨架说明书”。

核心要点: URDF 把机器人拆成一个个刚体(link),用关节(joint)把它们连起来,再配上几何、惯性、碰撞属性。一个文件就是一个完整的机器人模型。

URDF 在机器人系统中的作用

URDF 不是用来写业务逻辑的,它是给工具看的。ROS、Gazebo、MoveIt、Rviz……这些主流框架都靠 URDF 来理解你的机器人长什么样。

  • 可视化 —— Rviz 加载 URDF 后直接显示 3D 模型,调试超直观。
  • 运动学计算 —— 正逆解、TF 树全靠 URDF 里的关节定义。
  • 碰撞检测 —— 规划路径时,URDF 的碰撞几何体用来算是否干涉。
  • 仿真物理 —— Gazebo 读取 URDF 的惯性参数、摩擦系数,模拟真实动力学。

我记得有一次做移动机器人底盘,轮子没加摩擦参数,仿真里原地打滑。查了半天,就是 URDF 里少写了一行 <dynamics friction="0.8"/>。嗯,细节决定成败。

💡 个人习惯: 我一般先画一个简化的连杆图,再写 URDF。这样关节编号、坐标系方向不容易乱。你也不妨试试。

URDF 文件结构概览

一个标准的 URDF 文件,根标签是 <robot>,里面包含若干 <link> 和 <joint>。咱们直接看个迷你例子:

<robot name="simple_arm">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.2 0.1 0.05"/>
            </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"/>
    </joint>

    <link name="arm_link">
        <visual>
            <geometry>
                <cylinder length="0.3" radius="0.02"/>
            </geometry>
        </visual>
    </link>
</robot>

这个模型描述了一个简单的两连杆臂:一个底座方块,一根旋转关节连着一根圆柱臂。你可能会问:“为什么关节里要写 origin 和 axis?” 因为关节的位置和旋转轴决定了运动学树怎么长。

URDF 知识体系一览

下面这张图是我自己梳理的 URDF 核心脉络,帮你快速建立全局感:

URDF 模型 Link(刚体) 视觉 / 碰撞 惯性参数 Joint(关节) 类型 / 轴 / 原点 父 / 子 link ROS / Gazebo / MoveIt 使用 URDF 是机器人建模的“通用语言”

从图上你能看到,URDF 的核心就是 Link 和 Joint 这对搭档。Link 定义“有什么零件”,Joint 定义“零件之间怎么动”。再往上,ROS 生态里的工具直接消费这个描述。

⚠️ 避坑指南: 我曾经在写 URDF 时把 joint 的 parent 和 child 搞反了,结果 Rviz 里机械臂拧成了麻花。记住:parent 靠近基座,child 远离基座。方向反了,运动学树就乱了。

小结一下

URDF 不是什么高深的东西,它就是一份“机器人说明书”。用 XML 写清楚每个零件的形状、位置、关节类型,剩下的交给工具去解析。我个人觉得,学 URDF 最好的方式就是动手改一个现成的模型,比如把机械臂的连杆长度改一改,看看 Rviz 里怎么变。

这一章我们只搭了框架。下一章开始,我们会深入 XML 语法和每个标签的细节。嗯,不过那是后话了。先把基础概念吃透,后面写代码才不慌。