URDF(Unified Robot Description Format)是 ROS 中用于描述机器人刚体、关节、几何模型、质量惯性以及部分仿真信息的 XML 格式。

本文以 ROS 2 中常见 URDF 为主,系统整理 URDF 的节点层级、常用属性、取值方式和典型用法。
重点:link 描述“物体”,joint 描述“物体之间如何连接和运动”。


1. URDF 整体结构

一个典型 URDF 可以抽象成:

robot
├── link
│   ├── visual
│   │   ├── origin
│   │   ├── geometry
│   │   │   ├── box
│   │   │   ├── cylinder
│   │   │   ├── sphere
│   │   │   └── mesh
│   │   └── material
│   │       ├── color
│   │       └── texture
│   │
│   ├── collision
│   │   ├── origin
│   │   └── geometry
│   │       ├── box
│   │       ├── cylinder
│   │       ├── sphere
│   │       └── mesh
│   │
│   └── inertial
│       ├── origin
│       ├── mass
│       └── inertia
│
├── joint
│   ├── parent
│   ├── child
│   ├── origin
│   ├── axis
│   ├── limit
│   ├── dynamics
│   ├── safety_controller
│   ├── calibration
│   └── mimic
│
├── transmission
│   ├── type
│   ├── joint
│   └── actuator
│
├── gazebo
│   ├── material
│   ├── collision
│   ├── visual
│   └── plugin
│
└── 其他扩展
    └── ros2_control

注意:严格来说,gazebotransmissionros2_control 等属于 URDF 的扩展生态,而不是 URDF 核心规范本身。实际机器人项目通常会同时出现它们。


2. <robot> —— 机器人根节点

所有 URDF 都从 <robot> 开始。

<robot name="my_robot">

</robot>
属性必填作用示例
name机器人名称my_robot

示例

<robot name="quadruped_robot">
    ...
</robot>

3. <link> —— 刚体

link 表示机器人中的一个刚体部件

例如:

  • 机身
  • 机械臂
  • 大腿
  • 小腿
  • 轮子
  • 摄像头外壳
  • 雷达支架
<link name="base_link">
</link>
属性必填作用
nameLink 名称

一个 Link 可以包含:

link
├── visual
├── collision
└── inertial

4. <visual> —— 可视化模型

描述机器人在 RViz、Gazebo 等环境中显示出来的样子

<visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>

    <geometry>
        <box size="1 0.5 0.2"/>
    </geometry>

    <material name="blue">
        <color rgba="0 0 1 1"/>
    </material>
</visual>
子节点作用
<origin>Visual 相对于 Link 坐标系的位置和姿态
<geometry>几何形状
<material>材质和颜色

5. <collision> —— 碰撞模型

描述机器人进行碰撞检测时使用的模型。

<collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>

    <geometry>
        <box size="1 0.5 0.2"/>
    </geometry>
</collision>
子节点作用
<origin>碰撞模型的位置和姿态
<geometry>碰撞几何体

通常:

visual
    ↓
高精度模型
    ↓
负责“看起来像什么”

collision
    ↓
简化模型
    ↓
负责“碰撞怎么计算”

例如机器人外壳可以使用复杂 STL 作为 visual,而 collision 使用简单 Box。


6. <inertial> —— 惯性信息

描述 Link 的物理属性。

<inertial>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <mass value="10"/>
    <inertia
        ixx="1"
        ixy="0"
        ixz="0"
        iyy="1"
        iyz="0"
        izz="1"/>
</inertial>
子节点作用
<origin>惯性参考坐标系
<mass>质量
<inertia>惯性张量

7. <mass> —— 质量

<mass value="10"/>
属性作用单位
value物体质量kg

8. <inertia> —— 惯性张量

<inertia
    ixx="1"
    ixy="0"
    ixz="0"
    iyy="1"
    iyz="0"
    izz="1"/>
属性含义
ixxIxx
ixyIxy
ixzIxz
iyyIyy
iyzIyz
izzIzz

