运动学基础:刚体运动、旋转矩阵、四元数、齐次变换、正逆运动学

各位同学,欢迎来到第二章。这一章的内容,说白了就是具身智能的「数学语言」。你想想看,机器人要抓杯子、要走路,它得先知道自己胳膊在哪儿、杯子在哪儿吧?这些位置和姿态的描述,就是运动学要解决的问题。

我个人习惯把运动学看作「几何约束的数学表达」。你不需要一开始就搞懂所有公式的推导,但必须理解每个概念背后的物理直觉。好,我们开始。

2.1 刚体运动与位姿描述

什么叫刚体?就是不会变形的物体。机械臂的连杆、无人机的机身,在建模时我们都假设它们是刚体。刚体在空间中的状态,用「位置 + 姿态」来描述,合起来叫位姿。

  • 位置:用三维坐标 (x, y, z) 表示,就是物体在空间中的那个点。
  • 姿态:描述物体「朝哪看」「怎么转」,这是本章的难点。

我记得刚入行时,总把位置和姿态混为一谈。后来带我的老工程师说了一句话,我记到现在:「位置是平移,姿态是旋转,它们是两码事,但必须一起算。」

核心观点:刚体位姿 = 平移 + 旋转。平移用向量,旋转用矩阵或四元数。两者通过齐次变换统一到一个框架里。

2.2 旋转矩阵

旋转矩阵是描述姿态最直观的方式。它是一个 3×3 的正交矩阵,行列式为 +1。什么意思?就是它只负责「转」,不负责「拉长」或「压缩」。

举个例子,绕 Z 轴旋转 θ 角,旋转矩阵长这样:

R_z(θ) = [cosθ  -sinθ  0]
         [sinθ   cosθ  0]
         [0      0     1]

绕 X 轴和 Y 轴的类似,我就不全写了。你想想看,一个点 P 在空间中,左乘一个旋转矩阵,它就转到了新位置。这就是旋转的本质——线性变换。

我在项目中遇到过一个问题:连续旋转时,旋转矩阵的乘法顺序特别容易搞反。比如先绕 X 轴转 30°,再绕 Y 轴转 45°,结果是 R_y * R_x * P,不是 R_x * R_y * P。这个顺序我吃过亏,后来每次写代码前都会在纸上画一遍。

注意:旋转矩阵乘法不满足交换律。R1 * R2 ≠ R2 * R1。顺序错了,姿态就完全不对。

2.3 四元数

旋转矩阵有 9 个参数,但自由度只有 3。这会导致数值计算时出现冗余和奇异。四元数就是来解决这个问题的。

四元数可以看作「带约束的复数扩展」。它用 4 个参数表示旋转:一个实部 + 三个虚部。写成 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部,且满足 w² + x² + y² + z² = 1。

为什么用四元数?三个理由:

  1. 无万向锁:欧拉角在俯仰角 ±90° 时会丢失一个自由度,四元数不会。
  2. 插值平滑:两个姿态之间做球面线性插值(SLERP),四元数天然支持。
  3. 计算高效:比旋转矩阵少 5 个参数,组合旋转时只需一次乘法。

我曾经在调试一个机械臂的轨迹规划时,发现末端执行器在某个点突然「抽搐」了一下。查了半天,原来是欧拉角导致的万向锁。换成四元数后,问题立刻消失。嗯,从那以后,我所有涉及姿态插值的代码,一律用四元数。

实用技巧:ROS 和 Eigen 库都内置了四元数类。你只需要记住:四元数乘法对应旋转组合,共轭对应逆旋转。别自己去手写四元数乘法,容易出错。

2.4 齐次变换

现在问题来了:我们既有平移,又有旋转。能不能用一个统一的数学工具把它们放在一起?

能。齐次变换矩阵就是干这个的。它是一个 4×4 的矩阵:

T = [R   t]
    [0   1]

其中 R 是 3×3 旋转矩阵,t 是 3×1 平移向量,最后一行是 [0 0 0 1]。

为什么叫「齐次」?因为我们在三维坐标后面加了一个 1,变成齐次坐标 (x, y, z, 1)。这样,平移和旋转就可以用一次矩阵乘法搞定。

