卡爾曼濾波器原理和matlab實現

項目最近正好用上kalman濾波器,故整理一下kalman濾波器相關資料,網上有很多詳細的kalman資料,參考如下:
1、https://zhuanlan.zhihu.com/p/34656822
2、https://blog.csdn.net/m0_37953670/article/details/89528002
由於項目處理的是一維信號,過濾噪點,故上面2篇文獻足夠完成項目

以其中的一篇參考資料爲例:
模型
卡爾曼濾波器的遞歸過程:

  1. 估計時刻k 的狀態:
    X(k) = AX(k-1) + Bu(k)
    這裏, u(k) 是系統輸入,在項目中,一維輸入信號A=1

  2. 計算誤差相關矩陣P, 度量估計值的精確程度:
    P(k) = A*P(k-1)*A’+ Q
    這裏, Q = E{ Wj^2 } 是系統噪聲的協方差陣,即系統框圖中的Wj的協方差陣, Q 應該是不斷變化的,爲了簡化,當作一個常數矩陣。

  3. 計算卡爾曼增益, 以下略去 (k), 即 P = P(k), X = X(k):
    K = P C’ (C * P * C’ + R) -1
    這裏 R = E{ Vj^2 }, 是測量噪聲的協方差(陣), 即系統框圖中的 Vj 的協方差, 爲了簡化,也當作一個常數矩陣。由於我們的系統一般是單輸入單輸出,所以 R是一個 1x1的矩陣,即一個常數,上面的公式可以簡化爲:
    K = P C’ / (C P * C’ + R)

  4. 狀態變量反饋的誤差量:
    e = Z(k) – C*X(k)
    這裏的 Z(k) 是帶噪聲的測量,在項目中,一維輸入信號C=1

  5. 更新誤差相關矩陣P
    P = P – K * C * P

  6. 更新狀態變量:
    X =X + Ke = X + K (Z(k) – C*X(k))

  7. 最後的輸出:
    Y = C*X

%卡爾曼濾波實例
%測量房間溫度,房間溫度真實值爲T=25度,一共測量兩百個點
N=200;  T=25;  size=[N,1]; 
%取溫度預測值的方差爲Q=1e-3,溫度傳感器的測量方差爲R=0.36,即我們更相信預測值,而較少相信傳感器測量值。
Q=1e-3;  R=0.36;  T_mearsured=T+sqrt(R)*randn(size);
%初始時刻溫度的最優估計值爲T_start=22.5度,溫度初始估計方差爲P_start=2
T_start=22.5;  P_start=2;
T_kalman(1)=T_start;  P_kalman(1)=P_start;
%用_kalman的後綴表示最優估計值,用_pre的後綴表示預測值
for k=2:N
    %在進行溫度預測時,因爲溫度是一個連續的狀態,我們認爲上一時刻的溫度和當前時刻的溫度相等,則有T(k)=T(k-1)。
	T_pre(k)=T_kalman(k-1); % 估計時刻k 的狀態
	P_pre(k)=P_kalman(k-1)+Q; % 計算誤差相關矩陣P, 度量估計值的精確程度
	K(k)=P_pre(k)/(P_pre(k)+R); % 計算卡爾曼增益
	T_kalman(k)=T_pre(k)+K(k)*(T_mearsured(k)-T_pre(k)); % 更新狀態變量
	P_kalman(k)=P_pre(k)-K(k)*P_pre(k); % 更新誤差相關矩陣P 
end
%畫圖
figure();
plot(T*ones(size),'g');
hold on
plot(T_mearsured,'b');
hold on
plot(T_kalman,'r');
legend('溫度真實值','溫度測量值','Kalman估計值')

kalman濾波效果
在項目上,關鍵的是獲取到Q、R、P,這3個數據需要通過實驗統計獲取,

拓展研究:
3、https://blog.csdn.net/zengxiantao1994/article/details/71170728
4、https://www.mathworks.com/help/fusion/ref/trackingkf.html
5、https://www.mathworks.com/help/fusion/ug/linear-kalman-filters.html

PS:🐧號 1762016542 提供答疑諮詢等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章