跳到主要内容ROS2 机器人 URDF 建模指南 | 极客日志PythonAI
ROS2 机器人 URDF 建模指南
介绍 ROS2 中 URDF(统一机器人描述格式)的基础知识与建模方法。内容涵盖 URDF 的核心作用、XML 基本结构、连杆(link)与关节(joint)的配置规则,包括外观、碰撞、惯性及运动轴等属性。通过四轮移动机器人的完整示例,演示了从功能包结构搭建到 RViz 可视化的全流程,并介绍了使用 urdf_to_graphviz 工具查看模型连接关系的方法。旨在帮助初学者理解机器人硬件结构的数字化描述,为后续运动控制与仿真奠定基础。
魔法巫师0 浏览 一、学习目标
- 理解 URDF 的核心作用 —— 让 ROS'认识'机器人的形状、结构和运动方式
- 掌握 URDF 的两大核心元素:
link(连杆)和 joint(关节)的配置规则
- 能看懂并编写简单的 URDF 文件(描述移动机器人 / 机械臂基础结构)
- 学会用工具可视化 URDF 模型(RViz 预览、
urdf_to_graphviz看结构)
- 明确建模中的关键细节(单位、坐标系、外观与碰撞的区别)
二、铺垫:机器人的组成(建模的基础)
在学 URDF 之前,先搞懂机器人的实际结构 —— 建模是'数字孪生',必须对应真实机器人的组成。机器人通常分 4 部分,URDF 主要描述(其他部分通过 ROS 节点实现):
硬件结构
| 组成部分 | 作用(小白理解) | 对应 URDF 描述的内容 |
|---|
| 硬件结构 | 看得见的刚体(底盘、轮子、机械臂连杆、相机) | link(描述每个刚体的形状、大小) |
| 驱动系统 | 让刚体动起来的装置(电机、舵机) | joint(描述电机驱动的运动方式) |
| 传感系统 | 感知环境的部件(雷达、相机、编码器) | 部分传感器用 link+fixed 关节固定 |
| 控制系统 | 计算和发指令的平台(树莓派、电脑) | 不通过 URDF 描述(通过 ROS 节点实现) |
核心逻辑:URDF 的本质是'用 XML 语言把机器人的硬件结构拆成 link(刚体)和 joint(连接 / 运动),再组合成完整模型'。
三、URDF 是什么?(基础概念)
3.1 一句话定义:ROS 的'机器人说明书'
URDF 全称是 Unified Robot Description Format(统一机器人描述格式),是 ROS 官方规定的机器人建模语言,特点:
- 基于XML 格式(类似网页的 HTML 标签,有
<标签名> 和属性);
- 能描述机器人的:
- 外观(形状、颜色、大小);
- 结构(哪个刚体连哪个刚体);
- 运动(刚体能怎么动、动多大范围);
- 物理属性(质量、惯性、碰撞检测)。
3.2 URDF 的基本结构(固定模板)
所有 URDF 文件都以 <robot> 为根标签,内部包含多个 <link> 和 <joint>,结构如下:
<?xml version="1.0" ?>
<robot name="机器人名字">
<link name="连杆 1 名字"> </link>
<joint name="关节 1 名字" type="关节类型"> </joint>
</robot>
四、URDF 核心元素 1:连杆(link)—— 描述机器人的'刚体'
link 对应机器人的一个独立刚体(比如底盘、轮子、相机),主要配置 3 类属性:外观(visual)、碰撞(collision)、惯性(inertial)(初学者先掌握前两类)。
4.1 link 的核心子标签(核心必懂)
| 子标签 | 作用 | 关键子元素 | 说明与例子 |
|---|
<visual> | 描述机器人的'外观'(仅显示用) | <origin>、<geometry>、<material> | 比如底盘外观是黄色圆柱体,轮子是白色圆柱体 |
<collision> | 描述机器人的'碰撞检测'(运算用) | <origin>、<geometry> | 为了减少计算,碰撞模型通常简化(比如外观是复杂模型,碰撞是简单长方体) |
<inertial> | 描述机器人的'物理惯性'(动力学用) | <mass>(质量)、<inertia>(惯性矩阵) | 比如重 1kg 的底盘比 0.5kg 的更难加速(初学者可先忽略,动力学仿真时再用) |
4.2 逐标签详解(结合例子)
以'移动机器人底盘(base_link)'为例,解析每个标签的含义:
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
</collision>
<inertial>
<mass value="1.0"/>
<inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.02"/>
</inertial>
</link>
关键注意点:
- 单位:长度用米(m),角度用弧度(rad)(比如 90 度 = 1.5707 弧度);
visual vs collision:外观可以复杂(好看),碰撞必须简化(比如用长方体代替复杂外壳),否则 ROS 计算碰撞时会卡顿;
origin 的坐标系:每个 link 都有自己的坐标系(默认原点在刚体中心),origin 描述子元素(外观 / 碰撞)相对于这个原点的偏移。
五、URDF 核心元素 2:关节(joint)—— 描述机器人的'运动'
joint 连接两个 link(父连杆 parent 和子连杆 child),定义它们之间的运动方式(比如轮子绕轴转、机械臂关节上下转)。
5.1 六种关节类型(重点!结合实际场景)
ROS 的 URDF 支持 6 种关节类型,初学者只需掌握前 4 种,后 2 种(floating、planar)很少用:
| 关节类型 | 运动方式 | 关键特点 | 实际应用例子 |
|---|
continuous | 绕单一轴无限旋转 | 无角度限制 | 移动机器人的驱动轮(可以一直转) |
revolute | 绕单一轴有限旋转 | 有最小 / 最大角度限制(limit) | 机械臂的肘关节(只能弯 90 度) |
prismatic | 沿单一轴有限平移 | 有最小 / 最大位置限制(limit) | 直线电机(比如升降平台上下移) |
fixed | 无运动(固定连接) | 最常用,父 / 子连杆相对位置不变 | 相机与底盘的连接(相机不动) |
floating | 无固定轴,可平移 + 旋转(6 自由度) | 无限制,少用 | 无人机(但无人机通常用其他建模方式) |
planar | 沿某平面平移 + 绕平面法向旋转(3 自由度) | 限制在平面内运动,少用 | 桌面上的滑块(只能在桌面移动 + 旋转) |
5.2 joint 的核心子标签(逐标签解析)
以'移动机器人左车轮关节(left_wheel_joint)'为例,解析每个标签:
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
关键注意点:
- 父 / 子连杆顺序:
parent 是固定参考(如底盘),child 是运动的连杆(如轮子),不能反;
axis 的方向:决定关节绕哪个轴运动,比如轮子必须绕 y 轴转(0,1,0)才能前进,绕 x 轴转(1,0,0)就会侧翻;
limit 的单位:角度用弧度,平移用米,速度用弧度 / 秒(角速度)或米 / 秒(线速度)。
六、实战:移动机器人 URDF 完整解析(从文件到可视化)
以用户提供的'四轮移动机器人(2 驱动轮 + 2 万向轮)'为例,带读者完整看懂 URDF,并学会可视化。
6.1 功能包结构(存放 URDF 相关文件)
建模前先建规范的功能包,方便管理文件,结构如下(learning_urdf 是功能包名):
learning_urdf/
├── urdf/
│ └── mbot_base.urdf
├── meshes/
├── launch/
│ └── display.launch.py
└── rviz/
└── urdf_rviz.rviz
6.2 完整 URDF 文件解析(mbot_base.urdf)
逐段注释,能看懂每个 link 和 joint 的作用:
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length="0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length="0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
</robot>
6.3 模型可视化(让读者看到实际效果)
光有 URDF 文件还不够,需要用 RViz 显示模型,步骤如下:
步骤 1:编写 Launch 文件(launch/display.launch.py)
Launch 文件用于一键启动 RViz,并加载 URDF 模型,避免手动输入复杂命令:
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os
def generate_launch_description():
pkg_path = get_package_share_directory('learning_urdf')
urdf_path = os.path.join(pkg_path, 'urdf', 'mbot_base.urdf')
rviz_path = os.path.join(pkg_path, 'rviz', 'urdf_rviz.rviz')
rviz_node = Node(
package='rviz2',
executable='rviz2',
arguments=[
'-d', rviz_path,
'--ros-args',
'-p', f'robot_description:={open(urdf_path).read()}'
]
)
joint_state_pub_node = Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui'
)
robot_state_pub_node = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
arguments=[urdf_path]
)
return LaunchDescription([
joint_state_pub_node,
robot_state_pub_node,
rviz_node
])
步骤 2:运行可视化
- 效果:RViz 窗口显示黄色底盘、白色驱动轮、黑色万向轮,可通过
joint_state_publisher_gui 的滑块拖动轮子旋转。
ros2 launch learning_urdf display.launch.py
cd dev_ws
colcon build --packages-select learning_urdf
source install/setup.bash
6.4 查看 URDF 结构(urdf_to_graphviz 工具)
用工具生成 TF 树,直观看到 link 和 joint 的连接关系:
- 查看效果:当前目录生成
mbot_base.gv 和 mbot_base.gv.pdf,打开 PDF 可看到:base_link 是根,连接 4 个关节(左 / 右轮、前 / 后万向轮),每个关节对应一个子 link —— 和我们设计的完全一致!
cd dev_ws/src/learning_urdf/urdf
urdf_to_graphviz mbot_base.urdf
sudo apt install ros-humble-urdf-tools
七、复习要点总结
- URDF 核心作用:用 XML 描述机器人的刚体(
link)和运动(joint),让 ROS'认识'机器人;
link 三要素:
visual:外观(形状、颜色、偏移),给人看;
collision:碰撞(简化几何),给 ROS 计算用;
inertial:惯性(质量、惯性矩阵),给动力学仿真用;
joint 关键参数:
- 类型:
continuous(轮子)、revolute(机械臂关节)、fixed(固定);
- 连接:
parent(固定参考)和 child(运动连杆);
- 运动:
axis(运动轴)、limit(运动限制);
- 单位陷阱:长度用米,角度用弧度(90 度 = 1.5707),速度用 rad/s;
- 可视化工具:
- Launch 文件 + RViz:看模型外观;
urdf_to_graphviz:看 link 和 joint 的连接结构。
掌握这些,就能看懂大部分 URDF 文件,也能编写简单的移动机器人 / 机械臂模型,为后续的运动控制、仿真打下基础
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown 转 HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online