1 · URDF基础入门

URDF,全称 Unified Robot Description Format,统一机器人描述格式。说白了,它就是 ROS 世界里用来描述机器人长什么样的“身份证”。你想想看,要让机器人动起来,总得先告诉系统它有几条腿、几个轮子、关节怎么转吧?URDF 就是干这个的。

我最早接触 URDF 是在做一个差速轮小车的时候。那时候觉得不就是写个 XML 嘛,结果一上来就把轮子的坐标搞反了,小车在 rviz 里直接“劈叉”。嗯,从那以后我养成了一个习惯——先画草图,再写 URDF。

一句话总结: URDF 用 XML 格式描述机器人的运动学与动力学属性,是 ROS 仿真、导航、控制的基础。

URDF 文件结构

一个标准的 URDF 文件,根标签是 <robot>,里面主要包含两类子标签:<link> 和 <joint>。我个人习惯把 link 想象成“骨头”,joint 想象成“关节”。骨头和关节连在一起,就组成了完整的骨架。

<robot name="my_robot">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.4 0.3 0.1"/>
            </geometry>
        </visual>
    </link>

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

你看,结构非常清晰。每个 link 可以定义视觉、碰撞、惯性属性;每个 joint 则连接两个 link,并指定相对位置和旋转。

link 与 joint 的概念

link 是刚体部件,比如底盘、轮子、机械臂的连杆。它本身不产生运动,只提供几何和物理属性。

joint 是运动约束,它决定了两个 link 之间的相对运动方式。ROS 里支持多种 joint 类型:

类型自由度典型用途
revolute旋转 (有角度限制)关节臂、舵机
continuous旋转 (无限制)车轮、转台
prismatic平移伸缩杆、滑轨
fixed无运动刚性连接 (如传感器支架)
floating6自由度全向移动基座 (很少用)
我的小建议: 刚开始做 URDF 时,尽量先用 fixed 和 continuous 两种类型。fixed 用来固定传感器,continuous 用来做轮子。等熟悉了再碰 revolute 的限位参数。

坐标系与变换树

每个 link 都有一个自己的坐标系。joint 里的 <origin> 定义了子 link 相对于父 link 的位姿。所有 link 的坐标系通过 joint 连接起来,就形成了一棵“变换树”(TF tree)。

我记得有一次调试四轮小车,左后轮的坐标系原点写错了符号,结果小车在 rviz 里一直原地转圈。后来用 tf_echo 一查,发现轮子坐标系跑到了车身外面。所以,坐标系偏移一定要反复核对。

URDF 核心逻辑 <robot> <link> <joint> visual collision inertial parent/child origin axis link + joint → 变换树 (TF tree)

变换树是 ROS 里非常核心的概念。每个 link 坐标系之间的变换关系,由 joint 的 origin 和 axis 共同决定。你可以用 view_frames 或 tf2_tools 把整棵树打印出来,一目了然。

⚠️ 曾经踩过的坑: 我刚开始写 URDF 时,总忘记给 base_link 添加惯性属性。结果 Gazebo 仿真一启动,机器人直接“飞”走了。后来才知道,每个 link 必须要有 <inertial> 标签,哪怕质量设成 0.001 都行,但不能缺。

好了,这一章我们聊了 URDF 是什么、文件骨架、link/joint 的概念,还有坐标系变换树。你想想看,其实 URDF 就是搭积木——link 是积木块,joint 是连接销,变换树就是积木的装配图。下一章我们会深入 link 标签的每个细节,到时候再细聊。