运动学基础(上):刚体运动描述、旋转矩阵、欧拉角、齐次变换矩阵

各位同学,咱们今天聊聊运动学基础的上半部分。说实话,这部分内容我当年学的时候也觉得有点抽象,但后来做项目才发现——这些数学工具就是人形机器人的“语言”。你想想看,要让机器人走路,首先得知道它的腿在哪儿、朝哪个方向、怎么动。这就是刚体运动描述要解决的问题。

1. 刚体运动描述:从“点”到“体”的跨越

刚体,说白了就是不会变形的物体。人形机器人的大腿、小腿、躯干,我们都可以近似看作刚体。描述一个刚体的运动,比描述一个点复杂得多——不仅要告诉它“去哪儿”,还要告诉它“怎么转”。

我个人习惯把刚体运动拆成两部分:位置和姿态。位置好办,三个坐标(x,y,z)搞定。姿态呢?嗯,这里就有意思了。

核心概念:刚体在三维空间中的运动 = 平移 + 旋转。平移用向量描述,旋转用矩阵或角度描述。

我在项目中遇到过一个问题:用三个点的坐标来描述一个刚体的姿态,结果计算量巨大,还容易出错。后来才明白,用旋转矩阵才是正道。

2. 旋转矩阵:最直观的旋转描述方式

旋转矩阵是一个3×3的正交矩阵,行列式为+1。它描述了从一个坐标系到另一个坐标系的旋转变换。

假设有一个点P,在坐标系{A}中的坐标为AP,在坐标系{B}中的坐标为BP。那么:

AP = ARB · BP

其中ARB就是旋转矩阵,它把{B}中的坐标转换到{A}中。

旋转矩阵有几个重要性质:

  • 正交性:RTR = I,R-1 = RT
  • 行列式为+1:保证是纯旋转,没有反射
  • 列向量相互正交且为单位向量

绕x、y、z轴旋转θ角的基本旋转矩阵:

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

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

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

我的经验:写代码时别手算旋转矩阵,直接用现成的库函数。我曾经手算一个绕y轴旋转的矩阵,符号搞反了,结果机器人直接“劈叉”了……

3. 欧拉角:更“人类友好”的表达方式

旋转矩阵虽然数学上漂亮,但9个参数太冗余了。欧拉角只用3个角度就能描述旋转,更直观。

常见的欧拉角序列有:

  • ZYX(偏航-俯仰-横滚):先绕z轴转ψ,再绕y轴转θ,最后绕x轴转φ。这是机器人领域最常用的。
  • ZYZ:常用于机械臂运动学
  • XYZ:固定角序列

从欧拉角到旋转矩阵的转换(以ZYX为例):

R = Rz(ψ) · Ry(θ) · Rx(φ)

展开后:

R = [cψcθ  cψsθsφ - sψcφ  cψsθcφ + sψsφ]
    [sψcθ  sψsθsφ + cψcφ  sψsθcφ - cψsφ]
    [-sθ   cθsφ           cθcφ         ]

其中c=cos,s=sin。

注意!欧拉角有个大坑——万向锁(Gimbal Lock)。当俯仰角θ=±90°时,偏航和横滚的旋转轴重合,会丢失一个自由度。我在做双足机器人步态规划时就踩过这个坑,后来改用四元数才解决。

4. 齐次变换矩阵:把旋转和平移统一起来

单独用旋转矩阵描述姿态,用向量描述位置,计算时还得分开处理,挺麻烦的。齐次变换矩阵就是来解决这个问题的——它把旋转和平移统一到一个4×4的矩阵里。

ATB = [ARB  APB]
        [0  0  0  1]

其中ARB是3×3旋转矩阵,APB是3×1平移向量。

齐次变换矩阵的逆矩阵:

BTA = [ARBT  -ARBT · APB]
        [0    0    0    1]

复合变换:如果有多个坐标系串联,比如从{A}到{B}再到{C}:

ATC = ATB · BTC

这玩意儿在机器人运动学里太重要了。每个关节的变换矩阵乘起来,就能得到末端执行器的位姿。

实际应用:人形机器人走路时,从髋关节到膝关节到踝关节,每个关节都有一个齐次变换矩阵。把这些矩阵连乘,就能算出脚底相对于躯干的位置和姿态。

5. 知识体系总览

下面这张图是我自己画的,把本章的核心逻辑串起来了:

刚体运动描述知识体系 刚体运动描述 位置(平移向量) 姿态(旋转描述) 旋转矩阵(3×3) 欧拉角(3个角度) 齐次变换矩阵(4×4)

6. 实际应用中的注意事项

讲完理论,说说实际干活时要注意的:

  1. 坐标系约定要统一:我见过一个团队,有人用右手系,有人用左手系,结果联调时机器人走路方向全反了。建议团队内部统一用右手系。
  2. 欧拉角的顺序:不同领域习惯不同。机器人领域常用ZYX,航空航天用ZYZ,搞游戏的可能用XYZ。写代码时一定要注释清楚。
  3. 数值稳定性:旋转矩阵的数值误差会累积。长时间运行时,记得对旋转矩阵做正交化处理。
  4. 齐次变换矩阵的维度:4×4矩阵乘法的计算量比3×3大不少。如果只做旋转,别用齐次变换,用旋转矩阵更高效。

避坑指南:我曾经在写步态规划代码时,把齐次变换矩阵的平移向量和旋转矩阵的顺序搞反了——先平移后旋转和先旋转后平移,结果完全不同。记住:齐次变换矩阵里,旋转矩阵在左上角,平移向量在右上角。

好了,运动学基础的上半部分就讲到这里。这些数学工具是后续所有内容的基础——关节角度计算、正逆运动学、步态规划,全都离不开它们。建议你亲手写代码实现一下旋转矩阵的乘法、欧拉角到旋转矩阵的转换、齐次变换矩阵的复合运算。光看是学不会的,得动手。

可可精品资料库