第2章 · link与joint详解
标签属性 · 关节类型 · 坐标系定义 —— 把机器人骨架说清楚
1. link 标签 —— 机器人的每一块骨头
link 就是机器人的一个刚体部件。底盘、手臂连杆、摄像头支架……每个独立不形变的零件都是一个 link。我个人习惯把 link 想象成「骨头」,而 joint 就是连接骨头的「关节」。
一个典型的 link 长这样:
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.4 0.3 0.1"/>
</geometry>
</collision>
<inertial>
<mass value="2.0"/>
<inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
</inertial>
</link>
🔹 三个核心子标签:
<visual>—— 外观显示,不影响物理。我经常用纯色材质快速验证模型。<collision>—— 碰撞检测形状。记得尽量用简单几何体,别用复杂网格,否则仿真卡到你怀疑人生。<inertial>—— 惯性参数。质量、惯性张量。嗯,这里容易踩坑,我后面会讲。
💡 我的经验: 早期做移动机器人底盘,我把碰撞盒子和视觉 mesh 设成一样,结果仿真时轮子卡地板。后来才明白,碰撞形状要略小于视觉形状,留一点「宽容间隙」。
2. joint 标签 —— 关节决定运动方式
joint 连接两个 link,定义它们之间的相对运动。你想想看,没有 joint 的机器人就是一整块铁疙瘩,啥也动不了。
joint 有 6 种类型,我按项目里遇到的频率排个序:
| 类型 | 自由度 | 典型用途 |
|---|---|---|
| revolute | 旋转 (绕轴) | 关节电机、轮子转向 |
| continuous | 无限旋转 | 万向轮、转台 |
| prismatic | 平移 (沿轴) | 升降柱、滑轨 |
| fixed | 0 (刚性) | 传感器支架、装饰件 |
| floating | 6 (全自由) | 无人机、自由物体 |
| planar | 3 (平面运动) | AGV 全向轮平台 |
joint 的基本结构:
<joint name="arm_joint" type="revolute">
<parent link="base_link"/>
<child link="arm_link"/>
<origin xyz="0.2 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit effort="30" velocity="1.0" lower="-3.14" upper="3.14"/>
</joint>
⚠️ 我曾经犯过的错: 给 revolute 关节忘了加 <limit>,结果 Gazebo 里关节疯狂旋转停不下来。后来养成习惯,只要不是 continuous 类型,一定写上下限。
3. 坐标系定义 —— 原点与旋转的玄机
URDF 里每个 link 和 joint 都有自己的坐标系。说白了,就是 原点 (xyz) 和旋转 (rpy)。rpy 是绕固定轴的欧拉角:roll (X), pitch (Y), yaw (Z)。
我见过很多新手把 origin 和 axis 搞混。记住:
- origin —— joint 原点相对于 parent link 坐标系的偏移和旋转。
- axis —— 关节的运动轴,在 joint 坐标系下定义。
举个例子:
<origin xyz="0.1 0 0.2" rpy="0 0 1.57"/>
<axis xyz="0 1 0"/>
这表示关节原点在 parent 的 X 正方向 0.1 米,Z 正方向 0.2 米,并且绕 Z 轴转了 90 度。关节轴是 joint 坐标系的 Y 轴方向。
🔧 坐标系小技巧: 在 RViz 里显示坐标轴 (勾选 TF 显示),一眼就能看出哪个关节装反了。我调试六轴机械臂时,靠这个方法十分钟就找到了一个旋转方向错误的 joint。
4. 实战避坑 · 我总结的 3 条铁律
- 父子关系不能成环。 URDF 必须是一棵树。我曾经想偷懒让两个 link 互相引用,结果解析器直接报错。
- 惯性参数别瞎填。 用估算值也比全零好。Gazebo 里惯性为零会导致数值爆炸,机器人直接飞天。
- fixed joint 也有用。 把摄像头、激光雷达用 fixed 关节挂到基座上,方便后续替换传感器。
📌 我个人习惯: 每个 link 都写一个简短的注释,比如 <!-- 底盘 -->。团队协作时,别人一眼就能看懂你的机器人结构。