3. 机械臂基础

各位同学,欢迎来到第三章。这一章我们正式进入机械臂的核心——运动学。

说实话,很多初学者一听到「运动学」三个字就头大,觉得全是矩阵和三角函数。我当年刚入行时也这么想。直到我在一个焊接项目里,因为逆解算错了一个关节角,导致焊枪直接怼到了工件上……嗯,从那以后,我再也不敢轻视运动学了。

这一章,我会把正解、逆解、DH参数和URDF模型串起来讲。你不需要一次性记住所有公式,但一定要理解它们之间的逻辑关系。

本章核心逻辑: 从几何结构 → 数学建模(DH参数) → 正解算位姿 → 逆解算关节角 → 统一描述(URDF)。

3.1 机械臂运动学:它在解决什么问题?

说白了,运动学就是研究「关节怎么动,末端去哪」以及「末端要去哪,关节怎么动」这两件事。

  • 正运动学(Forward Kinematics, FK): 已知每个关节的角度(或位移),求末端执行器在空间中的位置和姿态。
  • 逆运动学(Inverse Kinematics, IK): 已知末端执行器在空间中的目标位姿,反求每个关节的角度。

你想想看,在视觉定位里,相机告诉你「目标在坐标 (x, y, z) 处」,机械臂要抓过去。相机给的是正解结果吗?不是。相机给的是目标位姿,你需要用逆解算出关节角,才能让机械臂动过去。这就是视觉与机械臂协同的第一个关键接口。

我的习惯: 在项目初期,我会先用正解验证机械臂的几何参数是否正确,再用逆解做轨迹规划。正解是「验证工具」,逆解是「执行工具」。

3.2 DH参数:给机械臂建立「身份证」

DH参数(Denavit-Hartenberg参数)是运动学建模的通用语言。它用四个参数来描述相邻两个关节坐标系之间的变换关系。

参数 符号 物理含义 我的理解
连杆长度 ai-1 沿 Xi-1 轴,从 Zi-1 到 Zi 的距离 两个关节轴之间的「硬距离」
连杆扭转角 αi-1 绕 Xi-1 轴,从 Zi-1 到 Zi 的转角 两个关节轴之间的「扭角」
连杆偏距 di 沿 Zi 轴,从 Xi-1 到 Xi 的距离 关节之间的「偏移量」
关节角 θi 绕 Zi 轴,从 Xi-1 到 Xi 的转角 关节的「变量」

我曾经在一个六轴机器人项目里,因为把 a 和 d 搞反了,仿真里机械臂直接「飞」出去了。排查了整整两天才发现是参数顺序写错了。所以,建立DH参数表时,一定要对照机械臂的实物或CAD模型,一个参数一个参数地核对。

下面是一个标准六轴工业机器人的DH参数表示例(以常见的 ER3A-C60 构型为例):

# DH参数表 (标准型)
# 关节  a (mm)  α (deg)  d (mm)  θ (deg)
# -----------------------------------------
  1     0       0        350     θ1
  2     270     -90      0       θ2
  3     130     0        0       θ3
  4     0       -90      320     θ4
  5     0       90       0       θ5
  6     0       -90      80      θ6
注意: DH参数有两种约定——标准型(Standard)和改进型(Modified)。标准型把变换矩阵写在连杆末端,改进型写在连杆前端。ROS和URDF里常用改进型。如果你在项目里混用,正解结果会完全错误。

3.3 正运动学:从关节角到位姿矩阵

有了DH参数,正解就是套公式。每个相邻关节的变换矩阵 Ti 可以写成:

T_i = Rot_z(θ_i) * Trans_z(d_i) * Trans_x(a_i) * Rot_x(α_i)

把所有变换矩阵连乘,就得到末端相对于基座的位姿:

T_0_n = T_1 * T_2 * ... * T_n

这个 T_0_n 是一个 4x4 的齐次变换矩阵,包含了位置(平移向量)和姿态(旋转矩阵)。

我在实际项目中,很少手算这个矩阵。一般用 Python 的 sympy 或 robotics-toolbox 来符号推导。但你要理解它的物理意义:正解就是把关节空间映射到笛卡尔空间。

