传感器基础:IMU工作原理、加速度计与陀螺仪、磁力计
各位同学,咱们今天聊聊IMU。说白了,IMU就是无人机在GPS失效时的「眼睛」和「内耳」。没有它,无人机就是个瞎子。我最早接触IMU是在做四旋翼飞控的时候,那会儿被噪声折腾得够呛,后来才慢慢摸清它的脾气。
IMU到底是个啥?
IMU,全称Inertial Measurement Unit,惯性测量单元。它通常包含三个核心器件:加速度计、陀螺仪,有时候还带上磁力计。你想想看,无人机在天上飞,它怎么知道自己朝哪个方向、转了多少度、飞了多快?全靠这三个小家伙。
我习惯把IMU比作人的感官系统:
- 加速度计——就像你的皮肤,能感觉到重力方向和运动加速度
- 陀螺仪——就像你的半规管,能感知旋转角速度
- 磁力计——就像你的指南针,告诉你哪边是北
嗯,这里要注意:IMU本身不直接输出位置和姿态,它只输出原始的加速度和角速度数据。你得靠积分才能算出姿态和位置。但积分这东西,误差会越积越大——这就是为什么纯IMU导航撑不了多久。
加速度计:感受重力与运动
加速度计的原理其实挺直观的。它内部有一个微小的质量块,当无人机加速或倾斜时,质量块会移动,通过电容变化或压电效应测出加速度值。
我在项目中遇到过一个问题:无人机悬停时,加速度计读出来的是(0, 0, -9.8) m/s²。为什么是-9.8?因为重力始终向下。如果你把无人机平放在桌上,Z轴会读到-9.8,X和Y接近0。如果无人机倾斜了,重力就会分解到各个轴上。
关键点:加速度计可以测出俯仰角和横滚角,但无法测出偏航角。因为偏航旋转不改变重力在三个轴上的分量。
加速度计的致命弱点是什么?噪声大,而且对振动敏感。无人机电机一转,加速度计数据就像喝了假酒一样乱跳。我曾经在调试时发现,油门一推,加速度计数据直接飘了0.5个g——这要是直接用来算姿态,飞机非翻不可。
陀螺仪:感知旋转的利器
陀螺仪测的是角速度,单位是°/s。它的原理基于科里奥利效应——一个振动的质量块在旋转时会产生侧向位移,通过检测这个位移就能算出角速度。
陀螺仪的好处是:响应快,噪声相对小,短时间精度高。但坏处也很明显——它有零偏漂移。什么意思?就是你把它静止放在桌上,它读出来的角速度不是0,而是某个小值。这个小值会随时间缓慢变化。
我记得有一次做室内定位实验,无人机悬停10秒后,偏航角已经漂了15度。这就是陀螺仪积分带来的误差。你想想看,15度的偏航误差,飞出去10米就偏了2.6米,撞墙是迟早的事。
我的经验:陀螺仪数据一定要做零偏校准。每次上电后静止采集100个样本取平均,把这个平均值作为零偏减掉。能显著改善漂移问题。
磁力计:补上偏航角这块拼图
前面说了,加速度计只能测俯仰和横滚,陀螺仪有漂移。那偏航角怎么办?靠磁力计。
磁力计测量的是地球磁场。地球磁场的方向大致从南指向北(实际上有磁偏角)。通过测量磁场在三个轴上的分量,就能算出无人机相对于磁北的朝向。
但磁力计有个大坑——它太容易被干扰了。电机电流、电源线、甚至旁边的铁架子都会让磁力计数据变形。我在做一款工业无人机时,发现磁力计在电机启动后读数直接偏了30度。排查了半天,原来是电机线离磁力计太近了。
避坑指南:磁力计安装位置要远离大电流线路和铁磁材料。我建议至少保持5cm以上的距离。另外,每次上电后要做硬铁和软铁校准,否则数据没法用。
三种传感器的融合策略
单独用哪个都不靠谱。加速度计噪声大、陀螺仪有漂移、磁力计易受干扰。所以实际工程中,我们得把它们融合起来用。
常用的融合方法有:
- 互补滤波:简单粗暴,低频用加速度计和磁力计,高频用陀螺仪。适合计算资源有限的MCU。
- 卡尔曼滤波:精度更高,但计算量大。我一般在STM32F4以上的芯片上用。
- Mahony/Madgwick滤波:开源方案,效果不错,适合初学者入门。
我个人习惯用Mahony滤波做快速原型验证,稳定后再切到卡尔曼滤波做量产。为什么?因为卡尔曼滤波调参太费劲了,Q矩阵和R矩阵调不好,效果还不如互补滤波。
实际项目中的选型建议
选IMU芯片时,我一般看这几个参数:
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 加速度计量程 | ±2g ~ ±16g | 无人机选±8g以上,防止剧烈机动时饱和 |
| 陀螺仪量程 | ±250 ~ ±2000°/s | 选±1000°/s以上,特技飞行要±2000 |
| 噪声密度 | 单位 μg/√Hz | 越低越好,低于100 μg/√Hz算不错 |
| 零偏稳定性 | 单位 °/h | 消费级10°/h,工业级1°/h以下 |
常用的芯片有MPU6050(便宜但性能一般)、ICM-20948(带磁力计)、BMI088(工业级,抗振性好)。我最近在项目里用BMI088,振动环境下表现确实比MPU6050好不少。
一个小实验:读取IMU原始数据
下面是个简单的代码片段,用I2C读取MPU6050的加速度和陀螺仪数据。嗯,这里只展示核心逻辑:
// 伪代码:读取MPU6050原始数据
uint8_t buf[14];
i2c_read(MPU6050_ADDR, ACCEL_XOUT_H, buf, 14);
// 加速度计数据(16位有符号)
int16_t ax = (buf[0] << 8) | buf[1];
int16_t ay = (buf[2] << 8) | buf[3];
int16_t az = (buf[4] << 8) | buf[5];
// 陀螺仪数据
int16_t gx = (buf[8] << 8) | buf[9];
int16_t gy = (buf[10] << 8) | buf[11];
int16_t gz = (buf[12] << 8) | buf[13];
// 转换为物理单位(假设量程±2g,±250°/s)
float ax_g = ax / 16384.0f; // g
float gx_dps = gx / 131.0f; // °/s
注意:不同量程对应的灵敏度系数不一样。±2g时是16384 LSB/g,±4g时是8192,以此类推。这个细节我当年踩过坑,算出来的角度直接翻倍。
总结一下
IMU是无人机导航的基石。加速度计告诉你「哪边是下」,陀螺仪告诉你「转得多快」,磁力计告诉你「哪边是北」。三者各有短板,但融合起来就能在GPS失效时撑住一段时间。
下一章我们会聊怎么用这些原始数据算出姿态角。到时候我会分享一个我自己写的互补滤波代码,实测效果还不错。