4、传感器融合入门:为什么要融合?

好,咱们进入一个新的话题——传感器融合。说实话,很多做电机控制的工程师,一开始都觉得“一个编码器就够了”。我以前也这么想。直到我在一个项目里被折腾得够呛,才真正明白:单一传感器,真的扛不住所有工况。

这一章,我们就来聊聊:为什么要融合?单一传感器有什么局限?融合的基本思想又是什么?

4.1 单一传感器的局限性

你想想看,一个编码器,装在电机轴上,看起来挺准的。但实际用起来,问题不少。

核心观点:没有一种传感器能在所有工况下都保持完美。每种传感器都有自己的“死穴”。

我归纳了几个最常见的痛点:

  • 累积误差:增量式编码器,说白了就是数脉冲。一旦丢了一个脉冲,后面的位置就全偏了。我遇到过一台AGV小车,跑了几圈之后,定位偏差直接到了厘米级。
  • 低速失真:绝对式编码器虽然不丢步,但在极低速下,信号信噪比会下降。尤其是磁编码器,低速时抖动明显。
  • 受环境影响:光电编码器怕油污、怕灰尘。我一个做机床的朋友,车间里切屑一多,编码器读数就开始跳变。
  • 带宽限制:编码器的更新率有限。高速运行时,你可能根本来不及读取完整的位置信息。

你看,单一传感器就像一个人单打独斗。总有力不从心的时候。

4.2 融合的基本思想

那怎么办?很简单——多找几个“帮手”。把不同传感器的数据结合起来,取长补短。这就是传感器融合的核心思想。

我个人习惯把融合分成两个层次:

  1. 互补:利用不同传感器的优势,互相弥补对方的短板。
  2. 估计:通过统计模型,从多个有噪声的测量值中,估算出最接近真实值的结果。

下面我们分别展开。

4.3 互补融合:取长补短

互补融合,说白了就是“谁擅长什么,就让谁干什么”。

举个例子:编码器在低速时精度高,但高速时容易丢步;而加速度计在高速时响应快,但低速时噪声大。那好办——低速时信编码器,高速时信加速度计。中间用一个低通+高通滤波器来平滑过渡。

我的经验:互补滤波在工程里非常实用。代码简单,计算量小,适合资源受限的嵌入式系统。我曾经在一个STM32F103上跑过,CPU占用率不到5%。

互补融合的典型结构是这样的:

// 互补滤波伪代码
float fused_value = alpha * encoder_value + (1 - alpha) * accelerometer_value;

// alpha 根据工况动态调整
if (speed < LOW_SPEED_THRESHOLD) {
    alpha = 0.9;  // 更信任编码器
} else {
    alpha = 0.3;  // 更信任加速度计
}

你看,就这么几行代码,就能让系统在大部分工况下表现稳定。当然,这只是一个最简单的例子。实际项目中,alpha 的取值需要根据传感器特性和系统动态来标定。

4.4 卡尔曼滤波:最优估计

互补滤波虽然好用,但它有一个问题:它假设传感器的噪声是固定的。但实际情况往往更复杂。这时候,就需要请出我们的“大杀器”——卡尔曼滤波。

卡尔曼滤波的思想,我尽量用大白话讲:

  • 你有一个系统模型(比如电机转动的物理方程)。
  • 你有一个测量值(比如编码器读数)。
  • 模型会预测下一个状态,测量会修正这个预测。
  • 最终得到一个“最优估计”。

说白了,就是“预测 + 修正”的循环。卡尔曼滤波会动态计算一个“增益”,来决定当前更相信模型还是更相信测量。

注意:卡尔曼滤波假设系统是线性的,噪声是高斯白噪声。如果你的系统是非线性的(比如电机带负载突变),那就需要用扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。

下面是一个简化的卡尔曼滤波流程:

// 卡尔曼滤波五步法(简化版)
// 1. 预测状态
x_pred = A * x_est + B * u;
// 2. 预测协方差
P_pred = A * P_est * A' + Q;
// 3. 计算卡尔曼增益
K = P_pred * H' * inv(H * P_pred * H' + R);
// 4. 更新状态估计
x_est = x_pred + K * (z - H * x_pred);
// 5. 更新协方差
P_est = (I - K * H) * P_pred;

其中:

  • x 是状态(比如位置、速度)
  • z 是测量值(编码器读数)
  • Q 是过程噪声协方差(模型的不确定性)
  • R 是测量噪声协方差(传感器的不确定性)
  • K 是卡尔曼增益(核心中的核心)

我曾经在一个伺服驱动器项目里,用卡尔曼滤波融合编码器和霍尔传感器。效果非常明显:低速抖动从原来的±5个脉冲,降到了±1个脉冲以内。

4.5 互补 vs 卡尔曼:怎么选?

很多初学者会问:到底用互补还是卡尔曼?我的建议是:

对比维度 互补滤波 卡尔曼滤波
计算量 极低(几行代码) 较高(矩阵运算)
适用场景 传感器特性互补明显 噪声特性已知,系统模型明确
调参难度 低(一个alpha值) 高(Q、R矩阵需要调试)
动态性能 一般 优秀(能自适应)
资源占用 几乎为零 需要浮点运算单元

我个人习惯是:能用互补解决的,绝不上卡尔曼。因为卡尔曼滤波的调参过程,真的很折磨人。我曾经为了调一组Q、R矩阵,花了整整两天时间。但如果你对精度有极致要求,或者系统噪声变化很大,那卡尔曼滤波是绕不开的选择。

4.6 本章知识体系

为了让你更直观地理解本章的核心逻辑,我画了一张图:

传感器融合入门:知识体系 为什么要融合? 单一传感器的局限 融合的核心思想 工程实现方法 累积误差 低速失真 环境干扰 带宽限制 互补:取长补短 估计:预测+修正 互补滤波 卡尔曼滤波 核心结论:没有万能传感器,只有好的融合策略 互补滤波适合快速实现,卡尔曼滤波适合高精度场景

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 不要盲目上卡尔曼:我曾经在一个8位MCU上硬跑卡尔曼,结果CPU满载,电机控制周期直接崩了。后来换成互补滤波,问题解决。
  • 注意传感器的时间同步:编码器和加速度计的采样时刻如果不一致,融合出来的结果反而更差。我建议用硬件触发或时间戳对齐。
  • Q和R矩阵不是玄学:很多新手觉得卡尔曼增益调不出来。其实你可以先跑一段开环数据,统计一下测量噪声的方差,R值就出来了。
  • 互补滤波的alpha值要动态调整:固定alpha在高速和低速下表现差异很大。我一般会根据转速或加速度来实时调整alpha。