惯性矩阵为:

        | Ixx  Ixy  Ixz |
I =     | Ixy  Iyy  Iyz |
        | Ixz  Iyz  Izz |

单位通常为:

kg·m²

9. <origin> —— 坐标变换

URDF 中极其重要的节点。

<origin xyz="0.1 0 0.2"
        rpy="0 0 1.57"/>
属性含义单位
xyz平移m
rpyRoll、Pitch、Yawrad

其中:

xyz = x y z

rpy = roll pitch yaw

例如:

<origin xyz="0 0 0.1" rpy="0 0 1.5708"/>

表示:

x = 0 m
y = 0 m
z = 0.1 m

roll  = 0
pitch = 0
yaw   ≈ 90°

10. <geometry> —— 几何形状

geometry 用于描述 Link 的几何形状。

<geometry>
    ...
</geometry>

支持:

geometry
├── box
├── cylinder
├── sphere
└── mesh

11. <box> —— 长方体

<box size="1 0.5 0.2"/>
属性含义
size长、宽、高

例如:

size = "1 0.5 0.2"

长度 = 1 m
宽度 = 0.5 m
高度 = 0.2 m

12. <cylinder> —— 圆柱体

<cylinder radius="0.1" length="0.5"/>
属性含义单位
radius半径m
length长度m

13. <sphere> —— 球体

<sphere radius="0.2"/>
属性含义单位
radius半径m

14. <mesh> —— 三维网格模型

用于加载 STL、DAE、OBJ 等模型。

<mesh filename="package://my_robot/meshes/body.stl"/>

常见属性:

属性作用
filename模型文件路径
scale模型缩放比例

例如:

<mesh
    filename="package://my_robot/meshes/body.stl"
    scale="0.001 0.001 0.001"/>

15. <material> —— 材质

<material name="blue">
    <color rgba="0 0 1 1"/>
</material>
属性/子节点作用
name材质名称
<color>RGBA 颜色
<texture>纹理图片

16. <color> —— 颜色

<color rgba="1 0 0 1"/>

格式:

R G B A

每个值通常为:

0 ~ 1
数值含义
R红色
G绿色
B蓝色
A透明度

例如:

<color rgba="1 0 0 1"/>

表示红色、不透明。


17. <texture> —— 纹理

<texture filename="package://my_robot/materials/body.png"/>
属性作用
filename纹理图片路径

18. <joint> —— 关节

Joint 是 URDF 最核心的节点之一。

它描述:

两个 Link 之间如何连接,以及允许怎样运动。

<joint name="hip_joint" type="revolute">
    <parent link="base_link"/>
    <child link="thigh_link"/>

    <origin xyz="0 0 0" rpy="0 0 0"/>

    <axis xyz="0 1 0"/>

    <limit
        lower="-1.57"
        upper="1.57"
        effort="100"
        velocity="2"/>
</joint>

19. Joint 的 type

type含义是否有运动典型用途
fixed固定摄像头、雷达
revolute有限旋转机械臂、腿部关节
continuous无限旋转车轮
prismatic直线移动升降机构
floating6 自由度浮动连接
planar平面运动平面机构

20. <parent> —— 父 Link

<parent link="base_link"/>
属性作用
link指定父 Link

21. <child> —— 子 Link

<child link="wheel_link"/>
属性作用
link指定子 Link

所以一个 Joint 的基本关系是:

parent Link
     │
     │
   Joint
     │
     ↓
child Link

22. <axis> —— Joint 运动轴

<axis xyz="0 0 1"/>
属性含义
xyz运动轴方向

例如:

xyz="1 0 0"  → X 轴
xyz="0 1 0"  → Y 轴
xyz="0 0 1"  → Z 轴

对于:

revolute / continuous

表示旋转轴。

对于:

prismatic

表示平移方向。


23. <limit> —— 关节限制

<limit
    lower="-1.57"
    upper="1.57"
    effort="100"
    velocity="2"/>
