数学基础(一):空间描述与变换

做轨迹规划,说白了就是让机器人知道「自己在哪里,要去哪里,怎么过去」。而这一切的起点,就是空间描述与变换。我刚开始接触这个领域时,总觉得这些数学工具太抽象,直到第一次在项目里因为姿态表示搞混,导致机械臂差点撞到夹具……嗯,从那以后我再也不敢轻视这部分基础了。

1. 位置与姿态表示

一个刚体在三维空间中的状态,可以拆成两部分:位置和姿态。位置好理解,就是物体中心点的坐标 (x, y, z)。但姿态就麻烦一些——它描述的是物体「朝哪边看、怎么转」。

我个人习惯把姿态想象成:在物体上绑一个坐标系,看这个坐标系相对于世界坐标系是怎么旋转的。这个旋转关系,就是我们接下来要聊的核心。

核心概念: 位置 + 姿态 = 位姿。一个位姿完整描述了一个刚体在空间中的状态。

2. 旋转矩阵

旋转矩阵是描述姿态最直接的方式。它是一个 3×3 的正交矩阵,行列式为 +1。每一列代表物体坐标系的一个轴在世界坐标系下的方向向量。

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

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

我记得第一次手写旋转矩阵时,总是把 sin 的符号搞反。后来我养成一个习惯:用右手定则验证——拇指指向旋转轴正方向,四指弯曲方向就是正角度方向。

小技巧: 旋转矩阵的逆等于它的转置。这个性质在后续做坐标变换求逆时非常有用,能省不少计算量。

3. 欧拉角

旋转矩阵虽然严谨,但 9 个参数太冗余了。欧拉角用 3 个角度来描述旋转,更直观。常用的有 ZYX 欧拉角(也叫滚转-俯仰-偏航角)。

但欧拉角有个大坑——万向锁。当中间轴旋转到 ±90° 时,会丢失一个自由度。我在做无人机轨迹规划时就踩过这个坑:用欧拉角做插值,结果在俯仰 90° 附近姿态突然跳变,飞机差点翻过去。

避坑指南: 我曾经在项目中直接用欧拉角做姿态插值,结果出现了万向锁导致的奇异点。后来我改用四元数做插值,问题就解决了。如果你的应用涉及大角度旋转或连续轨迹,建议优先考虑四元数。
表示方法 参数数量 优点 缺点
旋转矩阵 9 无奇异,易组合 冗余,不直观
欧拉角 3 直观,易理解 有万向锁,插值困难
四元数 4 无奇异,易插值 不够直观

4. 四元数

四元数可以看作是复数的推广,形式为 q = w + xi + yj + zk,其中 w 是实部,(x, y, z) 是虚部。单位四元数可以用来表示旋转。

为什么用四元数?因为它没有万向锁,而且做球面线性插值(SLERP)非常平滑。我在做机械臂轨迹规划时,所有姿态插值都用四元数,效果很稳定。

// 四元数乘法(组合旋转)
q1 * q2 = (w1*w2 - x1*x2 - y1*y2 - z1*z2,
           w1*x2 + x1*w2 + y1*z2 - z1*y2,
           w1*y2 - x1*z2 + y1*w2 + z1*x2,
           w1*z2 + x1*y2 - y1*x2 + z1*w2)
注意: 四元数乘法不满足交换律,q1 * q2 和 q2 * q1 结果不同。这对应了旋转顺序不同,结果不同的事实。

5. 齐次变换矩阵

齐次变换矩阵把旋转和平移统一到一个 4×4 的矩阵里。形式如下:

T = [
  [R, t],
  [0, 1]
]

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

有了齐次变换矩阵,我们可以把多个变换串联起来:T_13 = T_12 * T_23。这在机器人运动学里太常用了——从基座到末端执行器,就是一连串的齐次变换矩阵相乘。

为什么用齐次变换? 因为它把旋转和平移统一成矩阵乘法,避免了分别处理旋转和平移的麻烦。而且矩阵乘法可以串联,非常适合描述机器人连杆之间的递推关系。

知识体系总览

下面这张图把本章的核心概念串起来了。你可以看到,位置和姿态是基础,然后衍生出三种姿态表示方法,最后统一到齐次变换矩阵。

空间描述与变换知识体系 空间描述 位置 (x, y, z) 姿态 (旋转关系) 旋转矩阵 (3×3) 欧拉角 (3参数) 四元数 (4参数) 齐次变换矩阵 (4×4) 应用:机器人运动学、坐标变换、轨迹插值

总结与建议

这一章的内容是后续所有轨迹规划算法的数学基石。我个人建议你:

  • 动手推导一遍旋转矩阵的公式,尤其是绕不同轴的旋转矩阵
  • 写代码验证欧拉角转四元数、四元数转旋转矩阵的转换
  • 理解齐次变换矩阵的物理意义,而不只是把它当成数学工具

这些基础打牢了,后面学运动学、动力学、轨迹插值就会顺畅很多。我在带新人时发现,凡是后面学得快的,都是这部分基础扎实的。