第一章:IMU基础与数据特性
大家好,我是老张。做IMU融合这些年,踩过的坑比走过的路还多。今天咱们就从最基础的开始聊——加速度计和陀螺仪到底是怎么回事,它们的数据里藏着哪些坑。
说实话,很多人一上来就调卡尔曼滤波,结果数据质量不行,怎么调都白搭。我个人的习惯是,先花时间把传感器特性摸透,后面能省一半的调试时间。
1.1 加速度计原理
加速度计测的是什么?说白了就是比力。不是速度的变化率,而是物体受到的惯性力与重力的合力。
微机电系统(MEMS)加速度计内部有个质量块,固定在弹簧上。当芯片加速时,质量块会偏移,电容值跟着变。测出电容变化,就能反推出加速度。
关键点:静止时加速度计测的是重力加速度g,方向竖直向上。这个特性常被用来做姿态初始对准。
我在项目中遇到过一件事:有次把IMU装在无人机上,地面测试时数据正常,一上天就飘。排查了半天,发现是振动导致加速度计输出严重失真。嗯,这里要注意,加速度计对高频振动特别敏感。
1.2 陀螺仪原理
陀螺仪测角速度,单位是°/s。MEMS陀螺仪用的是科里奥利效应——一个振动的质量块,在旋转时会受到一个垂直于振动方向的力。测这个力的大小,就能算出角速度。
你想想看,这个原理本身就决定了陀螺仪对温度很敏感。温度一变,振动频率和阻尼都会变,输出自然就漂了。
个人经验:我建议每次上电后先让IMU预热3-5分钟,等温度稳定了再开始采集数据。这个习惯帮我避免了很多温漂问题。
1.3 零偏与噪声
零偏是什么?就是传感器静止时,输出不为零的那个值。加速度计静止时应该输出g,但实际可能差一点。陀螺仪静止时应该输出0,但实际可能有个小偏移。
为什么会这样?制造工艺的微小偏差、封装应力、温度梯度,都会导致零偏。我见过最夸张的一次,某款廉价IMU的陀螺仪零偏达到5°/s,这要是直接积分算角度,一秒就偏5度,根本没法用。
| 误差类型 | 典型值 | 影响 |
|---|---|---|
| 加速度计零偏 | ±50 mg | 姿态误差约3° |
| 陀螺仪零偏 | ±0.5 °/s | 积分后角度发散 |
| 加速度计噪声 | 100 μg/√Hz | 高频抖动 |
| 陀螺仪噪声 | 0.01 °/s/√Hz | 角度随机游走 |
噪声这东西,说白了就是随机误差。你拿100个样本看,每次都不一样。但噪声有个好处——它是零均值的,多采几个点平均一下,就能把噪声压下去。
1.4 温漂问题
温漂是IMU最大的敌人之一。温度变化10度,零偏可能漂移好几倍。我记得有次做车载测试,夏天车内温度从25度升到60度,陀螺仪零偏直接翻了三倍。
避坑指南:我曾经在项目里忽略了温漂,结果融合算法在冷启动时表现很好,跑半小时后就开始发散。后来加了温度补偿模型,才把问题解决。如果你用的IMU没有内置温补,一定要自己做标定。
温漂的补偿方法有两种:一种是查表法,提前在不同温度下标定零偏,运行时查表插值;另一种是建模法,用多项式拟合温度-零偏曲线。我个人更推荐查表法,简单可靠。
1.5 采样率与时间戳对齐
IMU的采样率通常从100Hz到1000Hz不等。加速度计和陀螺仪的采样率可能不一样,这就需要做时间戳对齐。
为什么对齐这么重要?你想想看,融合算法里要用加速度计的姿态去修正陀螺仪的积分误差。如果两个数据的时间戳对不上,一个快一个慢,那修正就乱套了。
我建议的做法是:
- 用硬件触发信号同步两个传感器
- 或者用高精度时钟给每个数据打时间戳
- 后处理时做线性插值,把数据对齐到同一时间轴
// 时间戳对齐示例代码
void align_timestamps(imu_data_t *accel, int accel_len,
imu_data_t *gyro, int gyro_len) {
int i = 0, j = 0;
while (i < accel_len && j < gyro_len) {
if (accel[i].timestamp < gyro[j].timestamp) {
// 对加速度计数据做插值
i++;
} else {
// 对陀螺仪数据做插值
j++;
}
}
}
小技巧:如果两个传感器的采样率是整数倍关系,比如加速度计100Hz、陀螺仪200Hz,那对齐就简单多了。我一般会故意把采样率设成整数倍,省去很多麻烦。
1.6 知识体系总览
下面这张图是我自己整理的IMU数据特性知识框架,你可以照着这个思路去理解整个体系:
这张图把IMU数据特性的核心脉络理清楚了。左边是加速度计,右边是陀螺仪,下面是误差来源和数据对齐。你顺着这个结构去理解,后面学融合算法会轻松很多。
好了,第一章的内容就到这里。记住一句话:数据质量决定算法上限。花时间把传感器特性吃透,比盲目调参有用得多。
可可精品资料库