URDF文件结构解析:理解XML语法、link与joint的定义、坐标系与变换树
URDF,全称是Unified Robot Description Format。说白了,它就是机器人的「身份证」加「骨架说明书」。在Isaac Sim里,你要让机械臂动起来,第一步就是得把它的URDF文件喂给仿真器。我刚开始接触URDF时,觉得不就是个XML嘛,结果一打开文件,几百行标签堆在一起,直接懵了。
这一章,咱们就把URDF的骨架拆开来看。你掌握了这个,后面配置关节参数、调运动学,都会顺手很多。
2.1 URDF的XML语法基础
URDF用的是标准的XML语法。你不需要成为XML专家,但几个核心规则得记住:
- 标签必须成对出现:
<robot>...</robot>,不能只开不闭。 - 属性用引号包裹:比如
name="arm_link1",少个引号解析就报错。 - 大小写敏感:
Link和link是两回事。我见过有人把link写成Link,结果Gazebo直接罢工。 - 注释用
<!-- -->:方便你标记哪些是临时加的测试关节。
2.2 link:机械臂的「骨头」
每个 <link> 代表机械臂的一个刚体部件。比如基座、大臂、小臂、末端执行器,都是link。一个link里通常包含三部分:
| 子标签 | 作用 | 必填? |
|---|---|---|
<inertial> |
质量、惯性矩阵、质心位置 | 推荐填(动力学仿真需要) |
<visual> |
显示用的几何形状和颜色 | 是(不然你看不到模型) |
<collision> |
碰撞检测用的简化几何体 | 推荐填(避免仿真卡顿) |
举个例子,一个简单的基座link长这样:
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.15" radius="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
</visual>
<collision>
<geometry>
<cylinder length="0.15" radius="0.1"/>
</geometry>
</collision>
</link>
注意看,<origin> 定义了link自身的坐标系原点。这个原点默认在几何体的中心。如果你想让圆柱底部贴地,就得把 xyz 的z值往上抬一半高度。
2.3 joint:连接骨头的「关节」
joint把两个link连接起来,并定义它们之间的相对运动。URDF支持六种关节类型,但机械臂里最常用的是 revolute(旋转关节)和 prismatic(移动关节)。
| 关节类型 | 自由度 | 典型用途 |
|---|---|---|
| revolute | 1个旋转 | 肩关节、肘关节 |
| prismatic | 1个平移 | 升降台、滑轨 |
| fixed | 0 | 把两个link焊死(比如摄像头支架) |
| continuous | 1个无限旋转 | 车轮、转台 |
| floating | 6 | 很少用,仿真中容易飘 |
| planar | 3(2平移+1旋转) | AGV小车底盘 |
一个典型的旋转关节定义:
<joint name="shoulder_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link1"/>
<origin xyz="0 0 0.15" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="100" velocity="1.0"/>
</joint>
这里有几个关键点:
- parent 和 child:joint的方向是从父link指向子link。这个方向决定了变换树的流向。
- origin:子link坐标系相对于父link坐标系的偏移和旋转。说白了,就是关节装在父link的哪个位置。
- axis:旋转轴的方向。对于revolute关节,这个轴是在父link坐标系下定义的。
- limit:关节的运动范围。lower和upper是弧度值,effort是最大力矩,velocity是最大速度。Isaac Sim里如果力矩设得太小,机械臂会像没吃饭一样,软绵绵的。
xyz="1 0 0"(绕X轴转),结果机械臂在仿真里像在「招手」而不是「抬臂」。正确的肩关节旋转轴通常是Z轴(0 0 1)或Y轴(0 1 0),取决于你的设计。
2.4 坐标系与变换树
URDF里每个link都有自己的坐标系。这些坐标系通过joint连接起来,就形成了一棵 变换树。树的根节点通常是 base_link(基座),然后一层层往下延伸到末端执行器。
为什么会这样设计?因为机器人运动学本质上就是坐标系的链式变换。你要算末端执行器的位置,就得从基座开始,沿着变换树一路乘下去。
下面这张图展示了典型的六轴机械臂变换树结构:
你看,从base_link到end_effector_link,中间经过6个joint和6个link。每个joint都携带一个 <origin> 变换,Isaac Sim就是靠这些变换把整个机械臂「拼」起来的。
2.5 可视化URDF文件
光看XML代码,你很难直观感受到机械臂长什么样。我建议你养成一个习惯:每次写完或修改URDF,立刻用工具可视化一下。
常用的可视化方法有:
- rviz(ROS自带):加载URDF后,你可以旋转、缩放,还能显示坐标系和关节轴。
- Isaac Sim的URDF Importer:导入后直接显示3D模型,还能实时调整关节角度。
- 在线URDF查看器:比如
urdf-viz或网页版工具,适合快速检查。
xyz 的正负号就行,不用重新建模。
可视化时重点检查三件事:
- link之间有没有穿透:如果两个link的几何体重叠了,说明
<origin>的偏移量算错了。 - 关节旋转方向是否符合直觉:正方向是顺时针还是逆时针?这个在后续配置运动规划时很重要。
- 末端执行器的位置对不对:如果机械臂的「手」长在奇怪的地方,检查一下末端link的坐标系原点。
嗯,URDF的结构其实不复杂。你只要记住:link是骨头,joint是关节,变换树是骨架的连接逻辑。把这三点理清了,后面导入Isaac Sim就是水到渠成的事。