1. 卡尔曼滤波概述:状态估计问题、卡尔曼滤波的起源与发展、在电机控制中的应用价值

1.1 什么是状态估计?

先聊聊状态估计。说白了,就是「猜」。

你想想看,电机转子的位置、速度,这些物理量我们没法直接测准。编码器有噪声,电流采样有延迟,负载突变时更是乱成一团。这时候怎么办?

我个人的理解是:状态估计就是「用数学模型去猜,再用实测数据去修正」。你有一个预测,有一个测量,两者都不完美,但结合起来就能得到比任何一个都准的结果。

举个例子。我在做伺服驱动器项目时,遇到过编码器丢脉冲的情况。位置信号突然跳变,如果直接拿这个信号做闭环,电机就会猛抖一下。嗯,这时候就需要状态估计来「平滑」掉这些异常值。

核心思想: 状态估计 = 模型预测 + 测量修正

1.2 卡尔曼滤波的起源与发展

卡尔曼滤波是1960年由鲁道夫·卡尔曼提出的。我记得第一次读到那篇论文时,心里想的是:「这玩意儿真能用在嵌入式上?」

当时卡尔曼在NASA做访问研究,阿波罗登月计划正好需要导航滤波。卡尔曼滤波的厉害之处在于——它不需要存储所有历史数据,只靠上一时刻的状态和当前测量值,就能递推更新。这在60年代的计算机上简直是救命稻草。

发展到现在,卡尔曼滤波已经衍生出很多变种:

  • 标准卡尔曼滤波(KF):适用于线性系统,高斯噪声
  • 扩展卡尔曼滤波(EKF):把非线性系统线性化,电机控制里常用
  • 无迹卡尔曼滤波(UKF):用采样点逼近非线性,精度更高但计算量大
  • 自适应卡尔曼滤波:在线调整噪声协方差,应对工况变化

我曾经在无刷直流电机(BLDC)的传感器less控制中,试过EKF和UKF。说实话,UKF精度确实好,但在STM32F4上跑一次要花掉将近200微秒,实时性扛不住。最后我选了EKF,调参调了两周才稳定下来。

我的建议: 工程上先上EKF,够用就行。别一上来就搞UKF,除非你的MCU算力过剩。

1.3 卡尔曼滤波在电机控制中的应用价值

电机控制里,卡尔曼滤波主要干三件事:

  1. 无传感器控制:没有编码器或霍尔传感器时,估算转子位置和速度
  2. 噪声抑制:滤掉电流采样、速度测量中的高频噪声
  3. 故障诊断:检测传感器是否失效,做容错控制

我参与过一个项目,客户要求电机在零速下也能输出额定转矩。没有位置传感器,零速时反电动势为零,传统方法根本估不准。最后我们用卡尔曼滤波结合高频注入法,硬是把位置误差控制在了5度以内。

为什么会这样?因为卡尔曼滤波本质上是一个最优估计器。它知道你的模型有多可信(过程噪声协方差Q),也知道你的传感器有多烂(测量噪声协方差R),然后自动权衡两者。

注意: Q和R的调参是卡尔曼滤波最坑的地方。我曾经因为Q设得太大,导致估计值跟着噪声乱跳;又因为R设得太大,导致估计值反应迟钝。调参没有捷径,只能靠经验和实验数据。

1.4 知识体系框架

下面这张图是我自己总结的卡尔曼滤波在电机控制中的知识体系。你看一眼,心里就有谱了。

卡尔曼滤波在电机控制中的知识体系 核心概念:状态估计 数学模型(预测) 测量数据(修正) 噪声统计(权衡) 标准KF(线性) EKF(线性化) UKF(采样) 自适应KF 无传感器控制 噪声滤波 故障诊断 参数辨识 工程挑战:调参(Q/R)、实时性、数值稳定性

1.5 一个简单的例子

假设你要估计电机转子的角度 θ。你有一个模型:θ(k+1) = θ(k) + ω·Δt。但模型不准,因为负载会变。你还有一个编码器测量值 z(k) = θ(k) + v(k),但v(k)是噪声。

卡尔曼滤波的做法是:

// 预测步骤
θ_pred = θ_est + ω * dt;
P_pred = P_est + Q;

// 更新步骤
K = P_pred / (P_pred + R);
θ_est = θ_pred + K * (z - θ_pred);
P_est = (1 - K) * P_pred;

你看,就这几行代码。K是卡尔曼增益,它决定了你更相信模型还是更相信测量。如果R很大(传感器噪声大),K就小,你更信模型。如果Q很大(模型不准),K就大,你更信测量。

一个小技巧: 刚开始调参时,把Q和R都设成1,然后看效果。再根据估计值的波动程度,逐步调整。我习惯先调R,再调Q,这样思路清晰。

1.6 本章小结

卡尔曼滤波不是什么玄学。它就是一套数学框架,帮你把「猜」和「测」结合起来。在电机控制里,它最大的价值就是让你在没有昂贵传感器的情况下,也能获得高质量的估计信号。

下一章我们会深入卡尔曼滤波的数学推导。别怕,我会用最直观的方式讲清楚。


公众号:蓝海资料掘金营,微信deep3321