天天看點

擴充卡爾曼濾波

擴充卡爾曼濾波
擴充卡爾曼濾波

這裡必須保證Xk-1,Xk,Xk+1都是正态分布,否則的話我們就沒法遞推了,如果Xk不是正态分布的話就沒有辦法調用我們擴充卡爾曼濾波的算法,自然就會引起誤差,因為本質上f和h是非線性函數,是以說如果是這個真實的後驗機率呢他一定不是這個正态分布,因為他是非線性函數,但是我們濾波的結果呢卻是正态分布,是以說他就是一種誤差,誤差就在這展現,是以說擴充卡爾曼濾波是一種近似,這種近似是有誤差的,誤差來源就在這

擴充卡爾曼濾波
擴充卡爾曼濾波

預測步和更新步泰勒展開的展開點不同,

預測步是在Xk-1plus展開

更新步是在Xkminus展開

擴充卡爾曼濾波
擴充卡爾曼濾波
擴充卡爾曼濾波
擴充卡爾曼濾波
擴充卡爾曼濾波
擴充卡爾曼濾波

擴充卡爾曼濾波的算法和卡爾曼濾波的算法很像,最大的不一樣就是他要求一個雅克比矩陣,第二個不一樣就是算法的2 7步,這裡是

擴充卡爾曼濾波

卡爾曼是Xkminus=A*Xk-1plus,也就是說在這裡他并沒有線性化,還有第7步

擴充卡爾曼濾波

卡爾曼是Xkplus=C*Xkminus,下面來算一個C幫助大家了解雅克比矩陣

擴充卡爾曼濾波

以上是預測

以下是觀測

擴充卡爾曼濾波

這樣呢ekf的理論就講完了,接下來是代碼

%EKF代碼

%紙上得來終覺淺,絕知此事要躬行%x(k)=sin(3x(k-1))

%y(k)=x(k)'2

%注意似然機率是多峰分布,具有強烈的非線性,當y=4時,不知道x=2還是-2

%%%生成真實信号與觀測

t=0.01:0.01:1;

n=length(t);

X=zeros(1,n);

y=zeros(1,n);

x(1)=0.1;

y(1)=0.1^2;

for i=2:n

x(i)=sin(3x(i-1));

y(i)=x(i)^2+normrnd(0,0.1);

end

plot(t,x,‘r’,t,y,‘b’,‘LineWidth’,4)

擴充卡爾曼濾波

紅色代表真實的信号,藍色代表觀測

%EKF代碼

%紙上得來終覺淺,絕知此事要躬行%x(k)=sin(3x(k-1))

%y(k)=x(k)'2

%注意似然機率是多峰分布,具有強烈的非線性,當y=4時,不知道x=2還是-2

%%%生成真實信号與觀測

t=0.01:0.01:1;

n=length(t);

X=zeros(1,n);

y=zeros(1,n);

x(1)=0.1;

y(1)=0.1^2;

for i=2:n

x(i)=sin(3x(i-1));

y(i)=x(i)^2+normrnd(0,0.7);

end

%EKF

Xplus=zeros(1,n);%設定初值

Pplus=0.1;

Xplus(1)=0.1;

Q=0.1;

R=1;

for i=2:n

%預測步

A=3cos(3Xplus(i-1));

Xminus=sin(3Xplus(i-1));

Pminus=APplusA’+Q;

%更新步

C=2Xminus;

K=PminusCinv(CPminusC’+R);

Xplus(i)=Xminus+K*(y(i)-Xminus^2);

Pplus=(eye(1)-K*C)*Pminus;

end

plot(t,x,‘r’,t,Xplus,‘b’,‘LineWidth’,4)

擴充卡爾曼濾波

結果是比較差的,但也算符合我們的預期,我們知道ekf對強烈的非線性問題處理的不太好,他的觀測噪聲比較大,是以效果不好,我們看一下能不能搶救一下,

Q=0.0001;以後長這樣

擴充卡爾曼濾波

結果還是比較差,比剛才那個稍微好一些,而且有一種很強烈的多峰分布的一個感覺,是因為ekf直接把函數線性化了,這樣的話對強非線性問題算的就不是特别的好,如果對一些比較弱的非線性問題他有可能會得到一個比較好的結果,像我們這個例子他的觀測噪聲比較大,他的似然機率又是一個多峰分布,這樣的話就會很差,如果遇到一些強烈的非線性問題的話,擴充卡爾曼濾波需要花很多精力去調Q和R才能得到一個理想的結果,而且一般來說是比較難調的,這就是ekf自然的缺陷,他的優點就在于快,計算速度非常快,和kf差不多,需要的記憶體也比較小,世上第一個可以進行實時計算的slam程式就是用ekf寫出來的,不過呢現在slam都在用最線性優化,第九講提到了slam和相關的算法,ekf也是人類發明出來的第一個處理非線性問題的kf,對一些實時性要求過高并且非線性程度比較弱的場景中ekf也是經常被用到的,ekf到此為止,最後隻剩一個ukf(無迹卡爾曼濾波)。

繼續閱讀