卡尔曼滤波法
卡尔曼滤波算法是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法,是一种最优化自回归数据处理算法。
通俗地讲,对系统 k−1 时刻的状态,我们有两种途径来获得系统 k 时刻的状态。一种是根据常识或者系统以往的状态表现来预测 k 时刻的状态,这个量我们称之为预测量;另一种是通过传感器等进行系统 k 时刻我们所观测变量状态的测量,这个量我们称之为观测量。
显然,两种途径均有误差,而卡尔曼滤波要做的事,就是结合这两个结果,滤去两种结果中的“噪声”,得到一个更加准确的系统 k 时刻的状态的估计。下面就来看卡尔曼滤波算法具体是怎么做到的。
系统状态预测方程
X(k)=AX(k−1)+BU(k)+W(k−1)
系统状态观测方程
Z(k)=HX(k)+V(k)
卡尔曼滤波的计算过程
卡尔曼滤波向前的推进包含预测和观测过程。
下面的计算式中用 ^x−k 表示 k 时刻的预测值, zk 表示 k 时刻的观测值,^xk 表示 k 时刻的卡尔曼估计值, xk 表示系统 k 时刻的真实状态值。
时间更新(预测)
-
根据上述的系统状态预测方程计算出 k 时刻的系统状态
^x−k=A^xk−1+Buk−1
-
计算 k 时刻的误差的协方差
P−k=APk−1AT+Q
测量更新(校正)
-
计算卡尔曼增益
Kk=P−kHTHP−kHT+R
上面的 P−k 即为 k 时刻的预测误差, R 为 k 时刻的系统观测误差。
-
校正预测得到的 k 时刻的系统状态
^xk=^x−k+Kk(zk−H^x−k)
-
更新测量误差的协方差
Pk=(I−KkH)P−k
I 为单位矩阵。
卡尔曼增益推导
显然,卡尔曼滤波作为一种数据融合算法,其核心在于观测量和预测量的比例取值,也就是卡尔曼增益。
由于推导的数学过程比较复杂, 留着以后推导。
我们的主要目的是尽量缩小卡尔曼估计值 ^xk 与真实值 xk 的误差大小,可推导出两者的差值为:
xk−^xk=xk−(^x−k+Kk(zk−H^xk))=xk−^x−k−Kk(Hxk+vk)+KkH^xk=(1−KkH)xk−(I−KkH)^xk−Kkvk=(I−KkH)(xk−^x−k)−Kkvk
令 ek=xk−^xk,由于 xk−^x−k 和 vk 均可以视作服从高斯分布的噪声,所以 ek 总体服从高斯分布, ek~N(0,Pk)
易知,要使卡尔曼估计值尽可能接近真实值,ek 的方差应该尽可能小。
因此求卡尔曼增益的问题转化成了求
Pk=f(Kk)
取最小值时 Kk 的取值。
由于均值 μ=0,根据方差的定义, Pk=E(ekeTk)。
接下来就是将 ek=(I−KkH)(xk−^x−k)−Kkvk 带入上式展开,比较复杂,直接写结果:
我们用 ^ek 表示预测值与真实值的误差,称为估计误差。
则有
Pk=E{[(I−KkH)^ek^eTk(1−KkH)T−(I−KkH)^ekvTkKTk−Kkvk^eTk(1−KkH)T+KkvkvTkKk]}
对括号内每一项求期望得
Pk=(1−KkH)E(^ek^eTk)(I−KkH)T+KkE(vkvTk)KTk
令 P−k=E(^ek^eTk),称为系统的预测误差协方差矩阵,或者估计误差协方差矩阵;R=E(vkvTk),称为系统的测量误差协方差矩阵,其之所以没有 k 的下标,是因为基本可以认为测量的误差基本不随时间变化。
则上式转化为
Pk=(P−k−KkCP−k)(I−HTKTk)+KkRKTk
要使 ek 的方差最小,则使 Pk 的迹最小,即
d tr(Pk)dKk=0
引入两个对迹的求導公式
d tr(AB)dA=BTd tr(ABAT)dA=2AB
则执行求導:
d tr(Pk)dKk=0−2(HP−k)T+2KkHP−kCT+2KkR=0Kk=P−kHTHP−kHT+R
由此,卡尔曼增益正式被推导出来。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)