3. 坐标系与位姿描述:刚体位姿描述、旋转矩阵、齐次变换矩阵、欧拉角与四元数

各位同学,欢迎来到第三章。说实话,这一章是整个运动控制轨迹规划的“地基”。你想想看,机器人要动,首先得知道自己在哪、胳膊往哪伸、末端抓手的姿态对不对。这些问题的核心,就是坐标系与位姿描述。

我刚开始做机器人项目那会儿,觉得坐标系不就是个数学概念嘛,随便搞搞就行。结果有一次调试六轴机械臂,因为旋转顺序搞反了,末端直接撞上了工作台。嗯,从那以后,我再也不敢小看这章内容了。

核心要点: 位姿 = 位置 + 姿态。位置用坐标表示,姿态用旋转矩阵、欧拉角或四元数描述。齐次变换矩阵把两者合二为一。
坐标系与位姿描述知识体系 坐标系与位姿描述知识体系 刚体位姿描述 位置描述 姿态描述 齐次变换矩阵 旋转矩阵 欧拉角 四元数 位姿 = 位置 + 姿态,齐次变换矩阵将两者统一为 4×4 矩阵 欧拉角直观但存在万向锁,四元数适合插值与平滑旋转

3.1 刚体位姿描述:位置 + 姿态

刚体,说白了就是一个不会变形的物体。比如机械臂的连杆、末端执行器,都是刚体。描述刚体在空间中的状态,需要两个信息:位置和姿态。

  • 位置:刚体上某个参考点(通常是质心或坐标系原点)在参考坐标系中的坐标,用 (x, y, z) 表示。
  • 姿态:刚体相对于参考坐标系的朝向,也就是它“转”到了哪个方向。

我习惯把位姿想象成“你站在哪 + 你面朝哪”。位置好理解,姿态才是容易出坑的地方。

个人习惯: 我在项目中通常把基坐标系作为全局参考系,末端坐标系作为工具坐标系。这样位姿变换链路清晰,调试时也容易定位问题。

3.2 旋转矩阵:姿态的数学表达

旋转矩阵是描述姿态最直接的方式。它是一个 3×3 的正交矩阵,列向量表示刚体坐标系各轴在参考坐标系中的方向。

举个例子,假设刚体坐标系绕 Z 轴旋转 θ 角度,旋转矩阵长这样:

R_z(θ) = | cosθ  -sinθ  0 |
         | sinθ   cosθ  0 |
         | 0      0     1 |

同理,绕 X 轴和 Y 轴的旋转矩阵:

R_x(θ) = | 1   0      0    |
         | 0  cosθ  -sinθ |
         | 0  sinθ   cosθ |

R_y(θ) = | cosθ  0  sinθ |
         | 0     1  0    |
         | -sinθ 0  cosθ |

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

  • 正交性:RT = R-1,且 det(R) = 1
  • 组合旋转:多个旋转矩阵相乘,顺序很重要(先乘的离刚体近)
  • 逆矩阵就是反向旋转
我曾经踩过的坑: 旋转矩阵乘法不满足交换律!R1 * R2 ≠ R2 * R1。有一次我写代码时把顺序搞反了,结果机械臂末端姿态完全不对。记住:先发生的旋转乘在右边,后发生的乘在左边。

3.3 齐次变换矩阵:位置 + 姿态的统一

旋转矩阵只处理姿态,位置还得单独加个向量。为了统一,我们引入齐次变换矩阵。它是一个 4×4 矩阵:

T = | R   p |
    | 0   1 |

其中 R 是 3×3 旋转矩阵,p 是 3×1 位置向量。最后一行是 [0 0 0 1]。

齐次变换矩阵的好处:

  • 一次矩阵乘法,同时完成旋转和平移
  • 可以串联多个变换:T总 = T1 * T2 * T3 ...
  • 逆矩阵可以直接求,用于反向变换

举个例子,从基坐标系到末端坐标系的变换:

T_base_to_end = | R  p |
                | 0  1 |

# 假设末端在基坐标系中的位置是 (0.5, 0.3, 0.2),绕Z轴旋转30°
# 那么 T 就是:
# | cos30°  -sin30°  0  0.5 |
# | sin30°   cos30°  0  0.3 |
# | 0        0       1  0.2 |
# | 0        0       0  1   |
关键点: 齐次变换矩阵是运动学正解和逆解的基础。你写轨迹规划代码时,90% 的坐标变换都靠它。

3.4 欧拉角:直观但有限制

旋转矩阵有9个元素,但真正独立的只有3个。欧拉角就是用3个角度来描述姿态,比如常见的 ZYX 顺序:先绕 Z 轴转 γ,再绕 Y 轴转 β,最后绕 X 轴转 α。

欧拉角的优点:直观,容易理解。缺点也很明显:

  • 万向锁问题:当 β = ±90° 时,α 和 γ 的旋转轴重合,丢失一个自由度
  • 多值性:同一个姿态对应多组欧拉角
  • 插值困难:直接对角度线性插值,路径可能不自然
我曾经踩过的坑: 有一次做视觉引导抓取,目标姿态的俯仰角刚好接近 90°,结果欧拉角解算直接跳变,机械臂来了个“大回环”。后来改用四元数才解决。

3.5 四元数:平滑旋转的利器

四元数是一个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,(x, y, z) 是虚部。它用4个参数表示旋转,没有万向锁问题,插值平滑。

四元数的核心操作:

  • 单位四元数:w² + x² + y² + z² = 1,表示纯旋转
  • 旋转向量转四元数:绕单位向量 u 旋转 θ 角,q = (cos(θ/2), u*sin(θ/2))
  • 四元数乘法:q总 = q1 * q2,表示先转 q2 再转 q1
  • 球面线性插值(Slerp):在两个四元数之间平滑过渡

四元数和旋转矩阵可以互相转换。我个人习惯在轨迹规划中用四元数做插值,在运动学计算中转回旋转矩阵。

我建议: 如果你刚开始接触,先掌握旋转矩阵和齐次变换矩阵。等遇到姿态插值或万向锁问题时,再深入四元数。别一开始就钻四元数,容易晕。

3.6 三种姿态表示方法的对比

表示方法 参数数量 优点 缺点 适用场景
旋转矩阵 9 数学性质好,易于组合 冗余参数,不直观 运动学计算、坐标变换
欧拉角 3 直观,容易理解 万向锁,多值性,插值困难 人机交互、简单姿态显示
四元数 4 无万向锁,插值平滑 不够直观,需要转换 轨迹规划、姿态插值、滤波

3.7 实战建议:如何选择

说了这么多,到底用哪个?我的经验是这样的:

  • 做运动学正解/逆解:用齐次变换矩阵,4×4 矩阵乘法一气呵成
  • 做轨迹规划:用四元数做姿态插值,避免欧拉角的跳变
  • 调试和显示:用欧拉角,方便人眼观察和理解
  • 传感器融合:用四元数,避免万向锁,适合滤波算法
记住: 没有万能的表示方法。在不同环节用不同的工具,才是工程上的最优解。

好了,这一章的内容就到这里。坐标系和位姿描述是运动控制的基石,理解透了,后面的轨迹规划才能走得稳。如果你在项目中遇到位姿相关的问题,欢迎随时交流。