三维空间基础:坐标系定义、旋转矩阵、向量旋转与坐标变换的基本概念
在进入欧拉角与四元数的讨论之前,我们必须先夯实三维空间中最底层的数学与几何地基。姿态描述的本质上是在回答“一个刚体在空间中相对于参考系是如何摆放的”这一问题,而这一问题的数学表达离不开坐标系、旋转矩阵与向量变换。本章将系统梳理右手坐标系与左手坐标系的定义差异、旋转矩阵的构造逻辑、向量旋转的两种视角(旋转向量与旋转坐标系),以及坐标变换的完整链路。这些概念不仅是欧拉角与四元数的推导基础,也是后续所有姿态解算、传感器融合与三维可视化工程的共同语言。
坐标系定义:从右手定则到工程参考系
三维空间中的任何姿态描述都必须依附于一个明确的坐标系。最基础的定义是右手直角坐标系:三个相互正交的单位向量 i、j、k 满足 i × j = k,即右手拇指指向X轴正方向、食指指向Y轴正方向、中指指向Z轴正方向。左手坐标系则相反,满足 j × i = k。在绝大多数机器人学、航空航天和计算机图形学应用中,右手系是默认选择,但需要注意某些图形API(如早期DirectX)使用左手系,这会导致旋转矩阵的符号约定不同。
在工程实践中,我们通常需要区分三类坐标系:
- 惯性坐标系(世界系):固定于地球或宇宙空间,是姿态测量的参考。例如NED(北-东-地)或ENU(东-北-天)坐标系。
- 载体坐标系(机体系):固定于运动刚体上,原点位于刚体质心,X轴通常指向机头方向,Y轴指向右翼,Z轴指向下方(NED约定)或上方(ENU约定)。
- 导航坐标系:用于解算载体位置与速度的中间参考系,通常与惯性系对齐但原点随载体移动。
坐标系定义的关键在于明确旋转顺序与旋转轴约定。例如,欧拉角(横滚-俯仰-偏航)在NED系中通常定义为:先绕Z轴偏航(ψ),再绕新Y轴俯仰(θ),最后绕新X轴横滚(φ)。这种“绕新轴旋转”的方式称为内旋(intrinsic rotation),而“绕固定轴旋转”称为外旋(extrinsic rotation)。两者得到的旋转矩阵互为转置关系,工程中若混用将导致姿态解算完全错误。
旋转矩阵:构造、性质与组合逻辑
旋转矩阵 R 是一个 3×3 的正交矩阵,满足 RᵀR = I 且 det(R) = +1。其每一列表示旋转后坐标系的基向量在原坐标系中的投影。绕X轴、Y轴、Z轴旋转角度 θ 的基本旋转矩阵分别为:
R_x(θ) = [1, 0, 0;
0, cosθ, -sinθ;
0, sinθ, cosθ]
R_y(θ) = [ cosθ, 0, sinθ;
0, 1, 0;
-sinθ, 0, cosθ]
R_z(θ) = [cosθ, -sinθ, 0;
sinθ, cosθ, 0;
0, 0, 1]
注意上述矩阵是主动旋转(向量绕轴旋转)的表示。若用于坐标变换(被动旋转),则需取转置。复合旋转通过矩阵乘法实现,例如“先绕X轴旋转α,再绕Y轴旋转β,最后绕Z轴旋转γ”的旋转矩阵为 R = R_z(γ) · R_y(β) · R_x(α)。这里的关键是矩阵乘法的顺序:最右侧的旋转最先执行。这一约定源于矩阵乘法作用于列向量时从右向左结合的性质。
| 旋转类型 | 数学表达 | 物理含义 | 工程应用 |
|---|---|---|---|
| 主动旋转(向量旋转) | v' = R · v | 向量在固定坐标系中绕轴旋转 | 刚体姿态更新、点云变换 |
| 被动旋转(坐标变换) | v_B = R · v_A | 同一向量在不同坐标系中的坐标表示 | 传感器数据对齐、多坐标系标定 |
| 复合旋转 | R = R_1 · R_2 · R_3 | 多次旋转的叠加,顺序敏感 | 欧拉角转矩阵、机械臂运动学 |
旋转矩阵的三大性质在工程中极为重要:正交性(RᵀR=I)可用于数值校验和误差修正;行列式为+1 排除了反射变换;逆矩阵等于转置 使得反向变换无需额外计算。在嵌入式系统中,由于浮点运算累积误差,旋转矩阵会逐渐失去正交性,因此需要定期正交化(如Gram-Schmidt过程)或改用四元数。
向量旋转与坐标变换:两种视角的等价性
向量旋转与坐标变换是同一数学操作的两个视角。假设空间中有一个固定向量 v,其坐标为 (x, y, z)。主动旋转将向量本身绕某轴旋转角度 θ,得到新向量 v',其坐标变为 (x', y', z'),计算公式为 v' = R · v。被动旋转则保持向量不变,但将坐标系旋转角度 θ,向量在新坐标系中的坐标变为 v' = Rᵀ · v。两者得到的坐标数值相同,但物理意义截然不同。
在姿态解算中,我们通常使用被动旋转视角:载体坐标系相对于惯性坐标系的姿态用旋转矩阵 R 表示,则惯性系中的向量 v_i 在载体系中的坐标为 v_b = R · v_i。反之,载体系中的向量转换到惯性系为 v_i = Rᵀ · v_b。这一关系是IMU数据融合、视觉SLAM和机器人运动学的基础。
完整的坐标变换还包含平移分量。设惯性系原点 O_i 到载体系原点 O_b 的平移向量为 t,则空间点 P 在惯性系中的坐标 p_i 与在载体系中的坐标 p_b 满足:
p_i = R · p_b + t
这一公式称为刚体变换(或等距变换),在齐次坐标下可表示为 4×4 矩阵:
T = [R t;
0 1]
齐次变换矩阵的级联非常方便:T_global_to_camera = T_global_to_robot · T_robot_to_camera。在机械臂标定、多传感器融合和三维重建中,这种链式变换是标准操作。
v' = R * v 时,先确认 R 是主动旋转矩阵还是被动旋转矩阵。一个快速判断方法:若 R 的列向量是旋转后坐标系的基向量在原坐标系中的投影,则为被动旋转(坐标变换);若 R 的列向量是原基向量旋转后的位置,则为主动旋转。两者相差一个转置。
案例拆解:无人机姿态解算中的坐标变换链路
以四旋翼无人机为例,其姿态解算系统需要融合加速度计、陀螺仪和磁力计数据。假设无人机在NED惯性系中飞行,机体坐标系定义为:X轴指向机头,Y轴指向右翼,Z轴指向下方。初始时,机体系与NED系对齐。
场景与目标:无人机悬停时,加速度计测得机体坐标系下的重力加速度分量为 a_b = (0.1, 0.2, 9.8) m/s²(理想情况下应为 (0, 0, 9.8))。我们需要利用这一测量值估计当前姿态角(横滚φ和俯仰θ)。
分析过程:在NED系中,重力加速度向量为 g_i = (0, 0, 9.8)。根据坐标变换关系,a_b = R · g_i,其中 R 是机体系相对于NED系的旋转矩阵。采用Z-Y-X内旋约定,R = R_z(ψ) · R_y(θ) · R_x(φ)。由于悬停时偏航角ψ未知,但重力向量与偏航无关,我们可以直接利用R_y(θ) · R_x(φ)部分。
计算步骤:
- 将 a_b 归一化:a_b_norm = (0.0102, 0.0204, 1.0)。
- 根据旋转矩阵展开,可得:a_x = -sinθ,a_y = cosθ·sinφ,a_z = cosθ·cosφ。
- 由 a_x = -sinθ,得 θ = arcsin(-0.0102) ≈ -0.58°。
- 由 a_y / a_z = tanφ,得 φ = arctan2(0.0204, 1.0) ≈ 1.17°。
结果与验证:计算得到的横滚角约1.17°,俯仰角约-0.58°,符合无人机轻微倾斜的物理直觉。若直接使用主动旋转矩阵,则符号会相反,导致姿态估计错误。
风险与代价:加速度计易受机体振动和线性加速度干扰,因此仅适用于静态或准静态姿态估计。动态飞行时需融合陀螺仪积分数据,并通过互补滤波或卡尔曼滤波进行校正。
Rotation.from_euler('ZYX', angles) 默认使用内旋,而 Rotation.from_euler('zyx', angles) 使用外旋,大小写敏感。
总结复盘:坐标系与旋转矩阵的工程要点
本章的核心逻辑可以归纳为一条链路:坐标系定义 → 旋转矩阵构造 → 向量旋转/坐标变换 → 姿态解算。在实际项目中,建议遵循以下清单进行自查:
- 明确坐标系类型(右手/左手,NED/ENU),并绘制坐标系关系图。
- 确定旋转顺序(如Z-Y-X)和旋转方式(内旋/外旋),并在代码注释中标注。
- 验证旋转矩阵的正交性(RᵀR ≈ I)和行列式(det ≈ +1),用于调试数值误差。
- 区分主动旋转与被动旋转,在接口文档中说明矩阵的物理含义。
- 使用齐次变换矩阵处理包含平移的坐标变换,避免手动拼接旋转和平移。
旋转矩阵虽然直观,但存在冗余性(9个元素表达3个自由度)和万向锁问题,这为后续引入欧拉角和四元数埋下伏笔。欧拉角直接对应物理旋转轴,但存在奇异性;四元数紧凑且无奇异,但不够直观。理解本章的坐标变换基础,是掌握这两种高级姿态表示方法的必要前提。