3、正运动学回顾:从关节空间到笛卡尔空间的映射,典型6轴机械臂正解推导

在逆运动学求解之前,我们必须先彻底理解正运动学。正运动学解决的是这样一个问题:给定机械臂各关节的角度(关节空间),求末端执行器的位置和姿态(笛卡尔空间)。逆运动学则是反过来的过程——给定末端目标位姿,反解关节角。如果正运动学理解不透彻,逆解时你将无法判断多解取舍、奇异位形和可达性。本章以典型6轴串联关节机械臂(如常见的ER3A-C60构型)为例,系统推导正运动学矩阵,并建立从关节空间到笛卡尔空间的完整映射框架。

6轴机械臂正运动学映射链路 关节空间 θ₁, θ₂, θ₃ θ₄, θ₅, θ₆ 6个旋转关节角 单位:rad 或 deg DH参数 A₁·A₂·A₃ 齐次变换矩阵 T₀₆ = A₁·A₂·A₃·A₄·A₅·A₆ 4×4 矩阵 R(3×3) | P(3×1) 0 0 0 | 1 含sin/cos组合 矩阵展开 笛卡尔空间 位置:Px, Py, Pz 姿态:Rx, Ry, Rz 或旋转矩阵R(3×3) 欧拉角/四元数 正运动学应用场景 轨迹规划 | 碰撞检测 | 逆解验证 | 标定 | 奇异位形分析 DH参数表(示例) 关节 aᵢ₋₁ αᵢ₋₁ dᵢ θᵢ 1 0 0 d₁ θ₁ 2 a₁ -90° 0 θ₂ 3 a₂ 0 0 θ₃ 4 0 90° d₄ θ₄

上图展示了正运动学的核心链路:6个关节角作为输入,通过DH参数建立相邻坐标系变换,连乘得到末端位姿。下面我们逐步拆解这一过程。

3.1 核心原理:DH参数与齐次变换矩阵

正运动学的数学基础是Denavit-Hartenberg(DH)参数法。每个关节用4个参数描述:连杆长度aᵢ₋₁(沿Xᵢ₋₁轴从Zᵢ₋₁移动到Zᵢ的距离)、连杆扭转角αᵢ₋₁(绕Xᵢ₋₁轴从Zᵢ₋₁旋转到Zᵢ的角度)、连杆偏距dᵢ(沿Zᵢ轴从Xᵢ₋₁移动到Xᵢ的距离)、关节角θᵢ(绕Zᵢ轴从Xᵢ₋₁旋转到Xᵢ的角度)。对于旋转关节,θᵢ是变量,其余3个参数为常量。

相邻坐标系间的变换矩阵为:

Aᵢ = Rot(z, θᵢ) · Trans(z, dᵢ) · Trans(x, aᵢ₋₁) · Rot(x, αᵢ₋₁)

     | cosθᵢ  -sinθᵢ·cosαᵢ₋₁   sinθᵢ·sinαᵢ₋₁   aᵢ₋₁·cosθᵢ |
     | sinθᵢ   cosθᵢ·cosαᵢ₋₁  -cosθᵢ·sinαᵢ₋₁   aᵢ₋₁·sinθᵢ |
Aᵢ = | 0       sinαᵢ₋₁         cosαᵢ₋₁          dᵢ        |
     | 0       0               0                1         |

末端执行器相对于基座的总变换为:T₀₆ = A₁·A₂·A₃·A₄·A₅·A₆。这个4×4矩阵的左上3×3子矩阵是旋转矩阵R,右上3×1子矩阵是位置向量P。旋转矩阵的列向量分别代表末端坐标系在基坐标系中的X、Y、Z轴方向。

3.2 典型6轴机械臂DH参数表与坐标系建立

以常见的6轴关节型工业机械臂为例(如ER3A-C60构型),其DH参数表如下:

关节iaᵢ₋₁ (mm)αᵢ₋₁ (°)dᵢ (mm)θᵢ范围 (°)
100330-170 ~ +170
2150-900-90 ~ +135
360000-170 ~ +170
4120-90630-190 ~ +190
50900-120 ~ +120
60-9075-360 ~ +360

坐标系建立规则:Zᵢ轴沿关节i的旋转轴方向;Xᵢ轴沿Zᵢ和Zᵢ₊₁的公垂线方向,从Zᵢ指向Zᵢ₊₁;Yᵢ轴由右手定则确定。基坐标系{0}固定在底座,工具坐标系{6}固定在法兰盘末端。

经验提醒:DH参数表不是唯一的,不同厂家可能采用标准DH或改进DH(Modified DH)。标准DH的变换顺序是Rot(z,θ)→Trans(z,d)→Trans(x,a)→Rot(x,α),而改进DH是Rot(x,α)→Trans(x,a)→Rot(z,θ)→Trans(z,d)。使用前务必确认你用的是哪种约定,否则正解结果会完全错误。

3.3 正解推导过程:从A₁到T₀₆

我们逐步计算每个变换矩阵。以第1关节为例,a₀=0,α₀=0,d₁=330mm:

A₁ = | cosθ₁  -sinθ₁  0  0 |
     | sinθ₁   cosθ₁  0  0 |
     | 0       0      1  330 |
     | 0       0      0  1  |

