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 知识体系总览

下面这张图总结了本章的核心逻辑:从角速度到旋转角度的完整路径。

角度积分原理:从角速度到旋转角度 陀螺仪角速度 ω 离散积分:θ[n] = θ[n-1] + ω[n] × Δt 欧拉角表示 Pitch / Roll / Yaw ⚠ 存在万向锁问题 四元数表示 q = w + xi + yj + zk ✅ 无万向锁,适合融合 实际应用:短时用积分,长时用融合

11.6 实际项目中的选择建议

说了这么多,到底该用欧拉角还是四元数?我个人的建议是这样的:

  • 简单展示场景(比如显示手机倾斜角度):用欧拉角。直观,好理解。
  • 需要平滑旋转(比如 VR/AR、游戏):用四元数。避免万向锁,插值自然。
  • 姿态融合算法:必须用四元数。Madgwick、Mahony 这些算法都是基于四元数的。

最后提醒一句:不管用哪种表示方式,纯积分都会漂移。我在项目里见过有人只用陀螺仪积分做导航,结果 30 秒后方向完全偏了。记住,陀螺仪只适合短时跟踪,长时稳定必须靠加速度计和磁力计来修正。

嗯,这一章的内容就到这。积分原理、欧拉角、四元数,这三块是后续所有姿态算法的基础。你把这些搞清楚了,后面学 Madgwick 滤波就会轻松很多。


公众号:蓝海资料掘金营,微信deep3321