3. 传感器误差分析
做IMU融合定位,说白了就是跟误差打交道。你想想看,如果传感器是完美的,那还要什么滤波算法?直接积分就完事了。但现实很骨感——每个IMU都有自己的“小脾气”。
我个人习惯把误差分成两大类:确定性误差和随机误差。前者可以标定补偿,后者只能靠滤波去估计。今天咱们就把这两块掰开揉碎了讲清楚。
3.1 确定性误差:能“治”的毛病
确定性误差,说白了就是有规律的偏差。你给它一个输入,它输出总是偏那么一点。这类误差可以通过实验室标定来消除。
3.1.1 零偏(Bias)
零偏是最常见的误差。IMU静止时,输出应该为零,但实际不是。比如陀螺仪,你把它放桌上不动,它可能输出0.01°/s。这就是零偏。
零偏的单位:
- 加速度计:mg(毫g)或 m/s²
- 陀螺仪:°/h 或 °/s
我在项目中遇到过:某款MEMS陀螺仪,常温下零偏只有5°/h,但温度一变化,能漂到50°/h。所以做高精度产品,温度补偿是必须的。
3.1.2 尺度因子(Scale Factor)
尺度因子误差,就是输入输出比例不对。比如你转90°,陀螺输出89.5°。这个误差通常用百分比表示。
典型值:
- 消费级IMU:1%~5%
- 工业级IMU:0.1%~0.5%
- 战术级IMU:<0.01%
3.1.3 交轴耦合(Cross-axis Sensitivity)
这个误差比较隐蔽。理想情况下,X轴加速度计只感受X方向的加速度。但实际中,Y轴的加速度也会在X轴上产生输出。这就是交轴耦合。
我习惯用一个3×3的矩阵来表示这种耦合关系:
// 交轴耦合矩阵示例
// 对角线是尺度因子,非对角线是耦合系数
double S[3][3] = {
{1.002, 0.003, -0.001},
{0.002, 0.998, 0.004},
{-0.001, 0.002, 1.005}
};
我曾经踩过这个坑:有个项目,IMU装在无人机上,飞行中高度一直漂。查了三天,最后发现是Z轴加速度计被X轴的振动耦合了。标定完交轴耦合系数,问题解决。
3.2 随机误差:靠滤波“伺候”的毛病
确定性误差可以标定,但随机误差不行。它就像白噪声,你永远不知道下一秒它会怎么变。这类误差只能用滤波算法去估计和抑制。
3.2.1 角度随机游走(Angle Random Walk, ARW)
这是陀螺仪最主要的随机误差。你可以把它想象成:每次测量都叠加了一个白噪声。积分之后,这个噪声会变成随机游走。
数学表达:
θ(t) = ∫(ω_true + n(t)) dt
其中 n(t) 是白噪声,功率谱密度为 N²
单位:°/√h 或 °/√s
举个例子:一个ARW为0.01°/√h的陀螺,积分1小时后,角度误差的均方根约为0.01°。积分时间越长,误差越大。
3.2.2 速率随机游走(Rate Random Walk, RRW)
这个误差比ARW更“坏”。它描述的是零偏本身的缓慢变化。你想想看,陀螺的零偏不是固定值,它会随着时间慢慢漂移。这个漂移过程,就是速率随机游走。
我的经验:在卡尔曼滤波中,我通常把RRW建模为“零偏”状态量。这样滤波器就能实时估计零偏的变化,而不是把它当成固定值。
3.3 Allan方差分析:给IMU“体检”
Allan方差是分析IMU噪声特性的标准工具。它就像给IMU做一次全面体检,能告诉你:
- 量化噪声有多大
- 角度随机游走系数
- 零偏不稳定性
- 速率随机游走系数
- 速率斜坡
3.3.1 基本原理
Allan方差的核心思想很简单:把静态数据按不同时间长度分段,计算每段均值的方差。不同时间尺度下,主导的噪声源不同。
// Allan方差计算伪代码
double computeAllanVariance(double* data, int N, int tau) {
int M = N / tau; // 段数
double* means = malloc(M * sizeof(double));
// 计算每段均值
for (int i = 0; i < M; i++) {
double sum = 0;
for (int j = 0; j < tau; j++) {
sum += data[i * tau + j];
}
means[i] = sum / tau;
}
// 计算相邻均值的方差
double var = 0;
for (int i = 0; i < M - 1; i++) {
var += (means[i+1] - means[i]) * (means[i+1] - means[i]);
}
var /= (2 * (M - 1));
free(means);
return var;
}
3.3.2 如何解读Allan方差曲线
Allan方差曲线通常画在双对数坐标上。不同斜率对应不同噪声:
| 斜率 | 噪声类型 | 典型区间 |
|---|---|---|
| -1 | 量化噪声 | 短时间(<0.1s) |
| -1/2 | 角度随机游走 | 中等时间(0.1s~10s) |
| 0 | 零偏不稳定性 | 曲线最低点 |
| +1/2 | 速率随机游走 | 长时间(>100s) |
| +1 | 速率斜坡 | 极长时间(>1000s) |
实际应用:我每次拿到新IMU,第一件事就是跑Allan方差。从曲线上读出ARW和零偏不稳定性,这两个参数直接决定了卡尔曼滤波的Q矩阵该怎么设。
3.4 知识体系总览
下面这张图总结了传感器误差分析的完整框架,我建议你保存下来,做项目时对照着看:
3.5 实战建议
说了这么多理论,最后给几条实在的建议:
- 拿到新IMU先做Allan方差——我每次都是这么干的,半小时静态数据,跑出曲线,读出关键参数。
- 确定性误差一定要标定——特别是零偏和尺度因子,不标定的话,积分几分钟就飞了。
- 随机误差参数要写进滤波器——ARW和RRW直接决定了卡尔曼滤波的Q矩阵,设不对,滤波效果差一大截。
- 注意温度影响——我见过太多项目,实验室跑得好好的,一上实际环境就崩。温度对零偏的影响最大。
一个小技巧:如果你没有条件做Allan方差分析,可以用IMU数据手册上的参数。但说实话,手册上的值通常偏乐观。我建议有条件还是自己测一遍。
嗯,传感器误差分析就讲到这里。搞懂了这些,你就能理解为什么IMU不能单独用,为什么需要融合其他传感器,为什么卡尔曼滤波要那样设计。这些都是环环相扣的。