Author🚹:CofCai
personal page🏠
CSDN page🏠
Email📧:cai.dongjun@nexuslink.cn
References
How a Kalman filter works, in pictures | Bzarg
详解卡尔曼滤波原理_清风莞尔的博客-CSDN博客
参考链接3:当然还有DR_CAN的视频啦
注:链接1是一位国外大神写的,所以是英文,链接2是其翻译版。
卡尔曼滤波的作用
你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。
世界中充满着不确定性
系统的运行过程中有过程噪音,仪器测量有测量误差。[就连喜欢一个人也都有不确定性,时而喜欢、时而无感觉,~嗯、渣男]。既然现实生活中充满着不确定性,那么有没有一种方法可以获得相对准确的结果呢?这就是卡尔曼滤波的作用。
在工程中
我们常常根据系统的上一状态来计算出系统的当前状态,但是由于外界的影响,计算出来的结果和系统真实的结果是有差异的;我们又同时通过系统中的传感器获得系统的当前状态,但是由于传感器本身的误差,我们从传感器获得的结果和系统真实值也是有差异的。
即我们得到了系统两个具有误差的结果:
- 一个是根据系统的状态空间方程计算而得的计算值,真实值是在计算值的基础上会被加入过程噪声(比如小车在行驶过程中被风吹歪了,那么真实值就不是计算值了。);
- 一个是根据传感器测量而得的、具有测量误差的测量值。
我们的目标是把两个具有误差的结果融合为一个误差不太大的、可信的结果。
整体感受
状态空间方程
系统的状态方程:
Xk−=AXk−1+Buk−1
但系统会受到**环境噪声wk−1**的影响,系统真实的状态并不是数学表达式所表示的结果,即系统真实的状态Xk应该加上环境噪声,为:
Xk=Xk−+wk−1=AXk−1+Buk−1+wk−1
系统的计算值(先验估计):Xk−=AXk−1+Buk−1。
传感器测量方程:
Zk=HXk
系统的测量值:XkMeasure=H−Zk,记住:这个测量值包含了测量误差。因为传感器本身有误差,即传感器读数值Zk包括了误差,即真实的传感器测量方程是:
Zk=HXk+vk
综上可得系统真实的状态方程为:
Xk=Xk−+wk−1=AXk−1+Buk−1+wk−1(6−1)Zk=HXk+vk(6−2)
式中:
- Xk是当前系统真实的状态;
- Xk−是根据状态方程算出来当前系统本应该处于的状态(计算值);
- uk−1是外部控制输入;
- Zk是当前传感器的读数值(包含了测量误差vk);
- wk−1和vk一个是过程噪声,一个是测量噪声,它们在卡尔曼滤波中都被认为服从高斯分布;
- H是一个系数,比如有的传感器测出的值是0~1024之间的值,还需要转换才能得到对应的物理量。
结合例子理解公式
一辆小车上装有位置传感器,并且向前匀速的运动。
公式6-1说明
系统的状态是可以用数学表达式表达出来的(或者这样说,系统的运行状态满足某些数学公式),也就意味着系统的当前状态可以根据上一状态计算而出,即通过系统的状态方程,可以计算出系统当前的状态Xk−。但是由于具有过程噪声wk−1,所以这个结果不是系统当前的真实状态。
比如:上一时刻小车的位置是5,速度是2,那么通过计算可以知道下一时刻小车的位置是7。但是由于环境风的影响,导致小车真实的位置其实是6.8,所以小车的真实值Xk=计算值Xk−+过程噪声wk−1(此处噪声是-0.2,计算值是7,真实值就是6.8了)。在卡尔曼滤波中认为过程噪声w是服从(0,cov(w))的正态分布。
公式6-2说明
通过小车上的传感器,可以得到小车当前的测量位置,但是由于传感器具有测量误差,所以这个传感器传回的值包含了测量噪声,即真实值Xk+测量噪声vk=传感器测量的结果(读数值)Zk。
比如:续上,小车当前的真实位置是6.8(传感器测量的就是小车的真实位置,只不过传感器自己有误差),由于测量误差,传感器测量得到的值是6.7(测量值才是我们可以得到的,是读数值),即6.7=6.8−0.1,6.7是我们从传感器读数得知,0.1是测量误差(服从正态分布),6.8是真实值。
参数H的意义
这里首先要明白一点:传感器的值不一定就等于系统的状态,这里不是说误差的影响,而是传感器特性的影响。比如传感器的1代表了系统的100,这是生产传感器时就规定好的。所以由传感器上的值得到系统的状态还需要乘以100(就是H这个系数),如果传感器的值就代表了系统的状态,那么H=1,比如位置传感器直接给出小车位置,而速度传感器还需要转换才能得出位置。
总结
在公式7中,我们可以得到的是:
- 系统的计算值(计算值)Xk−;
- 系统的观测值(读数值)Zk。
- 又基于实际生活和大量实验,我们可以大致得到过程噪声和测量噪声的分布情况(卡尔曼滤波认为是正态分布)。
最终我们就可以根据两个和正态误差相关的结果(Xk−和Zk)融合为一个误差较小的结果Xk+,这个融合值是最优估计。
怎么融合?
从简单的例子入手-测量一枚硬币的直径
由于尺子误差和认为读数误差,结果是不准确的,我们自然会测量多次以平均值作为其真实值。
xk=k1(z1+z2+...+zk)=k1(z1+z2+...+zk−1)+k1zk=k1k−1k−1(z1+z2+...+zk−1)+k1zk=kk−1xk−1+k1zk=xk−1−k1xk−1+k1zk=xk−1+k1(zk−xk−1)
zk表示第k次的测量值,xk表示第k次的估计值(即前k次的平均值)。通过一个简单的变换,我们得到了一个公式,即:当前估计值=上一次估计值+比例(当前测量值-上一次估计值)。这里的比例*其实就是融合比例(卡尔曼增益),谁多一点、谁少一点。
比如:
- 当k=1时,此时估计值就等于测量值xk=zk,因为目前就测量了一次,没有更多数据做平均嘛;
- 当k→∞时,此时估计值就等于上一次的估计值xk=xk−1,因为我有足够多的历史数据了,这一次的测量数据对我的影响很小。
融合实例
由两把不同的天平(误差都服从正态分布)得出不同的重量,天平1误差的标准差是2g,天平2误差的标准差是4g。现在天平1的结果是30g,天平2的结果是32g,怎么把两个结果融合为一个最优的估计值。从下面的正态分布图可以知道,最终的结果应该在30~32g之间,并且靠近30g更多一点。
z1=30gσ1=2gz2=32gσ2=4gz=z1+k(z2−z1)
融合目标:找到k,使得var(z)最小,融合后误差最小就是使融合后方差最小(方差越小越接近真实值)。
σz2=var(z1+k(z2−z1))=var(z1−kz1+kz2)=var((1−k)z1+kz2)=var((1−k)z1)+var(kz2)=(1−k)2var(z1)+k2var(z2)=(1−k)2σ12+k2σ22
要使σz2最小,求导令其为0,求其最小值。
dkdσz2=0−2(1−k)σ12+2kσ22=0−σ12+kσ12+kσ22=0k(σ12+σ22)=σ22⟹k=σ12+σ22σ12
所以:
k=4+164=0.2σz2=(1−0.2)2×22+0.22×42=3.2σz=3.2=1.79g
卡尔曼公式详细推导
可以不用看,推导较复杂!!!
协方差矩阵
E[w wT]就代表了w的协方差矩阵,如下:
过程噪声协方差矩阵为Q,服从wk−(0,Q),没有下标k的原因是一般认为高斯噪声分布不变化。
E[wkwkT]=Q
测量噪声协方差矩阵为R,服从vk−(0,R)
E[vkvkT]=R
误差协方差矩阵为Pk,服从ek−(0,Pk)
E[ekekT]=Pk
卡尔曼增益的推导
状态空间方程:
Xk=Xk−+wk−1=AXk−1+Buk−1+wk−1(29−1)Zk=HXk+vk(29−2)
其中:
- Xk−=AXk−1+Buk−1被称为先验估计(计算值),和真实值还是有误差(被风吹歪了);
- XkMeasure=H−Zk是测量值,包含了测量噪声。
估计值/后验估计Xk+:
融合值=计算值+G(测量值−计算值)Xk+=Xk−+G(XkMeasure−Xk−)=Xk−+G(H−Zk−Xk−){Xk+=XK−=计算值,G=0XK+=H−Zk=测量值,G=1令G=KkHXk+=Xk−+Kk(Zk−HXk−){Xk+=XK−=计算值,K=0XK+=H−Zk=测量值,K=H−
- 定义误差(真实值-估计值)ek=Xk−Xk+,寻找Kk使得Xk+→Xk,即ek→0;
- 误差也服从高斯分布,即P(ek)−(0,Pk),Pk为误差ek的协方差矩阵,即使得Pk的迹最小;
- 定义先验误差(真实值-先验估计)ek−=Xk−Xk−;
- Pk代表第k次的误差协方差矩阵,Pk−代表第k次的先验误差协方差矩阵。
详细推导
配合食用:
(1−1)→(1−2):
Xk−Xk+=Xk−[Xk−+Kk(Zk−HXk−)]=Xk−Xk−−KkZk+KkHXk−(∵Zk=HXk+vk)=Xk−Xk−−KkHXk−Kkvk+KkHXk−=(Xk−Xk−)−KkH(Xk−Xk−)−Kkvk=(I−KkH)(Xk−Xk−)−Kkvk=(I−KkH)ek−−Kkvk
(1−2)→(1−3):
(AB)T=BTAT(A+B)T=AT+BT
(1−4)→(1−5):
∵E[(I−KkH)ek−vkTKkT]=(I−KkH)KkTE[ek−vkT]ek−,vkT互不相关=(I−KkH)KkTE[ek−]E[vkT]ek−,vkT均服从(0,σ2)=0
(1−6)→(1−7):测量噪声协方差矩阵
E[vkvkT]=R
(1−8)→(1−9):
[(Pk−HT)KkT]T=Kk(PK−HT)T=KkHPk−Ttr(KkHPk−)=tr(KkHPk−T)
(1−9)→(1−10):
Pk−跟Kk无关dAd(AB)=BTdAd(ABAT)=2AB
卡尔曼滤波中最核心的公式:卡尔曼增益
Kk=HPK−HT+RPk−HT
- R→∞,Kk→0,R是测量噪声协方差矩阵,测量噪声很大,更愿意相信计算的结果;
- R→0,Kk→H−,测量噪声小,更愿意相信测量的结果。
误差协方差矩阵Pk−
先验估计:
Xk−=AXk−1+Buk−1
后验估计:
Xk+=Xk−+Kk(Zk−HXk−)
卡尔曼增益:
Kk=HPK−HT+RPk−HT
误差协方差矩阵的推导:
Pk−=E[ek−ek−T]=E[(Aek−1+wk−1)(Aek−1+wk−1)T]=...=APk−1AT+Q
配合食用(这里的Xk−=AXk−1−−Buk−1),和前面的先验估计不一样,不好理解:
ek−=Xk−Xk−=AXk−1+Buk−1+wk−1−AXk−1−−Buk−1=Aek−1−+wk−1
卡尔曼滤波的5个公式
重要变量:先验估计(即计算值),测量值,先验误差,先验误差协方差矩阵,误差,误差协方差矩阵,卡尔曼增益,最优估计。
Xk−=AXk−1+Buk−1Pk−=APk−1AT+QKk=HPK−HT+RPk−HTXk+=Xk−+Kk(Zk−HXk−)Pk=(I−KkH)Pk−
前两步是预测,后两步是校正,最后一步是更新。
扩展的卡尔曼滤波
参考1
参考2
前面是是标准的卡尔曼滤波,即线性卡尔曼滤波,不能作用于非线性系统,而扩展的卡尔曼滤波可用于非线性系统。
线性化
利用泰勒级数对f(x)在x0处展开得:
f(x)=f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!fn(x0)(x−x0)n
如果x→x0,则(x−x0)2→0,⋯,(x−x0)n→0:
f(x)=f(x0)+f′(x0)(x−x0)=k1+k2(x−x0)=kx+b
如上,我们把f(x)线性化成了kx+b。
例:
f(x)=sin(x)=sin(x0)+cos(x0)(x−x0)(letx0=0)=0+x−x0=x
上式表明,sin(x)在x=0附近和x是相等的,分析误差:
{sin(6π)=1/2,6π=0.52,err=0.50.52−0.5=4%sin(4π)=0.707,4π=0.785,err=0.7070.785−0.707=11%
线性化解决EKF
EKF的基本思想是利用泰勒级数展开将非线性系统线性化,然后采用卡尔曼滤波框架对信号进行滤波,因此它是一种次优滤波。
标准(线性)卡尔曼滤波KF的状态转移方程和观测方程为:
{θk=Aθk−1+Buk−1+skzk=Cθk+vk
扩展(非线性)卡尔曼滤波EKF的状态转移方程和观测方程为:
{θk=f(θk−1)+skzk=h(θk)+vk
利用泰勒展开式对式xx在上一次的估计值<θk−1>处展开得:
θk=f(θk−1)+sk=f(<θk−1>)+Fk−1(θk−1−<θk−1>)+sk
再利用泰勒展开式对式xx在本轮得状态预测值θk′处展开得:
zk=h(θk)+vk=h(θk′)+Hk(θk−θk′)+vk
其中,Fk−1和Hk分别表示函数f(θ)和h(θ)在<θk−1和θk′处的雅可比矩阵。
注:这里对泰勒展开式只保留到一阶导,二阶导数以上的都舍去,噪声假设均为加性高斯噪声。