属性作用常见单位
lower最小位置/角度rad 或 m
upper最大位置/角度rad 或 m
effort最大力/力矩N / N·m
velocity最大速度m/s 或 rad/s

对于 revolute

lower / upper → 角度范围

对于 prismatic

lower / upper → 位移范围

24. <dynamics> —— 动力学参数

<dynamics
    damping="0.1"
    friction="0.2"/>
属性作用
damping阻尼
friction摩擦

主要用于物理仿真。


25. <mimic> —— 关节联动

用于让一个 Joint 跟随另一个 Joint。

<mimic
    joint="left_finger_joint"
    multiplier="-1"
    offset="0"/>
属性作用
joint被跟随的 Joint
multiplier倍率
offset偏移量

例如:

左夹爪 ─────┐
            │
            ↓
        主关节运动
            ↓
            │
右夹爪 ←────┘

26. <safety_controller> —— 安全控制参数

传统 URDF Joint 可以使用:

<safety_controller
    soft_lower_limit="-1.0"
    soft_upper_limit="1.0"
    k_position="10"
    k_velocity="5"/>
属性作用
soft_lower_limit软下限
soft_upper_limit软上限
k_position位置增益
k_velocity速度增益

现代 ROS2 控制系统中不一定使用它。


27. <calibration> —— Joint 校准

用于描述关节校准相关信息。

常见属性:

属性作用
rising上升方向校准位置
falling下降方向校准位置
reference_position参考位置

属于较少使用的传统 URDF 功能。


28. <transmission> —— 传动关系

transmission 用于描述:

Actuator
    ↓
Transmission
    ↓
Joint

也就是:

电机/执行器如何驱动机器人关节。

典型结构:

<transmission name="hip_transmission">
    <type>...</type>

    <joint name="hip_joint">
        ...
    </joint>

    <actuator name="hip_motor">
        ...
    </actuator>
</transmission>

传统 transmission 中常见:

节点作用
<transmission>整个传动关系
<type>Transmission 类型
<joint>被驱动的关节
<actuator>执行器/电机

在 ROS2 中,如果使用 ros2_control,硬件接口通常通过 <ros2_control> 描述,传统 transmission 的使用方式与 ROS1 不完全相同。


29. <actuator> —— 执行器

用于描述电机等执行器。

传统结构中可以包含:

<actuator name="motor">
    ...
</actuator>

具体内容取决于所使用的 transmission 类型和控制框架。


30. <gazebo> —— Gazebo 扩展

<gazebo> 不是核心 URDF 节点,而是 Gazebo 对 URDF 的扩展。

例如:

<gazebo reference="base_link">
    <material>Gazebo/Blue</material>
</gazebo>

常用于:

  • Gazebo 材质
  • 摩擦参数
  • 传感器
  • 插件
  • 仿真参数

31. <plugin> —— 仿真插件

例如 Gazebo 中:

<gazebo>
    <plugin
        name="my_plugin"
        filename="libmy_plugin.so">
    </plugin>
</gazebo>

用于加载仿真插件。

常见用途:

传感器
控制器
差速驱动
IMU
激光雷达
相机

32. <ros2_control> —— ROS2 控制扩展

现代 ROS2 机器人中非常重要。

典型结构:

<ros2_control name="MyRobotSystem" type="system">

    <hardware>
        ...
    </hardware>

    <joint name="wheel_joint">

        <command_interface name="velocity"/>

        <state_interface name="position"/>
        <state_interface name="velocity"/>

    </joint>

</ros2_control>

核心结构:

ros2_control
├── hardware
├── joint
│   ├── command_interface
│   └── state_interface
└── sensor
    └── state_interface

33. <hardware> —— 硬件接口

描述实际机器人硬件系统。

例如:

<hardware>
    <plugin>my_robot_hardware/MyHardware</plugin>
</hardware>
内容作用
<plugin>指定硬件接口插件

硬件可以是:

真实电机
CAN
串口
EtherCAT
模拟硬件
仿真硬件

34. <command_interface> —— 命令接口

