第2章 数学基础回顾:向量、矩阵与刚体运动

做轨迹规划,说白了就是跟数学打交道。你想想看,机器人要动,就得知道位置、速度、加速度,这些东西怎么表示?怎么从一个坐标系变到另一个坐标系?这就是本章要聊的内容。

我个人习惯,每次带新人做项目,第一件事就是让他们把数学基础再过一遍。别觉得枯燥,这些概念在后面的轨迹插值、避障、优化里,天天都要用。

2.1 向量与矩阵:轨迹规划的“语言”

向量是什么?就是既有大小又有方向的量。在三维空间里,一个位置点可以用向量 p = [x, y, z]^T 表示。一个速度、一个力,也都是向量。

矩阵呢?可以看作向量的“操作器”。旋转、缩放、投影,都能用矩阵乘法搞定。

核心运算速查

  • 点积(内积):a · b = |a||b|cosθ,用于计算夹角、投影长度。
  • 叉积(外积):a × b = |a||b|sinθ · n,用于计算法向量、力矩。
  • 矩阵乘法:行乘列,注意不满足交换律(AB ≠ BA)。
  • 矩阵转置:行列互换,记作 A^T。
  • 矩阵逆:A · A^{-1} = I,用于解线性方程组。

我在项目中遇到过一个问题:两个坐标系之间的点坐标转换,直接用矩阵乘法算出来总是错的。后来发现,是矩阵乘法的顺序搞反了。记住:先旋转,再平移,顺序不能乱。

2.2 坐标系与变换:齐次坐标的妙用

为什么要有齐次坐标?因为普通的3D向量没法直接表示平移。你想想看,一个点 [x, y, z] 平移 [dx, dy, dz],用加法就行。但旋转用乘法。旋转+平移混在一起,就麻烦了。

齐次坐标的解法很简单:给3D向量加一个维度,变成 [x, y, z, 1]^T。这样,旋转和平移就能统一成一个4×4矩阵了。

齐次变换矩阵 T 的结构

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

其中 R 是3×3旋转矩阵,t 是3×1平移向量。0^T 是1×3零向量。

举个例子:把点 p 从坐标系 {A} 变换到 {B},公式就是 p_B = T_{B←A} · p_A。这里的 T 就是齐次变换矩阵。

避坑指南:我曾经在写代码时,把齐次坐标的最后一维写成0而不是1。结果平移分量全没了,点直接“飞”到了原点。检查了半天才发现。记住:表示点时最后一维是1,表示方向向量时最后一维是0。

2.3 刚体运动与姿态表示

刚体运动,就是物体在空间里又转又移,但自身不变形。描述刚体姿态,常用的有三种方法:旋转矩阵、欧拉角、四元数。

2.3.1 旋转矩阵

最直观,9个元素,但冗余。旋转矩阵是正交矩阵,行列式为+1。优点是能直接用于向量旋转,缺点是参数多,插值困难。

2.3.2 欧拉角

用三个角度表示旋转,比如 ZYX 顺序:先绕Z轴转γ,再绕Y轴转β,最后绕X轴转α。优点是直观,缺点是存在万向锁问题。

万向锁:当β = ±90°时,第一次和第三次旋转的轴重合,丢失一个自由度。我在做机械臂逆解时遇到过这个问题,导致轨迹出现突变。后来改用四元数才解决。

2.3.3 四元数

四元数 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。单位四元数(模长为1)可以表示任意旋转。

为什么用四元数?三个原因:

  • 无万向锁:不会出现奇异性。
  • 插值平滑:球面线性插值(SLERP)能生成平滑的旋转过渡。
  • 计算高效:比旋转矩阵少用内存,组合旋转也快。

四元数转旋转矩阵公式

R = [[1-2(y²+z²), 2(xy-wz),   2(xz+wy)   ],
     [2(xy+wz),   1-2(x²+z²), 2(yz-wx)   ],
     [2(xz-wy),   2(yz+wx),   1-2(x²+y²) ]]

2.4 知识体系总览

下面这张图,把本章的核心概念串起来了。你可以把它当作一个“地图”,后面每章都会用到这些基础。

第2章 数学基础知识体系 第2章 数学基础知识体系 向量与矩阵 坐标系与变换 刚体运动与姿态 点积 / 叉积 矩阵乘法 / 逆 齐次坐标 变换矩阵 T 旋转矩阵 欧拉角 四元数 (SLERP) 💡 核心要点 齐次坐标统一旋转与平移 → 变换矩阵 T 四元数解决万向锁 → 轨迹插值首选

2.5 实战对比:三种姿态表示怎么选?

表示方法 优点 缺点 适用场景
旋转矩阵 直接用于向量旋转,组合方便 9个参数冗余,插值困难 坐标变换、正向运动学
欧拉角 直观,3个参数 万向锁,插值不平滑 人机交互、简单姿态显示
四元数 无奇异性,插值平滑,计算快 不够直观,调试麻烦 轨迹规划、姿态控制、SLAM

我的建议:做轨迹规划时,内部计算一律用四元数。只在需要显示给用户看时,才转成欧拉角。这样既避免了万向锁,又方便调试。