第三节:传感器误差分析——搞懂IMU的“脾气”

做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 知识体系总览

下面这张图总结了传感器误差分析的完整框架,我建议你保存下来,做项目时对照着看:

IMU传感器误差分析框架 IMU传感器 确定性误差(可标定) 随机误差(需滤波) 零偏 (Bias) 尺度因子 (Scale) 交轴耦合 角度随机游走 速率随机游走 分析方法:Allan方差分析 量化噪声 ARW系数 零偏不稳定性 RRW系数 速率斜坡 应用:卡尔曼滤波Q矩阵设计

3.5 实战建议

说了这么多理论,最后给几条实在的建议:

  1. 拿到新IMU先做Allan方差——我每次都是这么干的,半小时静态数据,跑出曲线,读出关键参数。
  2. 确定性误差一定要标定——特别是零偏和尺度因子,不标定的话,积分几分钟就飞了。
  3. 随机误差参数要写进滤波器——ARW和RRW直接决定了卡尔曼滤波的Q矩阵,设不对,滤波效果差一大截。
  4. 注意温度影响——我见过太多项目,实验室跑得好好的,一上实际环境就崩。温度对零偏的影响最大。

一个小技巧:如果你没有条件做Allan方差分析,可以用IMU数据手册上的参数。但说实话,手册上的值通常偏乐观。我建议有条件还是自己测一遍。

嗯,传感器误差分析就讲到这里。搞懂了这些,你就能理解为什么IMU不能单独用,为什么需要融合其他传感器,为什么卡尔曼滤波要那样设计。这些都是环环相扣的。

可可精品资料库