1 · URDF基础入门

各位好,我是你们这门课的工程师讲师。今天咱们聊聊URDF——统一机器人描述格式。说白了,它就是机器人的“身份证”加“骨架说明书”。你想想看,要让机器人动起来、仿真起来,总得告诉计算机你的机器人长什么样、关节在哪、轮子怎么转吧?URDF就是干这个的。

URDF XML语法 Link + Joint 文件结构 第一个模型 URDF = 机器人描述的核心骨架

什么是URDF?

URDF全称 Unified Robot Description Format,是ROS生态里描述机器人几何、关节、运动学链的标准。我最早接触URDF是在做一个差分驱动底盘项目,当时为了把轮子位置调对,折腾了一下午。后来发现,其实就是几个link和joint的事。

它用XML写,所以可读性不错。你不需要是编程高手,只要理解标签、属性、嵌套,就能搭出一个完整的机器人模型。

💡 核心思想: 机器人 = 若干刚体(link) + 关节(joint)连接成树状结构。

URDF文件结构

一个标准的URDF文件,根标签是 <robot>,里面包含多个 <link> 和 <joint>。我习惯把link想象成骨头,joint就是关节软骨。嗯,这样好记。

  • <link> —— 定义刚体:形状、尺寸、颜色、惯性参数。
  • <joint> —— 定义连接:类型(固定、旋转、滑动等)、父子关系、坐标变换。

举个例子,一个简单的两轮机器人,至少需要:底盘link、左轮link、右轮link,以及两个轮子关节。

XML语法基础(快速上手)

URDF用的是标准XML。你只要记住三条:

  1. 标签必须成对出现:<tag> ... </tag> 或自闭合 <tag />
  2. 属性用引号括起来:<geometry> <box size="1 0.5 0.2"/> </geometry>
  3. 大小写敏感 —— 我见过有人把 link 写成 Link,结果解析报错,找了半天。
🧰 我的小习惯: 写URDF时,我会先用注释把骨架标出来,再填细节。比如 <!-- 底盘 -->,这样结构一目了然。

第一个URDF模型:一个简单的轮子

咱们直接上手。下面是一个迷你模型:一个底盘加一个轮子。你复制到记事本里,保存为 my_robot.urdf,就能用 check_urdf 检查。

<?xml version="1.0"?>
<robot name="mini_bot">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.3 0.1"/>
            </geometry>
            <material name="blue">
                <color rgba="0 0.2 0.8 1"/>
            </material>
        </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.08" length="0.04"/>
            </geometry>
            <material name="black">
                <color rgba="0.1 0.1 0.1 1"/>
            </material>
        </visual>
    </link>
</robot>

你看,base_link 是一个蓝色盒子,left_wheel 是一个黑色圆柱,通过 continuous 关节(可连续旋转)连在底盘左侧。我在项目里经常用这种结构做麦克纳姆轮底盘,只不过轮子数量变成四个。

⚠️ 曾经踩过的坑: 有一次我把 origin 的 xyz 写反了正负号,结果轮子直接嵌进底盘里,仿真时摩擦系数全乱套。所以,坐标变换一定要仔细,尤其是 rpy 的旋转顺序。

快速检查你的URDF

ROS里有个命令行工具 check_urdf,你只要在终端跑一下:

check_urdf my_robot.urdf

它会输出模型结构树,告诉你哪个link连哪个joint。我第一次看到那个树状图的时候,觉得“哦,原来机器人就是这么回事”。

标签作用常用属性
<robot>根元素,name属性必填name
<link>定义刚体部分name
<joint>定义连接关系name, type
<origin>相对变换(位置+旋转)xyz, rpy
<geometry>形状:box, cylinder, sphere, meshsize/radius/length/filename

嗯,到这里你应该对URDF有了基本感觉。它不复杂,但细节多。我个人建议,刚开始不要追求完美,先搭一个能动的模型,再慢慢加传感器、加颜色。你想想看,如果一开始就纠结惯性矩阵,可能连模型都跑不起来。

🧪 练手建议: 把上面那个模型里的轮子改成两个,再添加一个支撑轮(用固定关节),看看能不能形成一辆三轮小车。我在带新人时,这个练习几乎能暴露80%的坐标变换问题。