第1章 · URDF入门
各位好,我是你们这门课的老朋友。做机器人这么多年,我越来越觉得URDF就像机器人的“身份证”——没有它,你的机器人就是个没名没姓的铁疙瘩。今天咱们就来聊聊URDF到底是什么,它凭什么这么重要,以及它的骨架长什么样。
1.1 什么是URDF?
URDF,全称是Unified Robot Description Format,统一机器人描述格式。说白了,它是一种基于XML的文本文件,用来描述机器人的运动学结构、外观、碰撞属性等等。你想想看,一个机器人有那么多连杆、关节、传感器,怎么让ROS认识它?URDF就是那座桥。
我个人习惯把URDF比作机器人的“骨架+皮肤”。骨架就是连杆和关节怎么连,皮肤就是长什么样、什么颜色。嗯,这里要注意:URDF只描述树状结构,不能有闭环。如果你搞了个并联机构,URDF就有点力不从心了——不过那是后话。
1.2 URDF在机器人开发中的作用
作用太大了,我随便列几个场景你就明白了:
- 可视化与调试: 在Rviz里看到机器人模型,靠的就是URDF。没有它,你只能对着黑屏想象。
- 运动学计算: 正解、逆解、雅可比矩阵,底层全依赖URDF定义的关节和连杆关系。
- 仿真与验证: Gazebo里跑机器人,URDF是必须的入场券。我记得有一次项目里,同事忘了加碰撞标签,机器人直接穿模到地底下……
- 导航与规划: MoveIt! 做路径规划,首先要加载URDF才能知道机器人的尺寸和关节限位。
你可能会问:“没有URDF行不行?” 理论上你可以手动发布TF树,但那就跟你不用地图走路一样——能走,但大概率撞墙。URDF把这一切自动化了。
1.3 URDF文件的基本结构
URDF文件的结构非常清晰,像一棵倒挂的树。最外层是 <robot> 标签,里面包含两种核心元素:<link> 和 <joint>。我画了一张图,帮你一眼看明白:
来看一个最简的URDF例子,只有两个连杆和一个关节:
<?xml version="1.0"?>
<robot name="my_first_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.05"/>
</geometry>
</visual>
</link>
<joint name="arm_joint" type="fixed">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</joint>
</robot>
这个文件虽然简单,但五脏俱全。你看到了 <robot> 根标签,两个 <link> 分别定义了底座和手臂的几何形状,一个 <joint> 把它们连起来,并指定了相对位置。
1.4 核心元素速览
为了让你快速上手,我把URDF里最常用的标签整理成了表格:
| 标签 | 作用 | 必填属性 |
|---|---|---|
| <robot> | 根标签,包裹所有描述 | name |
| <link> | 定义刚体(连杆) | name |
| <joint> | 定义关节(连接关系) | name, type |
| <visual> | 连杆的可视外观 | (可选,但推荐) |
| <collision> | 碰撞检测模型 | (可选,仿真常用) |
| <inertial> | 惯性参数(质量、惯量) | (可选,动力学需要) |
你可能会发现,<visual> 和 <collision> 长得差不多。没错,它们都可以包含几何体。但我的建议是:可视化用精细模型,碰撞用简化模型——这样仿真跑得快,看着又漂亮。
<inertial> 可以暂时不写。但如果你要上Gazebo或者做动力学控制,惯性参数必须给准,否则机器人会像在太空中飘。
1.5 为什么从URDF开始?
因为它是整个机器人软件栈的基石。没有URDF,TF树就是无源之水;没有URDF,MoveIt! 不知道你的机器人胳膊有多长;没有URDF,导航堆栈也不知道你的车有多宽。我见过太多新手一上来就调导航,结果机器人卡在门框里——其实就是URDF里少写了一个碰撞盒子。
所以,踏踏实实把URDF搞明白,后面所有章节都会顺风顺水。嗯,这一章我们先把概念和结构刻在脑子里,下一章开始动手写标签。