第1章 · URDF入门

各位好,我是你们这门课的老朋友。做机器人这么多年,我越来越觉得URDF就像机器人的“身份证”——没有它,你的机器人就是个没名没姓的铁疙瘩。今天咱们就来聊聊URDF到底是什么,它凭什么这么重要,以及它的骨架长什么样。

1.1 什么是URDF?

URDF,全称是Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于XML的文本文件,用来描述机器人的运动学结构、外观、碰撞属性等等。你想想看,一个机器人有那么多连杆、关节、传感器,怎么让ROS认识它?URDF就是那座桥。

我个人习惯把URDF比作机器人的“骨架+皮肤”。骨架就是连杆和关节怎么连,皮肤就是长什么样、什么颜色。嗯,这里要注意:URDF只描述树状结构,不能有闭环。如果你搞了个并联机构,URDF就有点力不从心了——不过那是后话。

核心一句话: URDF = 机器人的自描述文件,ROS通过它知道你的机器人有几斤几两、胳膊腿怎么动。

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

作用太大了,我随便列几个场景你就明白了:

  • 可视化与调试: 在Rviz里看到机器人模型,靠的就是URDF。没有它,你只能对着黑屏想象。
  • 运动学计算: 正解、逆解、雅可比矩阵,底层全依赖URDF定义的关节和连杆关系。
  • 仿真与验证: Gazebo里跑机器人,URDF是必须的入场券。我记得有一次项目里,同事忘了加碰撞标签,机器人直接穿模到地底下……
  • 导航与规划: MoveIt! 做路径规划,首先要加载URDF才能知道机器人的尺寸和关节限位。

你可能会问:“没有URDF行不行?” 理论上你可以手动发布TF树,但那就跟你不用地图走路一样——能走,但大概率撞墙。URDF把这一切自动化了。

💡 我的经验: 刚开始学URDF时,我总想一口气写一个完整的机器人模型。后来发现,从最简单的“两个连杆一个关节”开始,逐步迭代,反而更快。别贪心。

1.3 URDF文件的基本结构

URDF文件的结构非常清晰,像一棵倒挂的树。最外层是 <robot> 标签,里面包含两种核心元素:<link> 和 <joint>。我画了一张图,帮你一眼看明白:

<robot> <link> <joint> visual / collision / inertial parent / child / origin / axis 一个 robot 包含多个 link 和 joint link 描述刚体,joint 描述连接与运动

来看一个最简的URDF例子,只有两个连杆和一个关节:

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

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

    <joint name="arm_joint" type="fixed">
        <parent link="base_link"/>
        <child link="arm_link"/>
        <origin xyz="0 0 0.1" rpy="0 0 0"/>
    </joint>
</robot>

这个文件虽然简单,但五脏俱全。你看到了 <robot> 根标签,两个 <link> 分别定义了底座和手臂的几何形状,一个 <joint> 把它们连起来,并指定了相对位置。

⚠️ 避坑指南: 我曾经在项目里把 joint 的 parent 和 child 写反了,结果机器人模型在Rviz里拧成了麻花。记住:parent 是靠近世界坐标系的那一端,child 是远离的那一端。

1.4 核心元素速览

为了让你快速上手,我把URDF里最常用的标签整理成了表格:

标签作用必填属性
<robot>根标签,包裹所有描述name
<link>定义刚体(连杆)name
<joint>定义关节(连接关系)name, type
<visual>连杆的可视外观(可选,但推荐)
<collision>碰撞检测模型(可选,仿真常用)
<inertial>惯性参数(质量、惯量)(可选,动力学需要)

你可能会发现,<visual> 和 <collision> 长得差不多。没错,它们都可以包含几何体。但我的建议是:可视化用精细模型,碰撞用简化模型——这样仿真跑得快,看着又漂亮。

🔧 小技巧: 如果你只是做可视化,<inertial> 可以暂时不写。但如果你要上Gazebo或者做动力学控制,惯性参数必须给准,否则机器人会像在太空中飘。

1.5 为什么从URDF开始?

因为它是整个机器人软件栈的基石。没有URDF,TF树就是无源之水;没有URDF,MoveIt! 不知道你的机器人胳膊有多长;没有URDF,导航堆栈也不知道你的车有多宽。我见过太多新手一上来就调导航,结果机器人卡在门框里——其实就是URDF里少写了一个碰撞盒子。

所以,踏踏实实把URDF搞明白,后面所有章节都会顺风顺水。嗯,这一章我们先把概念和结构刻在脑子里,下一章开始动手写标签。