第1章 URDF基础入门

大家好,我是你们这门课的老朋友。做了这么多年机器人运动控制,我越来越觉得 URDF 是所有机器人建模的基石。你想想看,没有它,MoveIt 根本不知道你的机器人长什么样、关节在哪。今天咱们就从零开始,把 URDF 的老底摸清楚。

📌 第1章 知识体系 URDF 基础入门 什么是URDF 文件结构 + XML 第一个单连杆模型 XML语法 · link · visual · collision · inertial

1.1 什么是URDF?

URDF 全称是 Unified Robot Description Format,统一机器人描述格式。说白了,就是用 XML 写一个机器人的“身份证”。里面记录了机器人有多少个连杆、关节,长什么样子,重量多少,颜色如何。

我记得刚入行那会儿,带我的老工程师扔给我一个 URDF 文件说:“把这个看懂,你就能控制机器人了。” 我当时一脸懵,后来才发现——URDF 就是机器人的骨架。没有它,运动规划、碰撞检测全都无从谈起。

核心要点: URDF 只描述机器人的运动学与动力学属性,不包含控制器、传感器等运行时信息。它就像一张工程图纸,告诉系统“我长这样”。

1.2 URDF 文件结构

一个标准的 URDF 文件,根元素是 <robot>,里面主要包含两类东西:<link> 和 <joint>。我个人习惯把 link 想象成骨头,joint 就是连接骨头的关节。

来看一个最简结构:

<robot name="my_first_robot">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.2 0.2 0.1"/>
            </geometry>
        </visual>
    </link>
</robot>

嗯,这里要注意:<visual> 只负责显示,不影响物理碰撞。如果你要做仿真,还得加上 <collision> 和 <inertial>。我在项目中遇到过好几次,只写了 visual 没写 collision,结果 Gazebo 里机器人直接穿模……

1.3 XML 语法基础(够用就行)

URDF 基于 XML,但你不需要成为 XML 专家。记住这几条就够了:

  • 标签必须成对出现:<link>...</link>,自闭合标签用 <box/>。
  • 属性值用引号:name="base_link",单引双引都行,保持一致就好。
  • 区分大小写:<visual> 不能写成 <Visual>。
  • 注释:<!-- 这是注释 -->,调试时很有用。
我个人习惯把几何尺寸和颜色单独写在属性里,方便后期改参数。你想想看,如果每个 link 的尺寸都写死,后面改起来多痛苦。

1.4 第一个URDF模型:单连杆

咱们直接上手。创建一个 single_link.urdf 文件,内容如下:

<?xml version="1.0"?>
<robot name="single_link_demo">
    <link name="my_first_link">
        <visual>
            <geometry>
                <cylinder length="0.3" radius="0.1"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <material name="blue">
                <color rgba="0.2 0.4 0.9 1.0"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder length="0.3" radius="0.1"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="0.5"/>
            <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
        </inertial>
    </link>
</robot>

这个模型只有一个圆柱体连杆,蓝色,带碰撞和惯性参数。你可以用 check_urdf 命令验证:

$ check_urdf single_link.urdf

如果输出 Robot name is: single_link_demo 且没有报错,恭喜你,第一个 URDF 模型诞生了!

我曾经犯过一个低级错误:<inertia> 里的数值全写成了 0,结果仿真器直接崩溃。惯性矩阵不能为零,哪怕给个很小的值也行。

1.5 快速对照表:link 子元素

子元素是否必须作用
visual推荐可视化外观,用于显示
collision强烈推荐碰撞检测几何体
inertial仿真必需质量与惯性张量

你可能会问:为什么 collision 和 visual 要分开?我解释一下:显示可以用精细的网格模型,但碰撞检测用简单几何体(盒子、圆柱、球)效率更高。这是工程上的经典取舍。

好了,第一章的内容就到这里。URDF 看起来简单,但它是后面所有章节的根基。下一章我们会深入 link 和 joint 的各种属性,到时候你会发现自己已经能读懂大部分机器人模型了。