第2章 · link与joint详解

标签属性 · 关节类型 · 坐标系定义 —— 把机器人骨架说清楚

URDF 核心骨架 link 标签 视觉 / 碰撞 / 惯性 joint 标签 类型 / 父子 / 轴 坐标系定义 原点 · 旋转 · 层级 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平移 (沿轴)升降柱、滑轨
fixed0 (刚性)传感器支架、装饰件
floating6 (全自由)无人机、自由物体
planar3 (平面运动)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 条铁律

  1. 父子关系不能成环。 URDF 必须是一棵树。我曾经想偷懒让两个 link 互相引用,结果解析器直接报错。
  2. 惯性参数别瞎填。 用估算值也比全零好。Gazebo 里惯性为零会导致数值爆炸,机器人直接飞天。
  3. fixed joint 也有用。 把摄像头、激光雷达用 fixed 关节挂到基座上,方便后续替换传感器。
📌 我个人习惯: 每个 link 都写一个简短的注释,比如 <!-- 底盘 -->。团队协作时,别人一眼就能看懂你的机器人结构。