1 · URDF基础入门
各位好,我是你们这门课的工程师讲师。今天咱们聊聊URDF——统一机器人描述格式。说白了,它就是机器人的“身份证”加“骨架说明书”。你想想看,要让机器人动起来、仿真起来,总得告诉计算机你的机器人长什么样、关节在哪、轮子怎么转吧?URDF就是干这个的。
什么是URDF?
URDF全称 Unified Robot Description Format,是ROS生态里描述机器人几何、关节、运动学链的标准。我最早接触URDF是在做一个差分驱动底盘项目,当时为了把轮子位置调对,折腾了一下午。后来发现,其实就是几个link和joint的事。
它用XML写,所以可读性不错。你不需要是编程高手,只要理解标签、属性、嵌套,就能搭出一个完整的机器人模型。
URDF文件结构
一个标准的URDF文件,根标签是 <robot>,里面包含多个 <link> 和 <joint>。我习惯把link想象成骨头,joint就是关节软骨。嗯,这样好记。
- <link> —— 定义刚体:形状、尺寸、颜色、惯性参数。
- <joint> —— 定义连接:类型(固定、旋转、滑动等)、父子关系、坐标变换。
举个例子,一个简单的两轮机器人,至少需要:底盘link、左轮link、右轮link,以及两个轮子关节。
XML语法基础(快速上手)
URDF用的是标准XML。你只要记住三条:
- 标签必须成对出现:
<tag> ... </tag>或自闭合<tag /> - 属性用引号括起来:
<geometry> <box size="1 0.5 0.2"/> </geometry> - 大小写敏感 —— 我见过有人把
link写成Link,结果解析报错,找了半天。
<!-- 底盘 -->,这样结构一目了然。
第一个URDF模型:一个简单的轮子
咱们直接上手。下面是一个迷你模型:一个底盘加一个轮子。你复制到记事本里,保存为 my_robot.urdf,就能用 check_urdf 检查。
<?xml version="1.0"?>
<robot name="mini_bot">
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
<material name="blue">
<color rgba="0 0.2 0.8 1"/>
</material>
</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.08" length="0.04"/>
</geometry>
<material name="black">
<color rgba="0.1 0.1 0.1 1"/>
</material>
</visual>
</link>
</robot>
你看,base_link 是一个蓝色盒子,left_wheel 是一个黑色圆柱,通过 continuous 关节(可连续旋转)连在底盘左侧。我在项目里经常用这种结构做麦克纳姆轮底盘,只不过轮子数量变成四个。
origin 的 xyz 写反了正负号,结果轮子直接嵌进底盘里,仿真时摩擦系数全乱套。所以,坐标变换一定要仔细,尤其是 rpy 的旋转顺序。
快速检查你的URDF
ROS里有个命令行工具 check_urdf,你只要在终端跑一下:
check_urdf my_robot.urdf
它会输出模型结构树,告诉你哪个link连哪个joint。我第一次看到那个树状图的时候,觉得“哦,原来机器人就是这么回事”。
| 标签 | 作用 | 常用属性 |
|---|---|---|
| <robot> | 根元素,name属性必填 | name |
| <link> | 定义刚体部分 | name |
| <joint> | 定义连接关系 | name, type |
| <origin> | 相对变换(位置+旋转) | xyz, rpy |
| <geometry> | 形状:box, cylinder, sphere, mesh | size/radius/length/filename |
嗯,到这里你应该对URDF有了基本感觉。它不复杂,但细节多。我个人建议,刚开始不要追求完美,先搭一个能动的模型,再慢慢加传感器、加颜色。你想想看,如果一开始就纠结惯性矩阵,可能连模型都跑不起来。