一、陀螺仪基础与姿态表示

各位同学好,我是老张。在惯性导航这个行当摸爬滚打了十几年,今天咱们来聊聊陀螺仪积分算法与漂移补偿。说实话,这个主题是惯导系统里最核心、也最让人头疼的部分。我刚开始做项目时,就被陀螺仪的漂移坑过好几次。

先问大家一个问题:你知道为什么无人机能悬停得那么稳?为什么手机横过来屏幕就自动旋转?背后都是陀螺仪在干活。但陀螺仪有个毛病——它会漂。嗯,这就是我们今天要解决的核心问题。

核心观点:陀螺仪测量的是角速度,不是角度。要得到姿态,必须做积分。而积分,就会引入误差。

1.1 陀螺仪工作原理

陀螺仪的原理,说白了就是利用科里奥利力。你想想看,一个高速旋转的物体,当外界给它施加一个转动时,会产生一个垂直于转动方向的力。MEMS陀螺仪就是靠这个原理来测量角速度的。

我记得2015年做一款工业级IMU时,选型就折腾了两个月。不同厂家的陀螺仪,性能差异巨大。我给大家列个常见的参数对比:

参数 消费级(如MPU6050) 工业级(如ADIS16470) 战术级(如HG4930)
零偏稳定性 10-100 °/h 1-10 °/h 0.1-1 °/h
角随机游走 0.3-1.0 °/√h 0.1-0.3 °/√h 0.01-0.1 °/√h
量程 ±2000 °/s ±500 °/s ±200 °/s
价格 几十元 几千元 几万元

我的经验:做消费级产品,MPU6050够用。但做导航级产品,千万别省这个钱。我曾经在一个AGV项目上用了消费级陀螺仪,结果每10分钟就要重新校准一次,客户差点退货。

1.2 角速度测量与积分

陀螺仪输出的是角速度 ω = (ωx, ωy, ωz),单位是 °/s 或 rad/s。要得到角度,必须做积分:

// 简单的角度积分
angle += gyro * dt;

// 但实际项目中,我建议用这种
angle = angle + gyro * dt + 0.5 * gyro_dot * dt * dt;

为什么要有二阶项?因为角速度本身也在变化。你想想看,如果飞机在做快速滚转,只用一阶积分,误差会很大。

注意:积分会累积误差。陀螺仪的零偏误差,经过积分后会变成随时间增长的角度误差。这就是漂移的来源。

1.3 姿态表示方法

姿态表示,说白了就是描述一个物体在三维空间里是怎么转的。常用的有三种方法:欧拉角、旋转矩阵、四元数。我一个个说。

1.3.1 欧拉角

欧拉角最直观,就是绕三个轴转的角度:

  • 横滚角(Roll):绕X轴转动,范围 ±180°
  • 俯仰角(Pitch):绕Y轴转动,范围 ±90°
  • 偏航角(Yaw):绕Z轴转动,范围 ±180°

但欧拉角有个致命问题——万向锁。当俯仰角接近 ±90° 时,横滚和偏航会耦合在一起,丢失一个自由度。我在做飞行器控制时就遇到过这个问题,飞机倒飞时姿态解算直接崩了。

1.3.2 旋转矩阵

旋转矩阵用 3×3 的矩阵表示旋转,没有万向锁问题。但计算量大,而且需要满足正交约束。

// 绕Z轴旋转θ角的旋转矩阵
Rz(θ) = [cosθ  -sinθ  0]
        [sinθ   cosθ  0]
        [0      0     1]

我的习惯:在嵌入式系统里,我很少直接用旋转矩阵做积分。因为每次更新后都要重新正交化,太费算力了。

1.3.3 四元数

四元数是我最推荐的方法。它用四个数表示旋转,没有奇点,计算效率高。形式是:

q = [q0, q1, q2, q3] = [cos(θ/2), sin(θ/2)*nx, sin(θ/2)*ny, sin(θ/2)*nz]

其中 (nx, ny, nz) 是旋转轴,θ 是旋转角度。四元数的更新公式也很简洁:

// 四元数微分方程
dq/dt = 0.5 * q ⊗ ω

// 离散化更新
q_new = q_old + 0.5 * q_old ⊗ ω * dt

为什么选四元数?三个原因:没有万向锁、计算量小、容易归一化。我在所有嵌入式项目里都用四元数。

1.4 三种方法的对比

特性 欧拉角 旋转矩阵 四元数
参数数量 3 9 4
万向锁
计算量
插值 困难 困难 容易
直观性

1.5 知识体系结构图

下面这张图是我自己画的,把本章的知识脉络理清楚了:

陀螺仪积分与姿态表示 陀螺仪工作原理 角速度测量与积分 姿态表示方法 科里奥利力 → MEMS陀螺仪 消费级 / 工业级 / 战术级 一阶积分 vs 二阶积分 ⚠ 误差累积 → 漂移 欧拉角 / 旋转矩阵 / 四元数 万向锁 / 计算量 / 奇点 推荐方案:四元数 + 二阶积分 三个关键点 1. 陀螺仪测的是角速度,不是角度 2. 积分会累积误差,必须做补偿 3. 四元数是嵌入式系统的最佳选择

1.6 避坑指南

最后,我分享几个实战中踩过的坑:

  • 采样率不够:我曾经用100Hz的采样率做无人机姿态解算,结果高频振动导致积分发散。后来改到400Hz才稳定。
  • 忘记归一化:四元数如果不做归一化,模长会慢慢偏离1,导致姿态失真。我建议每100次更新做一次归一化。
  • 忽略地球自转:高精度导航时,地球自转的角速度(15°/h)不能忽略。我有个朋友做船载惯导,没考虑这个,航向误差每小时漂了15度。

我的建议:新手先从四元数入手,配合二阶积分。等把基础打牢了,再研究更高级的滤波算法。别一上来就搞卡尔曼滤波,容易把自己绕晕。

好了,这一章就到这里。记住我说的:陀螺仪测角速度,积分得角度,四元数最靠谱。下一章我们聊聊具体的积分算法实现。


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