三维空间基础:坐标系定义、旋转矩阵、向量旋转与坐标变换的基本概念

在进入欧拉角与四元数的讨论之前,我们必须先夯实三维空间中最底层的数学与几何地基。姿态描述的本质上是在回答“一个刚体在空间中相对于参考系是如何摆放的”这一问题,而这一问题的数学表达离不开坐标系、旋转矩阵与向量变换。本章将系统梳理右手坐标系与左手坐标系的定义差异、旋转矩阵的构造逻辑、向量旋转的两种视角(旋转向量与旋转坐标系),以及坐标变换的完整链路。这些概念不仅是欧拉角与四元数的推导基础,也是后续所有姿态解算、传感器融合与三维可视化工程的共同语言。

三维空间姿态描述基础框架 坐标系定义 • 右手系:X×Y=Z • 左手系:Y×X=Z • 惯性系 / 载体系 / 导航系 • 欧拉角旋转顺序依赖 旋转矩阵 R • 3×3 正交矩阵 • det(R)=+1(右手系) • R⁻¹ = Rᵀ • 组合:R = Rz·Ry·Rx 向量旋转与坐标变换 • 主动旋转:向量动,系不动 • 被动旋转:系动,向量不变 • v' = R·v • 坐标变换链:T = R·t + d 核心关系链 欧拉角(α,β,γ)→ 旋转矩阵 R(α,β,γ) → 向量旋转 v' = R·v → 坐标变换 p_B = R·p_A + t 四元数 q 与 R 可互相转换,但需注意旋转顺序与参考系约定 ⚠ 常见误区 1. 旋转矩阵乘法顺序:R = Rz·Ry·Rx 表示先绕X轴,再绕Y轴,最后绕Z轴(内旋/外旋约定不同) 2. 主动旋转与被动旋转的矩阵互为转置关系,工程中必须明确约定

坐标系定义:从右手定则到工程参考系

三维空间中的任何姿态描述都必须依附于一个明确的坐标系。最基础的定义是右手直角坐标系:三个相互正交的单位向量 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)。两者得到的旋转矩阵互为转置关系,工程中若混用将导致姿态解算完全错误。

经验提醒:在项目启动时,务必在文档中明确写出坐标系定义、旋转顺序和旋转方向(顺时针/逆时针)。建议使用“Z-Y-X内旋”或“Z-Y-X外旋”这样的标准术语,并附上图示。一个简单的验证方法是:将载体坐标系与惯性系对齐,然后绕Z轴旋转90°,观察X轴指向。若X轴指向Y轴方向,则为右手系内旋;若指向-Y方向,则为左手系或外旋约定。

旋转矩阵:构造、性质与组合逻辑

旋转矩阵 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(φ)部分。

计算步骤:

  1. 将 a_b 归一化:a_b_norm = (0.0102, 0.0204, 1.0)。
  2. 根据旋转矩阵展开,可得:a_x = -sinθ,a_y = cosθ·sinφ,a_z = cosθ·cosφ。
  3. 由 a_x = -sinθ,得 θ = arcsin(-0.0102) ≈ -0.58°。
  4. 由 a_y / a_z = tanφ,得 φ = arctan2(0.0204, 1.0) ≈ 1.17°。

结果与验证:计算得到的横滚角约1.17°,俯仰角约-0.58°,符合无人机轻微倾斜的物理直觉。若直接使用主动旋转矩阵,则符号会相反,导致姿态估计错误。

风险与代价:加速度计易受机体振动和线性加速度干扰,因此仅适用于静态或准静态姿态估计。动态飞行时需融合陀螺仪积分数据,并通过互补滤波或卡尔曼滤波进行校正。

常见误区:旋转矩阵的乘法顺序不可交换。R = Rz·Ry·Rx 与 R = Rx·Ry·Rz 在欧拉角相同时得到完全不同的姿态。在代码中,务必确认库函数(如Eigen、SciPy)的旋转约定。例如,SciPy的 Rotation.from_euler('ZYX', angles) 默认使用内旋,而 Rotation.from_euler('zyx', angles) 使用外旋,大小写敏感。

总结复盘:坐标系与旋转矩阵的工程要点

本章的核心逻辑可以归纳为一条链路:坐标系定义 → 旋转矩阵构造 → 向量旋转/坐标变换 → 姿态解算。在实际项目中,建议遵循以下清单进行自查:

  • 明确坐标系类型(右手/左手,NED/ENU),并绘制坐标系关系图。
  • 确定旋转顺序(如Z-Y-X)和旋转方式(内旋/外旋),并在代码注释中标注。
  • 验证旋转矩阵的正交性(RᵀR ≈ I)和行列式(det ≈ +1),用于调试数值误差。
  • 区分主动旋转与被动旋转,在接口文档中说明矩阵的物理含义。
  • 使用齐次变换矩阵处理包含平移的坐标变换,避免手动拼接旋转和平移。

旋转矩阵虽然直观,但存在冗余性(9个元素表达3个自由度)和万向锁问题,这为后续引入欧拉角和四元数埋下伏笔。欧拉角直接对应物理旋转轴,但存在奇异性;四元数紧凑且无奇异,但不够直观。理解本章的坐标变换基础,是掌握这两种高级姿态表示方法的必要前提。