11、角度积分原理:通过角速度积分得到旋转角度,欧拉角与四元数简介
好,我们进入正题。前面几章我们一直在聊怎么读取陀螺仪的原始数据,怎么处理噪声。但说实话,拿到角速度数据只是第一步。你真正想要的是什么?是知道手机转了多少度,对吧?
这就引出了本章的核心问题:怎么从角速度算出角度。说白了,就是积分。
11.1 从角速度到角度:积分到底在干什么
先回忆一下高中物理。速度对时间积分得到位移。角速度对时间积分,得到的就是旋转角度。公式很简单:
θ = ∫ ω(t) dt
但在数字世界里,我们拿不到连续的 ω(t)。我们只有离散的采样点。所以实际用的是累加:
θ[n] = θ[n-1] + ω[n] × Δt
嗯,这里要注意。这个公式看着简单,但坑特别多。我刚开始做IMU融合的时候,就因为这个公式吃了大亏。
核心要点:每次采样间隔 Δt 必须精确。如果你用 100Hz 采样,Δt 就是 0.01 秒。但 Android 的传感器回调时间并不严格均匀,有时候会跳变。我建议你每次回调时都重新计算 Δt,而不是用固定值。
举个例子。假设陀螺仪 Z 轴输出 30°/s,采样间隔 10ms。那么这一步的增量就是:
Δθ = 30 × 0.01 = 0.3°
累加 100 次,就是 30°。看起来没问题对吧?但如果你用固定 Δt,而实际间隔变成了 15ms,那误差就累积了 50%。
我的习惯:每次 onSensorChanged 回调里,用当前时间戳减去上次时间戳,算出真实的 Δt。虽然麻烦一点,但精度提升很明显。
11.2 积分误差:为什么纯积分不可靠
你可能会想:既然公式这么简单,那直接累加不就行了?
不行。原因有两个。
第一,零偏误差。陀螺仪静止时输出不是严格的 0,而是有一个小偏移。假设偏移是 0.1°/s,积分 10 秒就漂了 1°。一分钟就是 6°。这个误差会一直累积下去,永远不会消失。
第二,噪声积分。白噪声虽然均值为 0,但积分之后会变成随机游走。说白了,噪声会越积越大。
我曾经做过一个纯积分测试:手机放在桌上不动,陀螺仪积分 5 分钟,结果显示手机转了 200 多度。这就是典型的漂移问题。
避坑指南:千万不要在长时间应用里只用陀螺仪积分。纯积分只适合短时间(几秒内)的姿态跟踪。超过 10 秒,必须引入其他传感器(比如加速度计、磁力计)进行修正。
11.3 欧拉角:直观但有问题
好,现在我们能算出角度了。但怎么表示旋转呢?最直观的方式就是欧拉角。
欧拉角用三个角度描述旋转:俯仰角(Pitch)、横滚角(Roll)、偏航角(Yaw)。对应手机的 X、Y、Z 轴旋转。
| 角度 | 轴 | 范围 | 说明 |
|---|---|---|---|
| Pitch | X 轴 | -90° ~ 90° | 手机抬头低头 |
| Roll | Y 轴 | -180° ~ 180° | 手机左右倾斜 |
| Yaw | Z 轴 | -180° ~ 180° | 手机水平旋转 |
欧拉角的好处是直观。你一看 Pitch=30°,就知道手机抬起了 30 度。但欧拉角有个致命问题——万向锁。
当 Pitch 接近 ±90° 时,Roll 和 Yaw 会变得无法区分。你想想看,手机竖直指向天空时,你再怎么转 Yaw,看起来都像是 Roll 在变。这就是万向锁。
我的经验:在游戏或 AR 应用中,如果用户可能把手机竖起来,千万别用欧拉角做插值或平滑。否则你会看到角度突然跳变,体验极差。
11.4 四元数:不直观但好用
那怎么办?用四元数。
四元数用四个数表示旋转:一个标量 w 和三个向量 x, y, z。形式是:
q = w + xi + yj + zk
其中 i² = j² = k² = -1。嗯,看着像复数对吧?其实就是复数的推广。
四元数没有万向锁问题,而且插值平滑。做姿态融合时,几乎所有算法(比如 Madgwick、Mahony)都用四元数。
从角速度更新四元数的公式是这样的:
dq/dt = 0.5 × q × ω
其中 ω 是角速度的四元数形式 (0, ωx, ωy, ωz)。实际代码里,我们做离散更新:
// 伪代码
q_new = q_old + 0.5 * q_old * ω * Δt
// 然后归一化
q_new = normalize(q_new)
一个小技巧:每次更新后一定要归一化。因为数值误差会让四元数的模长偏离 1,不归一化的话姿态会慢慢变形。我见过有人忘了这步,结果姿态越算越歪。
11.5 知识体系总览
下面这张图总结了本章的核心逻辑:从角速度到旋转角度的完整路径。
11.6 实际项目中的选择建议
说了这么多,到底该用欧拉角还是四元数?我个人的建议是这样的:
- 简单展示场景(比如显示手机倾斜角度):用欧拉角。直观,好理解。
- 需要平滑旋转(比如 VR/AR、游戏):用四元数。避免万向锁,插值自然。
- 姿态融合算法:必须用四元数。Madgwick、Mahony 这些算法都是基于四元数的。
最后提醒一句:不管用哪种表示方式,纯积分都会漂移。我在项目里见过有人只用陀螺仪积分做导航,结果 30 秒后方向完全偏了。记住,陀螺仪只适合短时跟踪,长时稳定必须靠加速度计和磁力计来修正。
嗯,这一章的内容就到这。积分原理、欧拉角、四元数,这三块是后续所有姿态算法的基础。你把这些搞清楚了,后面学 Madgwick 滤波就会轻松很多。
公众号:蓝海资料掘金营,微信deep3321