第2关节,a₁=150mm,α₁=-90°,d₂=0:

A₂ = | cosθ₂  0  -sinθ₂  150·cosθ₂ |
     | sinθ₂  0   cosθ₂  150·sinθ₂ |
     | 0     -1   0      0        |
     | 0      0   0      1        |

第3关节,a₂=600mm,α₂=0°,d₃=0:

A₃ = | cosθ₃  -sinθ₃  0  600·cosθ₃ |
     | sinθ₃   cosθ₃  0  600·sinθ₃ |
     | 0       0      1  0        |
     | 0       0      0  1        |

第4关节,a₃=120mm,α₃=-90°,d₄=630mm:

A₄ = | cosθ₄  0  -sinθ₄  120·cosθ₄ |
     | sinθ₄  0   cosθ₄  120·sinθ₄ |
     | 0     -1   0      630      |
     | 0      0   0      1        |

第5关节,a₄=0,α₄=90°,d₅=0:

A₅ = | cosθ₅  0  sinθ₅  0 |
     | sinθ₅  0  -cosθ₅ 0 |
     | 0      1  0      0 |
     | 0      0  0      1 |

第6关节,a₅=0,α₅=-90°,d₆=75mm:

A₆ = | cosθ₆  -sinθ₆  0  0 |
     | sinθ₆   cosθ₆  0  0 |
     | 0       0      1  75 |
     | 0       0      0  1  |

将A₁到A₆连乘,得到T₀₆。由于矩阵乘法不满足交换律,顺序必须严格保持。实际工程中,我们通常用符号计算工具(如MATLAB Symbolic、Python SymPy)展开,避免手算错误。展开后,位置分量Px、Py、Pz是6个关节角的非线性函数,例如Px的一般形式为:

Px = cosθ₁·(a₁ + a₂·cosθ₂ + a₃·cos(θ₂+θ₃) + d₄·sin(θ₂+θ₃)) 
     + d₆·(sinθ₁·sinθ₄·sinθ₅ + cosθ₁·cosθ₄·sinθ₅·cos(θ₂+θ₃) 
     + cosθ₁·cosθ₅·sin(θ₂+θ₃))

这个表达式虽然复杂,但结构清晰:前3项是腕部中心位置,后3项是工具偏移量。

3.4 案例拆解:用Python验证正解

假设机械臂处于零位(所有关节角为0°),我们验证正解是否正确。零位时:

θ₁=θ₂=θ₃=θ₄=θ₅=θ₆=0°

代入DH参数:
A₁(0°) = | 1  0  0  0 |
         | 0  1  0  0 |
         | 0  0  1  330 |
         | 0  0  0  1  |

A₂(0°) = | 1  0  0  150 |
         | 0  0  1  0  |
         | 0 -1  0  0  |
         | 0  0  0  1  |

A₃(0°) = | 1  0  0  600 |
         | 0  1  0  0  |
         | 0  0  1  0  |
         | 0  0  0  1  |

A₄(0°) = | 1  0  0  120 |
         | 0  0  1  0  |
         | 0 -1  0  630 |
         | 0  0  0  1  |

A₅(0°) = | 1  0  0  0 |
         | 0  0 -1  0 |
         | 0  1  0  0 |
         | 0  0  0  1 |

A₆(0°) = | 1  0  0  0 |
         | 0  1  0  0 |
         | 0  0  1  75 |
         | 0  0  0  1  |

连乘后得到:

T₀₆ = | 1  0  0  870 |
      | 0  1  0  0  |
      | 0  0  1  405 |
      | 0  0  0  1  |

即末端位置为(870, 0, 405)mm,姿态为单位矩阵(与基座姿态一致)。这个结果符合物理直觉:零位时机械臂完全伸直,X方向总长为150+600+120=870mm,Z方向为330+75=405mm。

实战验证:在真实机器人上,将6个关节手动归零,用激光跟踪仪测量法兰盘中心位置。如果测量值与正解计算值偏差超过0.5mm,说明DH参数标定有误或存在机械零位偏移。这是正解最直接的工程验证方法。

3.5 常见误区与总结复盘

误区一:混淆标准DH和改进DH。两种约定下,a和α的定义位置不同,导致同样的DH参数表得到完全不同的正解。解决方法是始终在代码注释中明确标注DH类型。

误区二:忽略关节角单位。三角函数在C/C++/Python中默认使用弧度,而机器人示教器通常显示角度。如果直接混用,会产生灾难性错误。建议在程序入口统一转换为弧度。

误区三:矩阵连乘顺序错误。T₀₆ = A₁·A₂·A₃·A₄·A₅·A₆,不能写成A₆·A₅·...·A₁。矩阵乘法不满足交换律,顺序颠倒会导致末端位置完全错误。

误区四:忽视工具坐标系变换。正解得到的是法兰盘中心位姿,实际加工点(如焊枪末端)还需要乘以工具变换矩阵T_tool。很多初学者直接用法兰盘位姿做逆解,导致实际执行时末端偏差。

误区五:奇异位形下正解仍然有效,但逆解会出问题。当腕部中心与关节4、6轴线重合时(θ₅=0°),正解矩阵仍然正确,但逆解时会出现无穷多解。理解这一点有助于后续处理逆解奇异问题。