传感器误差来源:系统误差、随机误差与环境干扰
做传感器融合这些年,我踩过最大的坑就是——以为传感器出厂就是准的。说实话,刚入行那会儿我也这么想,直到有一次无人机飞着飞着就偏了十几米,查了三天才发现是加速度计的零偏在作怪。今天咱们就把传感器误差这事儿彻底聊透。
传感器误差说白了就三大类:系统误差、随机误差和环境干扰。你想想看,如果不把这三种误差搞清楚,后面做校准、做融合,全都是空中楼阁。
核心观点:系统误差可以建模补偿,随机误差需要滤波处理,环境干扰要靠硬件设计和算法协同抑制。三者缺一不可。
系统误差:能建模就能补偿
系统误差有个特点——有规律、可重复。这意味着我们可以通过建模把它算出来,然后从测量值里减掉。我个人习惯把系统误差分成三类来对待。
零偏(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方差曲线,分析噪声成分。这一步做好了,后面滤波器的参数设计就有依据了。