传感器误差来源:系统误差、随机误差与环境干扰

做传感器融合这些年,我踩过最大的坑就是——以为传感器出厂就是准的。说实话,刚入行那会儿我也这么想,直到有一次无人机飞着飞着就偏了十几米,查了三天才发现是加速度计的零偏在作怪。今天咱们就把传感器误差这事儿彻底聊透。

传感器误差说白了就三大类:系统误差、随机误差和环境干扰。你想想看,如果不把这三种误差搞清楚,后面做校准、做融合,全都是空中楼阁。

核心观点:系统误差可以建模补偿,随机误差需要滤波处理,环境干扰要靠硬件设计和算法协同抑制。三者缺一不可。

传感器误差来源分类框架图 传感器误差来源分类 传感器误差 系统误差 随机误差 环境干扰 零偏 标度因数误差 轴间非正交 高斯白噪声 随机游走 温度漂移 电磁干扰 系统误差 → 可建模补偿 随机误差 → 需滤波处理

系统误差:能建模就能补偿

系统误差有个特点——有规律、可重复。这意味着我们可以通过建模把它算出来,然后从测量值里减掉。我个人习惯把系统误差分成三类来对待。

零偏(Bias)

零偏是什么?就是传感器在零输入时,输出却不归零。比如加速度计平放着,理论上应该输出0g,结果读出来是0.05g。这0.05g就是零偏。

我在项目中遇到过最典型的案例:一款IMU在常温下标定完零偏只有0.01°/s,结果到了冬天户外变成0.15°/s。嗯,温度对零偏的影响非常大,后面会细说。

实战技巧:零偏校准最简单的方法就是静态采集。把传感器放平,采集30秒数据取平均,这个平均值就是零偏。但要注意——采集时间别太短,至少10秒以上。

标度因数误差(Scale Factor Error)

标度因数误差说白了就是增益不准。你给传感器输入1g,它输出1.02g,多出来的0.02就是标度因数误差造成的。

这个误差在陀螺仪上尤其要命。我做过一个航姿参考系统,陀螺仪的标度因数误差只有0.5%,但积分10分钟后,姿态角就偏了将近3度。你想想看,这要是用在无人机上,早炸机了。

传感器类型 典型标度因数误差 10分钟积分误差(估算)
消费级MEMS陀螺仪 1% ~ 3% 6° ~ 18°
工业级MEMS陀螺仪 0.1% ~ 0.5% 0.6° ~ 3°
光纤陀螺仪 0.01% ~ 0.05% 0.06° ~ 0.3°

轴间非正交(Axis Misalignment)

这个误差比较隐蔽。理论上传感器的X、Y、Z轴应该是互相垂直的,但实际制造时做不到绝对正交。比如X轴和Y轴之间不是90度,而是89.5度。这0.5度的偏差,在融合算法里会引入交叉耦合误差。

我记得有一次做多传感器融合,加速度计和陀螺仪的数据怎么都对不上。查了两天,最后发现是加速度计的Z轴和陀螺仪的Z轴差了0.8度。这种轴间非正交误差,必须通过六位置法或者椭球拟合来校准。

注意:轴间非正交误差在低成本的MEMS传感器中尤其严重。如果你用的是几块钱的IMU,别指望它的轴能有多正。我建议至少做一次六位置标定,把非正交矩阵算出来。

随机误差:噪声的统计学本质

随机误差和系统误差最大的区别在于——它没有规律。你没法用一个固定的模型去描述它,只能用统计的方法来处理。

高斯白噪声(White Noise)

高斯白噪声是传感器输出中最常见的噪声。它的特点是:均值接近0,方差恒定,不同时刻的噪声互不相关。说白了就是——噪声在时间上没有记忆性。

我刚开始做滤波的时候,总想着把白噪声完全滤掉。后来发现这是不可能的。白噪声的功率谱是平坦的,你滤掉高频分量,低频分量还在。我们能做的只是抑制它,而不是消除它。

// 高斯白噪声的统计特性示例
// 假设加速度计输出为 acc_raw,噪声标准差为 sigma
float acc_filtered = 0;
float alpha = 0.1;  // 滤波系数

void lowpass_filter(float acc_raw) {
    // 一阶低通滤波,抑制高频白噪声
    acc_filtered = alpha * acc_raw + (1 - alpha) * acc_filtered;
}

随机游走(Random Walk)

随机游走比白噪声更麻烦。它是白噪声的积分结果。你想想看,白噪声本身均值是0,但积分之后就会产生一个缓慢漂移的随机分量。

陀螺仪的角速率随机游走(Angular Random Walk, ARW)是定位漂移的主要元凶之一。我做过一个实验:把陀螺仪静止放置,采集1小时数据,然后对角度做积分。结果角度漂移了将近20度。这就是随机游走的威力。

关键区别:高斯白噪声是高频抖动,随机游走是低频漂移。白噪声可以用低通滤波抑制,随机游走必须用卡尔曼滤波或者互补滤波来处理。

环境干扰:外部因素才是最大的变量

说实话,系统误差和随机误差好歹还能通过算法处理。环境干扰才是最让人头疼的,因为它不可控。

温度漂移

温度对传感器的影响是全方位的。零偏会随温度变化,标度因数也会随温度变化。我见过最夸张的案例:一款消费级IMU在-20°C到+60°C的温度范围内,零偏变化了将近5倍。

怎么处理?两个思路:

  • 硬件补偿:在传感器旁边放温度传感器,建立温度-误差模型,实时查表补偿。
  • 算法补偿:在卡尔曼滤波里把温度作为状态变量,在线估计温度对零偏的影响。

我个人更倾向于第二种方法。因为硬件补偿需要大量的标定数据,而算法补偿可以在线自适应。

电磁干扰(EMI)

电磁干扰是个玄学问题。它可能来自电机、电源、无线模块,甚至是你手上的静电。电磁干扰的特点是突发性强、频率不确定。

我曾经在一个机器人项目里遇到过:只要电机一转,IMU的数据就跳变。查了三天,最后发现是电机驱动线的屏蔽没做好。嗯,这种问题算法很难处理,最好的办法是从硬件设计上解决。

避坑指南:我曾经因为电磁干扰问题浪费了两周时间。后来总结出几条经验:1)传感器远离电机和电源模块;2)信号线用双绞线或者屏蔽线;3)PCB设计时传感器区域做隔离。这些比任何算法都管用。

三种误差的对比与处理策略

误差类型 典型来源 数学特性 处理方法
零偏 制造偏差、温度 常数或缓变 静态标定、在线估计
标度因数误差 增益不准、温度 比例关系 多位置标定、查表补偿
轴间非正交 安装偏差 耦合矩阵 六位置法、椭球拟合
高斯白噪声 电路热噪声 均值0、方差恒定 低通滤波、卡尔曼滤波
随机游走 白噪声积分 方差随时间增长 互补滤波、卡尔曼滤波
温度漂移 环境温度变化 非线性、滞后 温度补偿模型、在线估计
电磁干扰 电机、电源、射频 突发、高频 硬件屏蔽、滤波、异常检测

我的建议:做传感器融合之前,先花一周时间把传感器的误差特性摸清楚。怎么做?静态采集数据,画Allan方差曲线,分析噪声成分。这一步做好了,后面滤波器的参数设计就有依据了。