2、传感器基础:惯性测量单元(IMU)原理、加速度计与陀螺仪、磁力计

好,咱们正式开始啃传感器。这一章我打算把 IMU 里那三个核心器件——加速度计、陀螺仪、磁力计——掰开揉碎了讲清楚。你可能会觉得这些原理书上都写过,但实际项目里怎么用、怎么踩坑,才是我想跟你聊的重点。

先看一张总图,帮你建立整体印象。

IMU 核心传感器知识体系 惯性测量单元 (IMU) 加速度计 (Accelerometer) 陀螺仪 (Gyroscope) 磁力计 (Magnetometer) 比力 (Specific Force) 角速度 (Angular Velocity) 磁场强度 (Magnetic Field) 重力参考 + 低频姿态 短时精度高 · 长期漂移 航向 · 易受干扰 传感器融合:互补滤波 / 卡尔曼滤波

2.1 加速度计:你感受到的「力」不全是重力

加速度计测量的是 比力,不是单纯的加速度。什么意思?它测的是传感器自身感受到的惯性力与重力的合力。你把它静止放在桌上,它输出的是 1g 向上;你让它自由落体,它输出接近 0。这个特性,决定了它在姿态解算里的角色。

我习惯把加速度计当作「重力参考」。只要载体没有剧烈线加速度,加速度计就能给出比较靠谱的俯仰角和横滚角。但注意——它给不了航向角,因为重力方向跟航向是垂直的,你转个身,重力矢量在水平面投影不变。

实战技巧: 用加速度计算姿态时,先做低通滤波。我一般用截止频率 5-10 Hz 的 IIR 滤波器,把高频振动滤掉。否则你拿到的俯仰角会跟着电机抖动一起跳舞。

加速度计的输出模型可以写成:

a_meas = a_true - g + b_a + n_a

其中 b_a 是零偏,n_a 是噪声。零偏这东西,每个芯片都不一样,甚至同一颗芯片每次上电都不一样。所以标定是必须的。

2.2 陀螺仪:短时王者,长时废物

陀螺仪测的是角速度,单位一般是 °/s 或 rad/s。它最大的优点是短时精度极高——你快速转个 90°,它能在几十毫秒内给你一个非常准的角度增量。但缺点也很致命:积分漂移。

你想想看,陀螺仪输出的是角速度,要得到角度就得积分。积分一次,零偏就变成角度误差,而且这个误差随时间线性增长。我见过一个项目,用了颗消费级陀螺仪,开机 10 分钟,航向漂了 30 多度。这就是为什么你不能单独用陀螺仪做长时间姿态估计。

避坑指南: 我曾经在一个无人机项目里,只靠陀螺仪积分做航向保持,结果飞了 3 分钟后飞机开始画圈。后来查原因,就是陀螺仪零偏随温度变化,积分误差累积到不可接受。从那以后,我所有项目都加了磁力计或视觉来修正航向漂移。

陀螺仪的误差模型:

ω_meas = ω_true + b_g + n_g + S · ω_true

b_g 是零偏,n_g 是噪声,S 是比例因子误差。零偏是最大的敌人,比例因子误差在高速旋转时才会明显。

2.3 磁力计:给你一个「北」

磁力计测量的是地球磁场矢量。它的核心价值是提供航向参考。有了它,你就能知道自己的机头朝哪个方向,而不是靠陀螺仪积分猜。

但磁力计有个大问题——太容易被干扰。电机电流、扬声器磁铁、甚至你兜里的钥匙,都会让磁场读数歪掉。我做过一个手持设备,磁力计放在 PCB 角落,旁边就是电源走线,结果航向误差能到 20°。后来我把磁力计挪到远离大电流区域的位置,又做了硬铁和软铁校准,才把误差压到 3° 以内。

磁力计的校准,说白了就是找出环境中的固定磁场干扰(硬铁)和感应磁场干扰(软铁)。硬铁校准就是求三个轴的偏置,软铁校准要解一个 3x3 的矩阵。别怕,后面标定章节我会手把手带你做。

三个传感器的角色分工:
  • 加速度计:提供俯仰和横滚的长期参考,但怕线加速度干扰。
  • 陀螺仪:提供短时高动态姿态跟踪,但怕积分漂移。
  • 磁力计:提供航向,但怕磁场干扰。
三者互补,才能做出稳定可靠的姿态估计。

2.4 传感器对比:一张表看懂

特性 加速度计 陀螺仪 磁力计
测量物理量 比力 (m/s²) 角速度 (rad/s) 磁场强度 (μT)
可观测姿态 俯仰、横滚 三轴角速度 航向
长期稳定性 好(重力参考) 差(积分漂移) 好(参考)
动态响应 差(易受线加速度干扰) 好(高带宽) 中等(更新率较低)
主要误差源 零偏、振动噪声 零偏、温度漂移 硬铁/软铁干扰
典型应用 静态姿态、倾角测量 动态跟踪、旋转检测 航向参考、罗盘

2.5 一个简单的姿态解算思路

讲完原理,咱们来点实际的。怎么把这三个传感器的数据融合成一个稳定的姿态?

最经典的方法是互补滤波。思路很简单:

  1. 用陀螺仪积分得到高频姿态(短时准,长时漂)。
  2. 用加速度计和磁力计计算低频姿态(长时准,短时抖)。
  3. 用高通滤波处理陀螺仪姿态,低通滤波处理加速度计/磁力计姿态,然后加起来。

代码实现大概长这样:

// 互补滤波伪代码
float dt = 0.01f;  // 100 Hz 更新率
float alpha = 0.98f;  // 陀螺仪权重

// 陀螺仪积分
angle_gyro = angle_gyro + gyro_rate * dt;

// 加速度计计算角度
angle_acc = atan2(acc_y, acc_z);

// 互补融合
angle = alpha * angle_gyro + (1 - alpha) * angle_acc;

这个 alpha 值怎么选?我一般从 0.98 开始试,如果动态响应太慢就减小,如果噪声太大就增大。没有标准答案,取决于你的传感器质量和应用场景。

我的习惯: 在调试阶段,我会把三个传感器的原始数据和融合后的姿态都通过串口打印出来,用绘图工具看波形。这样一眼就能看出是哪个传感器在捣乱。别信感觉,信数据。

2.6 选型时我关注什么

最后聊点选型经验。市面上 IMU 芯片从几块钱到几千块都有,怎么选?

  • 零偏稳定性:消费级(0.1-1 °/s),工业级(0.01-0.1 °/s),战术级(<0.01 °/s)。做无人机用工业级就够了,做导弹才需要战术级。
  • 噪声密度:单位是 μg/√Hz 或 °/s/√Hz。噪声越低,融合出来的姿态越平滑。
  • 量程:加速度计一般 ±2g 到 ±16g,陀螺仪 ±250 °/s 到 ±2000 °/s。别选太大,量程越大分辨率越低。
  • 温度稳定性:这个容易被忽略。有些芯片 25°C 时表现很好,到 60°C 零偏翻倍。我吃过这个亏,后来都选带温度补偿的型号。