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

2021-10-04 20:21:16 字數 1894 閱讀 7878

以其中的一篇參考資料為例:

卡爾曼濾波器的遞迴過程:

估計時刻k 的狀態:

x(k) = ax(k-1) + bu(k)

這裡, u(k) 是系統輸入,在專案中,一維輸入訊號a=1

計算誤差相關矩陣p, 度量估計值的精確程度:

p(k) = a*p(k-1)*a』+ q

這裡, q = e 是系統雜訊的協方差陣,即系統框圖中的wj的協方差陣, q 應該是不斷變化的,為了簡化,當作乙個常數矩陣。

計算卡爾曼增益, 以下略去 (k), 即 p = p(k), x = x(k):

k = p c』 (c * p * c』 + r) -1

這裡 r = e, 是測量雜訊的協方差(陣), 即系統框圖中的 vj 的協方差, 為了簡化,也當作乙個常數矩陣。由於我們的系統一般是單輸入單輸出,所以 r是乙個 1x1的矩陣,即乙個常數,上面的公式可以簡化為:

k = p c』 / (c p * c』 + r)

狀態變數反饋的誤差量:

e = z(k) – c*x(k)

這裡的 z(k) 是帶雜訊的測量,在專案中,一維輸入訊號c=1

更新誤差相關矩陣p

p = p – k * c * p

更新狀態變數:

x =x + ke = x + k (z(k) – c*x(k))

最後的輸出:

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估計值')

在專案上,關鍵的是獲取到q、r、p,這3個資料需要通過實驗統計獲取,

拓展研究:

3、4、

5、ps:?號 1762016542 提供答疑諮詢等

卡爾曼濾波器

協方差 用於表示兩個變數的總體誤差,如果兩個變化趨勢一致則協方差為正值,變化趨勢不一致則為負值。從直觀上來看,協方差表示的是兩個變數總體誤差的期望。由k 1時刻的最優值和系統輸入計算k時刻的系統 值。根據k 1時刻的系統協方差 k時刻系統協方差。根據 k時刻 協方差矩陣的 值計算卡爾曼增益。根據狀態...

匈牙利演算法和卡爾曼濾波器

1.匈牙利演算法 分配問題 assignment problem 假設有n個人和n個任務,每個任務可以任意分配給不同的人,已知每個人完成每個任務要花費的代價不盡相同,那麼如何分配可以使得總的代價最小。匈牙利演算法 又叫km演算法 就是用來解決分配問題的一種方法,它基於定理 如果代價矩陣的某一行或某一...

Python 卡爾曼濾波器實現

去年我們在設計一款新產品的時候,由於選用定製開發的乙個soc器件,導致我們在用adc讀取經由這個soc晶元放大後的訊號時,出現了極其不穩定的情況。正常情況下adc讀取出來的訊號應當為一條平穩的直線,而現實上讀取出來的訊號確上下波動極其大,遠遠超出了我們理論計算水平。雖然後來通過大量的研究分析,得出時...