举个例子,一个点 P 从坐标系 A 变换到坐标系 B:

P_B = T_A_to_B * P_A

这个 T 矩阵,就是两个坐标系之间的「桥梁」。我在做多传感器融合时,经常需要把激光雷达的点云变换到相机坐标系下。每次都是构造一个齐次变换矩阵,然后批量左乘所有点。效率很高,代码也很干净。

关键点:齐次变换矩阵的逆矩阵,可以直接从 T 算出:逆矩阵的旋转部分是 Rᵀ,平移部分是 -Rᵀ * t。不需要重新求逆,省计算量。

2.5 正运动学

正运动学,就是已知关节角度,求末端执行器的位姿。说白了,你告诉机器人「每个关节转多少度」,它告诉你「手在哪儿、朝哪看」。

对于串联机械臂,正运动学的标准方法是 DH 参数法(Denavit-Hartenberg)。每个关节用一个 4×4 的齐次变换矩阵表示,然后把这些矩阵乘起来:

T_0_to_n = T_0_to_1 * T_1_to_2 * ... * T_{n-1}_to_n

结果 T_0_to_n 就是基座到末端执行器的总变换。

我记得第一次手算六轴机械臂的正运动学时,算了整整两页纸。后来发现,用 Python 的 SymPy 库做符号推导,几分钟就搞定了。但手动推导的过程让我深刻理解了每个参数的含义——关节角、连杆长度、连杆偏距、扭转角,这四个参数缺一不可。

建议:初学阶段,至少手算一次 2-DOF 或 3-DOF 机械臂的正运动学。用纸笔推导,再用代码验证。这个过程能帮你建立直觉。

2.6 逆运动学

逆运动学是正运动学的逆问题:已知末端执行器的目标位姿,求各个关节的角度。这比正运动学难得多,原因有三:

  • 多解性:同一个末端位姿,可能对应多组关节角度(比如「肘部朝上」和「肘部朝下」)。
  • 无解性:目标位姿超出了机械臂的工作空间,怎么算都没解。
  • 非线性:方程里全是三角函数,没有通用的解析解。

求解逆运动学的方法主要有两类:

  1. 解析法:针对特定构型的机械臂(比如有球形腕的六轴臂),可以推导出封闭解。速度快,精度高。
  2. 数值法:用迭代优化(比如牛顿法、雅可比伪逆法)逼近解。通用性强,但可能陷入局部最优。

我在项目中遇到过一个问题:用数值法求解逆运动学时,迭代不收敛。后来发现是初始值选得太差,离真实解太远。解决办法是先用解析法给一个粗略的初始值,再用数值法精调。嗯,混合策略往往比单一方法更可靠。

避坑指南:我曾经在逆运动学代码里忘记处理关节限位,结果算法算出了一个「理论上正确但实际撞机」的角度。从那以后,我每次求解后都会加一步关节限位检查。你也要养成这个习惯。

2.7 知识体系总览

这一章的内容比较多,我画了一张图帮你理清脉络。你看,从刚体运动出发,分出了位置和姿态两条线。姿态用旋转矩阵或四元数描述,位置用平移向量。两者通过齐次变换合并,然后应用到正运动学和逆运动学中。

运动学基础知识体系 运动学基础 · 知识体系 刚体运动 位置(平移向量) 姿态(旋转) 旋转矩阵 四元数 齐次变换矩阵 正运动学(关节→位姿) 逆运动学(位姿→关节) 核心思路:用齐次变换统一描述刚体运动,再根据关节空间与任务空间的映射关系求解正/逆运动学

2.8 本章小结

这一章我们覆盖了运动学的核心概念。你不需要一次记住所有公式,但一定要理解这几条主线:

  • 刚体位姿 = 位置 + 姿态,两者独立但统一。
  • 旋转矩阵直观但冗余,四元数紧凑且无奇异。
  • 齐次变换矩阵是连接不同坐标系的「万能钥匙」。
  • 正运动学有唯一解,逆运动学需要小心处理多解和无解。