第1章 URDF基础入门
大家好,我是你们这门课的老朋友。做了这么多年机器人运动控制,我越来越觉得 URDF 是所有机器人建模的基石。你想想看,没有它,MoveIt 根本不知道你的机器人长什么样、关节在哪。今天咱们就从零开始,把 URDF 的老底摸清楚。
1.1 什么是URDF?
URDF 全称是 Unified Robot Description Format,统一机器人描述格式。说白了,就是用 XML 写一个机器人的“身份证”。里面记录了机器人有多少个连杆、关节,长什么样子,重量多少,颜色如何。
我记得刚入行那会儿,带我的老工程师扔给我一个 URDF 文件说:“把这个看懂,你就能控制机器人了。” 我当时一脸懵,后来才发现——URDF 就是机器人的骨架。没有它,运动规划、碰撞检测全都无从谈起。
1.2 URDF 文件结构
一个标准的 URDF 文件,根元素是 <robot>,里面主要包含两类东西:<link> 和 <joint>。我个人习惯把 link 想象成骨头,joint 就是连接骨头的关节。
来看一个最简结构:
<robot name="my_first_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 0.2 0.1"/>
</geometry>
</visual>
</link>
</robot>
嗯,这里要注意:<visual> 只负责显示,不影响物理碰撞。如果你要做仿真,还得加上 <collision> 和 <inertial>。我在项目中遇到过好几次,只写了 visual 没写 collision,结果 Gazebo 里机器人直接穿模……
1.3 XML 语法基础(够用就行)
URDF 基于 XML,但你不需要成为 XML 专家。记住这几条就够了:
- 标签必须成对出现:
<link>...</link>,自闭合标签用<box/>。 - 属性值用引号:
name="base_link",单引双引都行,保持一致就好。 - 区分大小写:
<visual>不能写成<Visual>。 - 注释:
<!-- 这是注释 -->,调试时很有用。
1.4 第一个URDF模型:单连杆
咱们直接上手。创建一个 single_link.urdf 文件,内容如下:
<?xml version="1.0"?>
<robot name="single_link_demo">
<link name="my_first_link">
<visual>
<geometry>
<cylinder length="0.3" radius="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="blue">
<color rgba="0.2 0.4 0.9 1.0"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.3" radius="0.1"/>
</geometry>
</collision>
<inertial>
<mass value="0.5"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
</link>
</robot>
这个模型只有一个圆柱体连杆,蓝色,带碰撞和惯性参数。你可以用 check_urdf 命令验证:
$ check_urdf single_link.urdf
如果输出 Robot name is: single_link_demo 且没有报错,恭喜你,第一个 URDF 模型诞生了!
<inertia> 里的数值全写成了 0,结果仿真器直接崩溃。惯性矩阵不能为零,哪怕给个很小的值也行。
1.5 快速对照表:link 子元素
| 子元素 | 是否必须 | 作用 |
|---|---|---|
| visual | 推荐 | 可视化外观,用于显示 |
| collision | 强烈推荐 | 碰撞检测几何体 |
| inertial | 仿真必需 | 质量与惯性张量 |
你可能会问:为什么 collision 和 visual 要分开?我解释一下:显示可以用精细的网格模型,但碰撞检测用简单几何体(盒子、圆柱、球)效率更高。这是工程上的经典取舍。
好了,第一章的内容就到这里。URDF 看起来简单,但它是后面所有章节的根基。下一章我们会深入 link 和 joint 的各种属性,到时候你会发现自己已经能读懂大部分机器人模型了。