正解的应用场景:
  • 验证机械臂的几何参数是否正确
  • 在仿真中显示机械臂的当前姿态
  • 作为逆解迭代的初始值

3.4 逆运动学:从目标位姿回到关节角

逆解比正解复杂得多。对于六轴机器人,理论上最多有 16 组解(但实际中很多解会因为关节限位被排除)。

逆解的求解方法主要有两种:

  • 解析法(封闭解): 利用机械臂的几何结构,直接推导出关节角的表达式。速度快,但只适用于特定构型(如满足 Pieper 准则的机器人)。
  • 数值法(迭代法): 用牛顿-拉夫森或雅可比伪逆等方法迭代求解。通用性强,但速度慢,且可能陷入局部最优。

我个人习惯:优先用解析法。 因为数值法在靠近奇异位形时容易发散。我曾经在一个打磨项目里,用数值法做逆解,结果在某个姿态下算法直接不收敛,机械臂原地抖动。后来换成解析法,问题立刻解决。

下面是一个简单的解析逆解伪代码(以 2R 平面机械臂为例):

# 已知末端位置 (x, y),求关节角 θ1, θ2
# 连杆长度 L1, L2

cos_θ2 = (x^2 + y^2 - L1^2 - L2^2) / (2 * L1 * L2)
θ2 = atan2(±sqrt(1 - cos_θ2^2), cos_θ2)  # 两个解(肘上/肘下)

k1 = L1 + L2 * cos_θ2
k2 = L2 * sin_θ2
θ1 = atan2(y, x) - atan2(k2, k1)
避坑指南: 我曾经在写逆解代码时,忘了处理 atan2 的象限问题,导致机械臂在某个区域总是反转 180 度。后来我加了一个「关节角连续性检查」——确保当前解与上一时刻的解之差不超过 180 度。这个技巧在连续轨迹控制中非常实用。

3.5 URDF模型构建:把数学变成「看得见」的机器人

URDF(Unified Robot Description Format)是ROS里描述机器人模型的XML格式。它把DH参数、连杆几何、关节类型、碰撞模型等信息统一起来。

一个完整的URDF文件包含:

  • <link>: 描述每个连杆的惯性、视觉、碰撞属性
  • <joint>: 描述关节的类型(旋转/平移/固定)、父连杆、子连杆、原点变换、关节限位
  • <robot>: 根元素,包含所有 link 和 joint

下面是一个简单的两连杆机械臂URDF片段:

<robot name="two_link_arm">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.05"/>
      </geometry>
    </visual>
  </link>

  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.05" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1"/>
  </joint>

  <link name="link1">
    <visual>
      <geometry>
        <cylinder length="0.3" radius="0.02"/>
      </geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint2" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0 0 0.3" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-2.09" upper="2.09" effort="10" velocity="1"/>
  </joint>

  <link name="link2">
    <visual>
      <geometry>
        <cylinder length="0.3" radius="0.02"/>
      </geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </visual>
  </link>
</robot>
注意: URDF 中的 <origin> 是相对于父连杆的变换,不是相对于世界坐标系。很多新手在这里犯错,导致模型在 RViz 里「散架」。我的建议是:先画一个连杆坐标系图,再写 URDF,坐标系图比代码更容易发现错误。

3.6 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图:

机械臂运动学知识体系 机械臂运动学 DH参数建模 标准型 改进型 正运动学 (FK) 齐次变换矩阵连乘 逆运动学 (IK) 解析法 数值法 URDF模型构建 link 定义 joint 定义 坐标系变换

3.7 本章小结

这一章我们走完了从「机械臂几何结构」到「数学建模」再到「统一描述」的完整链路。你不需要记住所有公式,但一定要理解:

  • DH参数是运动学建模的「通用语言」,写错了后面全错。
  • 正解是基础工具,用来验证和仿真。
  • 逆解是执行工具,视觉定位的结果最终要靠逆解驱动机械臂。
  • URDF是把数学模型变成「看得见」的机器人的桥梁。