1. 卡尔曼滤波概述:状态估计问题、卡尔曼滤波的起源与发展、在电机控制中的应用价值
1.1 什么是状态估计?
先聊聊状态估计。说白了,就是「猜」。
你想想看,电机转子的位置、速度,这些物理量我们没法直接测准。编码器有噪声,电流采样有延迟,负载突变时更是乱成一团。这时候怎么办?
我个人的理解是:状态估计就是「用数学模型去猜,再用实测数据去修正」。你有一个预测,有一个测量,两者都不完美,但结合起来就能得到比任何一个都准的结果。
举个例子。我在做伺服驱动器项目时,遇到过编码器丢脉冲的情况。位置信号突然跳变,如果直接拿这个信号做闭环,电机就会猛抖一下。嗯,这时候就需要状态估计来「平滑」掉这些异常值。
核心思想: 状态估计 = 模型预测 + 测量修正
1.2 卡尔曼滤波的起源与发展
卡尔曼滤波是1960年由鲁道夫·卡尔曼提出的。我记得第一次读到那篇论文时,心里想的是:「这玩意儿真能用在嵌入式上?」
当时卡尔曼在NASA做访问研究,阿波罗登月计划正好需要导航滤波。卡尔曼滤波的厉害之处在于——它不需要存储所有历史数据,只靠上一时刻的状态和当前测量值,就能递推更新。这在60年代的计算机上简直是救命稻草。
发展到现在,卡尔曼滤波已经衍生出很多变种:
- 标准卡尔曼滤波(KF):适用于线性系统,高斯噪声
- 扩展卡尔曼滤波(EKF):把非线性系统线性化,电机控制里常用
- 无迹卡尔曼滤波(UKF):用采样点逼近非线性,精度更高但计算量大
- 自适应卡尔曼滤波:在线调整噪声协方差,应对工况变化
我曾经在无刷直流电机(BLDC)的传感器less控制中,试过EKF和UKF。说实话,UKF精度确实好,但在STM32F4上跑一次要花掉将近200微秒,实时性扛不住。最后我选了EKF,调参调了两周才稳定下来。
我的建议: 工程上先上EKF,够用就行。别一上来就搞UKF,除非你的MCU算力过剩。
1.3 卡尔曼滤波在电机控制中的应用价值
电机控制里,卡尔曼滤波主要干三件事:
- 无传感器控制:没有编码器或霍尔传感器时,估算转子位置和速度
- 噪声抑制:滤掉电流采样、速度测量中的高频噪声
- 故障诊断:检测传感器是否失效,做容错控制
我参与过一个项目,客户要求电机在零速下也能输出额定转矩。没有位置传感器,零速时反电动势为零,传统方法根本估不准。最后我们用卡尔曼滤波结合高频注入法,硬是把位置误差控制在了5度以内。
为什么会这样?因为卡尔曼滤波本质上是一个最优估计器。它知道你的模型有多可信(过程噪声协方差Q),也知道你的传感器有多烂(测量噪声协方差R),然后自动权衡两者。
注意: Q和R的调参是卡尔曼滤波最坑的地方。我曾经因为Q设得太大,导致估计值跟着噪声乱跳;又因为R设得太大,导致估计值反应迟钝。调参没有捷径,只能靠经验和实验数据。
1.4 知识体系框架
下面这张图是我自己总结的卡尔曼滤波在电机控制中的知识体系。你看一眼,心里就有谱了。
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