以其中的一篇參考資料為例:
卡爾曼濾波器的遞迴過程:
估計時刻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讀取出來的訊號應當為一條平穩的直線,而現實上讀取出來的訊號確上下波動極其大,遠遠超出了我們理論計算水平。雖然後來通過大量的研究分析,得出時...