1、URDF入门:什么是URDF、URDF在机器人开发中的作用、URDF文件结构概览
各位同学好,我是你们这门课的讲师。做了十几年机器人,从轮式底盘到六轴机械臂都折腾过。今天咱们聊聊URDF——这个每个机器人工程师都绕不开的东西。
URDF,全称是Unified Robot Description Format,统一机器人描述格式。说白了,它就是一套用XML语言写的“机器人说明书”。你想想看,你要跟别人描述一个机器人长什么样,关节怎么动,传感器装在哪——URDF就是干这个的。
一句话总结:URDF = 机器人的“身份证” + “骨架图” + “运动学说明书”。
1.1 为什么我们需要URDF?
我记得刚入行那会儿,团队里做导航的同事和做机械设计的同事经常吵架。机械设计给了SolidWorks模型,导航那边要的是能在ROS里跑的东西。两边数据格式对不上,每次都得手动转换,特别痛苦。
URDF的出现,说白了就是解决了这个痛点。它把机器人的几何信息、运动学信息、视觉信息统一到一个文件里。这样,无论是做仿真、做导航、做控制,大家都能用同一套数据。
具体来说,URDF在机器人开发中干这几件事:
- 可视化——在Rviz里看到机器人长什么样,不用真机也能调试
- 运动学计算——正解、逆解、雅可比矩阵,都靠URDF里的关节定义
- 碰撞检测——规划路径时,知道机器人会不会撞到东西
- 仿真接口——Gazebo等仿真器直接读取URDF,省去重复建模
我的经验:有一次做移动机械臂项目,机械设计改了三次底盘尺寸。要是没有URDF,每次都得重新写代码适配。有了URDF,改几个数字就搞定。所以,前期花时间把URDF写规范,后面能省十倍的时间。
1.2 URDF文件长什么样?
咱们直接看一个最简单的例子。这是一个两轮差速底盘的部分URDF:
<robot name="my_robot">
<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.15 0.2 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
</robot>
嗯,这里要注意几个关键点:
<robot>是根标签,name属性就是机器人的名字<link>定义刚体部件,比如底盘、轮子、手臂<joint>定义连接关系,告诉系统两个link怎么连在一起
1.3 URDF的核心结构
URDF文件的结构其实不复杂。我习惯把它想象成一棵“树”:
核心原则:URDF必须是一棵无环的树形结构。每个link只能有一个父节点,但可以有多个子节点。
咱们用一张图来理解这个结构:
1.4 两个核心元素:Link 和 Joint
URDF里最重要的两个概念,就是link和joint。我刚开始学的时候也搞混过,这里帮你理清楚:
| 元素 | 含义 | 包含内容 | 类比 |
|---|---|---|---|
| Link | 刚体部件 | 几何形状、颜色、碰撞模型、惯性参数 | 人的“骨头” |
| Joint | 连接关系 | 父link、子link、位置、旋转轴、运动类型 | 人的“关节” |
我曾经踩过的坑:刚开始写URDF时,我把joint的origin写错了。结果在Rviz里一看,轮子悬在半空中。后来排查了半天才发现,joint的origin是相对于父link的坐标系,不是世界坐标系。这个细节特别容易搞反。
1.5 常见的Joint类型
Joint有几种类型,选错了机器人动起来就不对。我整理了一个表格:
| 类型 | 自由度 | 运动方式 | 典型应用 |
|---|---|---|---|
fixed |
0 | 固定不动 | 传感器支架、装饰件 |
revolute |
1 | 旋转(有限角度) | 机械臂关节 |
continuous |
1 | 旋转(无限角度) | 车轮 |
prismatic |
1 | 直线滑动 | 升降台、滑轨 |
floating |
6 | 全自由运动 | 无人机、水下机器人 |
planar |
3 | 平面运动 | AGV底盘简化模型 |
我的建议:刚开始做URDF时,先用fixed和revolute这两种就够了。等把基础结构搭好,再慢慢加其他类型。一口吃不成胖子,URDF也是。
1.6 本章小结
咱们这一章就讲这些。你记住三件事就行:
- URDF是机器人的XML描述文件,负责告诉系统“机器人长什么样、怎么动”
- 核心结构是树形,根节点是
base_link,往下通过joint挂载子link - 两个基本元素:link(部件)和joint(连接),搞懂它们就入门了