3、坐标系与姿态表示:机体坐标系、世界坐标系、欧拉角、四元数、旋转矩阵
步数计数算法的核心任务,是将加速度计与陀螺仪输出的原始物理量,转换为对行人运动状态的准确描述。而这一转换的数学基础,正是坐标系定义与姿态表示方法。在基于姿态传感器的智能步数计数系统中,我们通常需要同时维护两个坐标系:一个固定于地球的世界坐标系(World Frame),用于定义重力方向与水平面;另一个固定于传感器或人体肢体的机体坐标系(Body Frame),用于描述传感器三轴的实际朝向。姿态表示则是描述这两个坐标系之间旋转关系的数学工具,常用的有欧拉角、旋转矩阵与四元数三种形式。理解它们各自的定义、转换关系与适用场景,是后续进行重力分量消除、步态特征提取与计步决策的前提。
3.1 机体坐标系与世界坐标系的定义与作用
核心原理:机体坐标系(Body Frame,记为 b 系)固连于传感器芯片或行人佩戴的肢体上,其原点通常位于传感器质心,三轴方向由芯片封装定义。以常见的六轴惯性测量单元(IMU)为例,其 X 轴指向芯片右侧,Y 轴指向前方,Z 轴垂直向上,构成右手直角坐标系。加速度计与陀螺仪输出的原始数据,均是在机体坐标系下测量的。世界坐标系(World Frame,记为 w 系)则固定于地球表面,通常采用东北天(ENU)或北东地(NED)约定。在步数计数场景中,我们最关心的是世界坐标系下的重力方向(通常为 Z 轴负方向或正方向),因为行人行走时,身体重心沿垂直方向的周期性起伏是步态识别的重要特征。
判断方法:在算法设计中,需要明确区分两个坐标系的作用。加速度计直接测量的是机体坐标系下的比力(Specific Force),即 a_b = [a_x, a_y, a_z]ᵀ。而步数计数算法通常需要提取垂直方向的加速度分量,因此必须将机体坐标系下的加速度转换到世界坐标系下,即 a_w = R · a_b,其中 R 为旋转矩阵。若忽略这一转换,直接将机体坐标系的 Z 轴加速度作为垂直方向,当手机在口袋中翻转或手臂摆动时,计步结果将产生严重偏差。
实战场景:假设用户将手机竖直握在手中,屏幕朝前。此时机体坐标系的 Y 轴指向地面方向,Z 轴指向用户前方。若直接使用 Z 轴加速度判断步态,则完全无法捕捉到垂直方向的运动。正确做法是:先通过姿态解算得到旋转矩阵 R,再将机体加速度投影到世界坐标系的垂直轴(Z 轴)上,得到 a_w_z,然后对该信号进行滤波与峰值检测。
常见误区:初学者容易混淆“传感器安装方向”与“世界坐标系方向”。例如,将加速度计平放在桌面上时,其 Z 轴输出约为 1g(重力加速度),但若将传感器侧立,则 X 轴或 Y 轴输出 1g。这并不意味着重力方向改变了,而是机体坐标系与世界坐标系之间的旋转关系发生了变化。因此,任何基于加速度幅值的步数算法,都必须先进行坐标系归一化处理。
3.2 欧拉角:直观但存在万向锁风险
核心原理:欧拉角通过三次绕不同坐标轴的旋转来描述姿态,常用的顺序为 Z-Y-X,分别对应偏航角(Yaw,ψ)、俯仰角(Pitch,θ)和横滚角(Roll,φ)。旋转矩阵可由这三个角度依次构造:R = Rz(ψ) · Ry(θ) · Rx(φ)。欧拉角的物理意义直观,便于人机交互显示,例如在手机游戏或无人机遥控器中,用户可以直接看到“当前俯仰角 30°”这样的信息。
判断方法:在步数计数算法中,欧拉角主要用于两个场景:一是姿态初始对准,即确定传感器相对于世界的初始朝向;二是作为姿态解算的中间输出,用于调试和可视化。然而,欧拉角存在一个致命缺陷——万向锁(Gimbal Lock)。当俯仰角接近 ±90° 时,横滚与偏航的旋转轴重合,系统丢失一个自由度,导致姿态解算奇异。
| 表示方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 欧拉角 | 直观、易理解、占用内存小(3个变量) | 万向锁、三角函数计算量大、插值不平滑 | 显示、初始对准、简单控制 |
| 旋转矩阵 | 无奇异、可直接变换向量 | 9个变量冗余、需正交化、存储大 | 坐标变换、理论推导 |
| 四元数 | 无奇异、计算高效、插值平滑 | 不直观、需归一化约束 | 姿态解算、滤波融合、实时系统 |
案例拆解:某计步手环在用户快速跑步时出现步数跳变。排查发现,算法使用欧拉角进行姿态更新,当手臂摆动幅度较大导致俯仰角接近 90° 时,万向锁引起姿态跳变,进而使重力分量估计错误,产生虚假峰值。解决方案是将姿态表示切换为四元数,并采用互补滤波或卡尔曼滤波进行姿态融合,问题随即消除。
风险提示:在步数计数这类需要长时间连续运行的算法中,应避免直接使用欧拉角进行积分或微分运算。欧拉角的三角函数计算会引入较大延迟,且万向锁问题在动态运动场景下几乎不可避免。建议仅在最终输出或调试界面中使用欧拉角。
3.3 旋转矩阵:坐标变换的桥梁
核心原理:旋转矩阵 R 是一个 3×3 的正交矩阵,满足 R·Rᵀ = I 且 det(R) = 1。它将机体坐标系下的向量映射到世界坐标系:v_w = R · v_b。旋转矩阵的列向量分别表示机体坐标系的三个轴在世界坐标系中的方向余弦。例如,R 的第三列即为机体 Z 轴在世界坐标系下的单位向量,该向量与重力方向的点积可用于计算垂直加速度分量。
操作流程:在实际工程中,旋转矩阵通常由四元数转换而来。给定四元数 q = [w, x, y, z],旋转矩阵的每个元素可由以下公式计算:
R[0][0] = 1 - 2(y² + z²)
R[0][1] = 2(xy - wz)
R[0][2] = 2(xz + wy)
R[1][0] = 2(xy + wz)
R[1][1] = 1 - 2(x² + z²)
R[1][2] = 2(yz - wx)
R[2][0] = 2(xz - wy)
R[2][1] = 2(yz + wx)
R[2][2] = 1 - 2(x² + y²)
实战场景:在步数计数中,旋转矩阵最直接的应用是重力分量消除。设世界坐标系下重力向量为 g_w = [0, 0, 9.8](ENU 约定),则机体坐标系下的重力估计值为 g_b = Rᵀ · g_w。从加速度计原始读数中减去该重力估计值,即可得到由人体运动产生的线性加速度 a_linear = a_meas - g_b。这一线性加速度在垂直方向的分量是步态周期检测的关键输入。
经验提醒:旋转矩阵虽然冗余,但在需要频繁进行向量坐标变换时效率很高。在嵌入式平台上,如果内存充足且对实时性要求极高,可以保留旋转矩阵形式,避免每次变换都从四元数重新计算。
3.4 四元数:姿态解算的工程首选
核心原理:四元数是一种超复数,形式为 q = w + xi + yj + zk,其中 w 为实部,(x, y, z) 为虚部,且满足 i² = j² = k² = ijk = -1。单位四元数(||q|| = 1)可以唯一表示三维空间中的旋转。相比欧拉角,四元数不存在万向锁问题;相比旋转矩阵,四元数仅需 4 个变量,且乘法运算比矩阵乘法更高效。四元数对向量 v 的旋转操作为 v' = q ⊗ v ⊗ q*,其中 q* 为共轭四元数。
判断方法:在步数计数系统中,四元数通常由陀螺仪积分和加速度计/磁力计修正得到。常用的融合算法包括互补滤波(Mahony/Madgwick)和扩展卡尔曼滤波(EKF)。这些算法以陀螺仪角速度作为预测输入,以加速度计和磁力计作为观测修正,输出最优的四元数估计。四元数的更新方程为:
q_dot = 0.5 * q ⊗ ω_b
其中 ω_b = [0, ω_x, ω_y, ω_z] 为机体角速度四元数
案例拆解:某腰部佩戴式计步器采用 Madgwick 互补滤波算法,采样频率 100Hz,陀螺仪量程 ±2000dps,加速度计量程 ±16g。算法初始化时,利用加速度计静态读数计算初始俯仰与横滚角,利用磁力计计算初始偏航角,生成初始四元数。运行过程中,每收到一组新数据,先进行陀螺仪积分预测,再根据加速度计与磁力计的误差进行梯度下降修正。最终输出的四元数用于将加速度转换到世界坐标系,提取垂直方向加速度,进而通过峰值检测与步态周期判断实现计步。实测在慢走、快走、跑步三种场景下,计步准确率均超过 97%。
总结复盘:四元数在步数计数中的优势不仅在于避免万向锁,更在于其计算效率高、适合嵌入式实时处理。但需要注意两点:一是四元数必须保持单位模长,长时间积分会导致漂移,需定期归一化;二是四元数不直观,调试时需转换为欧拉角显示。在工程实现中,建议将四元数作为内部姿态表示,欧拉角仅用于日志输出和用户界面。
常见误区:部分开发者误以为四元数可以直接替代旋转矩阵进行坐标变换,而忽略了四元数旋转操作需要两次乘法(q ⊗ v ⊗ q*)的事实。在向量变换频率极高的场景下,先将四元数转换为旋转矩阵,再进行单次矩阵乘法,可能比直接使用四元数旋转更快。此外,四元数的符号约定(Hamilton 或 JPL)在不同文献中可能不同,团队协作时需统一约定,避免因符号差异导致姿态解算错误。