URDF 完整节点与属性教程
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
注意:严格来说,
gazebo、transmission、ros2_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>
| 属性 | 必填 | 作用 |
|---|---|---|
name | 是 | Link 名称 |
一个 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"/>
| 属性 | 含义 |
|---|---|
ixx | Ixx |
ixy | Ixy |
ixz | Ixz |
iyy | Iyy |
iyz | Iyz |
izz | Izz |
惯性矩阵为:
| 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 |
rpy | Roll、Pitch、Yaw | rad |
其中:
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 | 直线移动 | 是 | 升降机构 |
floating | 6 自由度 | 是 | 浮动连接 |
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
| 节点 | 属性 |
|---|---|
robot | name |
link
| 节点 | 属性 |
|---|---|
link | name |
joint
| 节点 | 属性 |
|---|---|
joint | name、type |
origin
| 属性 | 含义 |
|---|---|
xyz | 平移 |
rpy | 旋转 |
geometry
| 节点 | 属性 |
|---|---|
box | size |
cylinder | radius、length |
sphere | radius |
mesh | filename、scale |
material
| 节点 | 属性 |
|---|---|
material | name |
color | rgba |
texture | filename |
inertial
| 节点 | 属性 |
|---|---|
mass | value |
inertia | ixx、ixy、ixz、iyy、iyz、izz |
joint
| 节点 | 属性 |
|---|---|
parent | link |
child | link |
axis | xyz |
limit | lower、upper、effort、velocity |
dynamics | damping、friction |
mimic | joint、multiplier、offset |
safety_controller | soft_lower_limit、soft_upper_limit、k_position、k_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 建立刚体之间的父子关系,最终形成完整的机器人运动学树。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)