描述控制器可以给硬件发送什么命令。

例如:

<command_interface name="velocity"/>

常见:

接口含义
position位置控制
velocity速度控制
effort力/力矩控制

35. <state_interface> —— 状态接口

描述硬件能够提供什么状态。

<state_interface name="position"/>
<state_interface name="velocity"/>

常见:

接口含义
position位置
velocity速度
effort力/力矩

36. <sensor> —— 传感器

在 ros2_control 等扩展中可以描述传感器硬件接口。

例如:

<sensor name="imu">
    <state_interface name="orientation.x"/>
    <state_interface name="orientation.y"/>
    <state_interface name="orientation.z"/>
</sensor>

实际使用时具体接口取决于硬件和控制框架。


37. 所有核心节点总结

下面是学习 URDF 时最重要的一张总表。

节点所属作用重要程度
<robot>URDF 核心机器人根节点⭐⭐⭐⭐⭐
<link>URDF 核心刚体/部件⭐⭐⭐⭐⭐
<visual>Link可视化模型⭐⭐⭐⭐⭐
<collision>Link碰撞模型⭐⭐⭐⭐⭐
<inertial>Link质量和惯性⭐⭐⭐⭐⭐
<origin>多处位置和姿态⭐⭐⭐⭐⭐
<geometry>Visual/Collision几何模型⭐⭐⭐⭐⭐
<box>Geometry长方体⭐⭐⭐⭐
<cylinder>Geometry圆柱⭐⭐⭐⭐
<sphere>Geometry球体⭐⭐⭐
<mesh>Geometry三维模型⭐⭐⭐⭐⭐
<material>Visual材质⭐⭐⭐
<color>Material颜色⭐⭐⭐
<texture>Material纹理⭐⭐
<mass>Inertial质量⭐⭐⭐⭐
<inertia>Inertial惯性张量⭐⭐⭐⭐
<joint>URDF 核心连接和运动⭐⭐⭐⭐⭐
<parent>Joint父 Link⭐⭐⭐⭐⭐
<child>Joint子 Link⭐⭐⭐⭐⭐
<axis>Joint运动轴⭐⭐⭐⭐⭐
<limit>Joint运动限制⭐⭐⭐⭐⭐
<dynamics>Joint阻尼/摩擦⭐⭐⭐
<mimic>Joint关节联动⭐⭐⭐
<safety_controller>Joint安全控制⭐⭐
<calibration>Joint关节校准
<transmission>扩展执行器与关节传动⭐⭐⭐
<actuator>Transmission执行器⭐⭐
<gazebo>Gazebo 扩展仿真参数⭐⭐⭐⭐
<plugin>Gazebo仿真插件⭐⭐⭐⭐
<ros2_control>ROS2 扩展硬件控制⭐⭐⭐⭐⭐
<hardware>ros2_control硬件接口⭐⭐⭐⭐⭐
<command_interface>ros2_control控制命令接口⭐⭐⭐⭐⭐
<state_interface>ros2_control状态反馈接口⭐⭐⭐⭐⭐
<sensor>扩展传感器接口⭐⭐⭐

38. URDF 属性总结

robot

节点属性
robotname

link

节点属性
linkname

joint

节点属性
jointnametype

origin

属性含义
xyz平移
rpy旋转

geometry

节点属性
boxsize
cylinderradiuslength
sphereradius
meshfilenamescale

material

节点属性
materialname
colorrgba
texturefilename

inertial

节点属性
massvalue
inertiaixxixyixziyyiyzizz

joint

节点属性
parentlink
childlink
axisxyz
limitloweruppereffortvelocity
dynamicsdampingfriction
mimicjointmultiplieroffset
safety_controllersoft_lower_limitsoft_upper_limitk_positionk_velocity

39. 一个完整的简单 URDF

下面是一个包含核心节点的完整例子:

<?xml version="1.0"?>

