1. 课程导入
什么是URDF?它在机器人开发里到底扮演什么角色? 这一章我们直接上手,把最核心的概念理清楚。
1.1 什么是URDF?
URDF 的全称是 Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于 XML 的“机器人说明书”。你想想看,一个机器人有多少个关节、连杆长什么样、轮子装在哪、传感器怎么固定……这些信息全得告诉计算机。URDF 就是干这个的。
我最早接触 URDF 是在做一个轮式底盘项目,当时想用 Gazebo 仿真,结果模型怎么都站不稳。后来才发现,是关节坐标系写反了。嗯,从那以后我对 URDF 的每个标签都特别敏感。
1.2 URDF在机器人开发中的作用
没有 URDF,很多工具根本跑不起来。我列几个最常用的场景:
- 可视化与调试 —— 在 RViz 里看到机器人模型,检查尺寸、关节限位是否合理。
- 运动学计算 —— 解析 URDF 里的关节树,自动生成正逆运动学解。
- 仿真与物理引擎 —— Gazebo、Webots 等仿真器直接读取 URDF,赋予模型质量、惯性、碰撞属性。
- 导航与规划 —— MoveIt!、Nav2 等框架依赖 URDF 获取机器人外形和关节信息。
你可能会问:没有 URDF 行不行?
理论上可以自己写解析器,但 ROS 生态里几乎所有工具都原生支持 URDF。我个人习惯是,哪怕做一个极简的原型,也会先搭一个 URDF 文件出来,后面省太多事了。
1.3 第一个URDF文件结构
直接看一个最简单的例子。一个两轮小车底盘,包含一个车身和两个轮子。麻雀虽小,五脏俱全。
<?xml version="1.0"?>
<robot name="simple_car">
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</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.05" length="0.04"/>
</geometry>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="right_wheel"/>
<origin xyz="-0.2 -0.2 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.05" length="0.04"/>
</geometry>
</visual>
</link>
</robot>
这个文件里,<robot> 是根标签,name 属性随便起,但最好有意义。<link> 定义刚体部件,<joint> 定义连接关系。每个 <visual> 里指定几何形状和位置。
1.4 URDF 知识结构总览
下面这张图帮你把本章的核心逻辑串起来。从根标签到 link/joint,再到属性和用途,一目了然。
1.5 快速上手:验证你的第一个URDF
写完 URDF 怎么知道对不对?我一般用两个方法:
- 命令行检查 —— 在终端运行
check_urdf your_model.urdf,它会告诉你语法错误和关节树信息。 - RViz 可视化 —— 用
urdf_to_graphiz生成关系图,或者直接 launch 到 RViz 里看三维模型。
我个人习惯是写完一小段就检查一次,别等整个模型堆到几百行再查,那时候找 bug 找到崩溃。
check_urdf 在 ROS2 里被整合到了 urdf_parser_plugin 中。但核心概念不变,放心学。
好,这一章我们搞清楚了 URDF 是什么、能干什么、长什么样。下一章我们会深入拆解 link 和 joint 的每一个属性,包括坐标系、惯性参数、碰撞模型…… 嗯,不过那是下一章的事。先把基础打牢,后面才飞得起来。