第1章 · URDF基础入门

什么是URDF?它在机器人开发里到底扮演什么角色? 这一章我们直接上手,把最核心的概念理清楚。

1.1 什么是URDF?

URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的“机器人说明书”。你想想看,一个机器人有多少个关节、连杆长什么样、轮子装在哪、传感器怎么固定……这些信息全得告诉计算机。URDF 就是干这个的。

我最早接触 URDF 是在做一个轮式底盘项目,当时想用 Gazebo 仿真,结果模型怎么都站不稳。后来才发现,是关节坐标系写反了。嗯,从那以后我对 URDF 的每个标签都特别敏感。

核心要点: URDF 用树状结构描述机器人 —— 一个根节点(base_link),下面挂载各种连杆(link)和关节(joint)。每个关节连接两个连杆,并定义它们的相对位置和运动方式。

1.2 URDF在机器人开发中的作用

没有 URDF,很多工具根本跑不起来。我列几个最常用的场景:

  • 可视化与调试 —— 在 RViz 里看到机器人模型,检查尺寸、关节限位是否合理。
  • 运动学计算 —— 解析 URDF 里的关节树,自动生成正逆运动学解。
  • 仿真与物理引擎 —— Gazebo、Webots 等仿真器直接读取 URDF,赋予模型质量、惯性、碰撞属性。
  • 导航与规划 —— MoveIt!、Nav2 等框架依赖 URDF 获取机器人外形和关节信息。

你可能会问:没有 URDF 行不行?
理论上可以自己写解析器,但 ROS 生态里几乎所有工具都原生支持 URDF。我个人习惯是,哪怕做一个极简的原型,也会先搭一个 URDF 文件出来,后面省太多事了。

我在项目里见过有人把 URDF 当成“一次性文件”,写完就不管了。其实它应该像代码一样持续维护 —— 加一个传感器就更新一下,改一个连杆长度就同步修改。不然仿真和实物对不上,排查起来很痛苦。

1.3 第一个URDF文件结构

直接看一个最简单的例子。一个两轮小车底盘,包含一个车身和两个轮子。麻雀虽小,五脏俱全。

<?xml version="1.0"?>
<robot name="simple_car">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.3 0.1"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0"/>
        </visual>
    </link>

    <joint name="left_wheel_joint" type="continuous">
        <parent link="base_link"/>
        <child link="left_wheel"/>
        <origin xyz="-0.2 0.2 0" rpy="0 0 0"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="left_wheel">
        <visual>
            <geometry>
                <cylinder radius="0.05" length="0.04"/>
            </geometry>
        </visual>
    </link>

    <joint name="right_wheel_joint" type="continuous">
        <parent link="base_link"/>
        <child link="right_wheel"/>
        <origin xyz="-0.2 -0.2 0" rpy="0 0 0"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="right_wheel">
        <visual>
            <geometry>
                <cylinder radius="0.05" length="0.04"/>
            </geometry>
        </visual>
    </link>
</robot>

这个文件里,<robot> 是根标签,name 属性随便起,但最好有意义。<link> 定义刚体部件,<joint> 定义连接关系。每个 <visual> 里指定几何形状和位置。

我曾经犯过一个低级错误:两个轮子的 joint 类型写成了 "fixed",结果仿真里轮子根本不会转。检查了半天才发现 type 写错了。所以关节类型一定要和实际匹配 —— 轮子用 continuous,摆臂用 revolute,固定件用 fixed。

1.4 URDF 知识结构总览

下面这张图帮你把本章的核心逻辑串起来。从根标签到 link/joint,再到属性和用途,一目了然。

<robot> 根标签 <link> 连杆 <joint> 关节 visual / collision 几何、惯性、材质 类型、父子、原点、轴 可视化/碰撞网格 URDF 以树状结构描述机器人:一个根 link,多个子 link 通过 joint 连接 每个 link 可包含 visual / collision / inertial 等子元素

1.5 快速上手:验证你的第一个URDF

写完 URDF 怎么知道对不对?我一般用两个方法:

  1. 命令行检查 —— 在终端运行 check_urdf your_model.urdf,它会告诉你语法错误和关节树信息。
  2. RViz 可视化 —— 用 urdf_to_graphiz 生成关系图,或者直接 launch 到 RViz 里看三维模型。

我个人习惯是写完一小段就检查一次,别等整个模型堆到几百行再查,那时候找 bug 找到崩溃。

如果你用的是 ROS2,URDF 的格式完全一样,只是工具链有些变化。比如 check_urdf 在 ROS2 里被整合到了 urdf_parser_plugin 中。但核心概念不变,放心学。

好,这一章我们搞清楚了 URDF 是什么、能干什么、长什么样。下一章我们会深入拆解 link 和 joint 的每一个属性,包括坐标系、惯性参数、碰撞模型…… 嗯,不过那是下一章的事。先把基础打牢,后面才飞得起来。