<robot name="my_robot">

    <!-- ==================== -->
    <!-- Base Link -->
    <!-- ==================== -->

    <link name="base_link">

        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>

            <geometry>
                <box size="1 0.5 0.2"/>
            </geometry>

            <material name="blue">
                <color rgba="0 0 1 1"/>
            </material>
        </visual>

        <collision>
            <origin xyz="0 0 0" rpy="0 0 0"/>

            <geometry>
                <box size="1 0.5 0.2"/>
            </geometry>
        </collision>

        <inertial>
            <origin xyz="0 0 0" rpy="0 0 0"/>

            <mass value="10"/>

            <inertia
                ixx="1"
                ixy="0"
                ixz="0"
                iyy="1"
                iyz="0"
                izz="1"/>
        </inertial>

    </link>


    <!-- ==================== -->
    <!-- Wheel Link -->
    <!-- ==================== -->

    <link name="wheel_link">

        <visual>

            <geometry>
                <cylinder
                    radius="0.1"
                    length="0.05"/>
            </geometry>

        </visual>

        <collision>

            <geometry>
                <cylinder
                    radius="0.1"
                    length="0.05"/>
            </geometry>

        </collision>

    </link>


    <!-- ==================== -->
    <!-- Joint -->
    <!-- ==================== -->

    <joint
        name="wheel_joint"
        type="continuous">

        <parent link="base_link"/>

        <child link="wheel_link"/>

        <origin
            xyz="0.3 0 -0.15"
            rpy="1.5708 0 0"/>

        <axis xyz="0 0 1"/>

    </joint>

</robot>

40. URDF 最核心的理解方式

不要把 URDF 当成一堆 XML 标签去背。

真正需要建立的是下面这个模型:

                    Robot
                      │
          ┌───────────┴───────────┐
          ↓                       ↓
        Link                    Joint
          │                       │
       “物体”                  “连接”
          │                       │
    ┌─────┼─────┐          ┌─────┼─────┐
    ↓     ↓     ↓          ↓     ↓     ↓
 visual collision inertial parent child axis
    │
 geometry
    │
 ┌──┼─────────────┐
 ↓  ↓      ↓      ↓
box cylinder sphere mesh

再往上扩展:

URDF
│
├── 机器人结构
│   ├── Link
│   └── Joint
│
├── 外观
│   ├── Visual
│   ├── Geometry
│   └── Material
│
├── 物理
│   ├── Collision
│   └── Inertial
│
├── 关节运动
│   ├── Axis
│   ├── Limit
│   ├── Dynamics
│   └── Mimic
│
└── ROS2 / 仿真扩展
    ├── ros2_control
    ├── Gazebo
    └── Transmission

一句话记忆:

URDF = Link + Joint 为骨架,Visual/Collision/Inertial 描述 Link,Origin/Axis/Limit/Dynamics 描述 Joint,再通过 Gazebo、ros2_control 等扩展连接仿真和真实硬件。


41. 学习顺序建议

如果你是为了 ROS2 机器人开发,建议按照下面顺序学习:

① robot
   ↓
② link
   ↓
③ joint
   ↓
④ parent / child
   ↓
⑤ origin
   ↓
⑥ axis
   ↓
⑦ visual / geometry / mesh
   ↓
⑧ collision
   ↓
⑨ inertial
   ↓
⑩ limit / dynamics
   ↓
⑪ TF
   ↓
⑫ robot_state_publisher
   ↓
⑬ ros2_control
   ↓
⑭ Gazebo / RViz2

其中最关键的是:

Link
 +
Joint
 +
Origin
 =
机器人 TF 树

例如四足机器人:

                    base_link
                   /    |    \
                  /     |     \
              front    body    rear
               /                 \
           hip_joint           hip_joint
               ↓                   ↓
          thigh_link          thigh_link
               ↓                   ↓
          knee_joint          knee_joint
               ↓                   ↓
           calf_link           calf_link

这就是 URDF 最核心的思想:用 Link 构造机器人刚体,用 Joint 建立刚体之间的父子关系,最终形成完整的机器人运动学树。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