我嘗試瞭解卡爾曼濾波器是如何工作的,並且由於多維變量在開始時過於混淆,所以我開始使用一維示例。卡爾曼濾波器(一維):幾種方法?
我發現了3種不同的來源來解釋溫度計的情況,但所有這些情況都實現了稍微不同的方程式,我不明白這一點。
我實施了解決方案2但我的卡爾曼過濾器並不真正工作(它高度適應測量,並沒有真正考慮到它的噪音)。
因此,在浪費更多時間嘗試解決方案1或3(我剛剛閱讀到現在)之前:有人可以爲一維卡爾曼濾波器提供乾淨的說明和/或代碼示例嗎?
解決方案1
// x_est: current estimate; p: current estimate error;
// a: constant of the system; kg: kalman gain
// z: current observation;
// Predict
x_est = a * x_est
p = a * p * a
// Update
kg = p/(p + r)
x_est = x_est + kg * (z - x_est)
p = (1 - kg) * p
筆者(在這裏)只解釋說,我們正在改變目前唯一的值,因爲沒有必要爲溫度計要考慮的最後一個值。
於是他簡單:
p[k] = (1 - kg) * p[k-1]
到p = (1 - kg) * p
x_est[k] = x_est[k-1] + kg * (z - x_est[k-1])
到x_est = x_est + kg * (z - x_est)
...等等...
我不明白這是爲什麼甚至可能。我認爲卡爾曼濾波器的主要部分之一是考慮更新目前的觀測結果是否有用(通過卡爾曼增益)。因此,對於高卡爾曼增益kg * (z - x_est[k-1])
,增量的「大塊」被添加到新估計。如果一個人總是計算當前值,那麼這不是沒有意義嗎?
解決方案2
# q: process variance/process noise
# r: error in measurement
x_est = x_est
p = p + q;
k = p/(p + r);
x_est = x_est + k * (z – x_est);
p = (1 – k) * p;
這是幾乎相同的,但筆者甚至沒有給出解釋爲什麼X [K-1]和P [K-1 ]可以改爲x和p。
溶液3
# Q: process variance/process noise
# R: error in measurement
# prediction
x_est_kminus1[k] = x_est[k - 1]
p_kminus1[k] = p[k - 1] + Q
# update
kg[k] = p_kminus1[k]/(p_kminus1[k] + R)
x_est[k] = x_est_kminus1[k] + kg[k] * (z[k] - x_est_kminus1[k])
p[k] = (1 - kg[k]) * p_kminus1[k]
在該溶液中的提交人兩個不同列表爲x_est
(x_est
本身和x_est_kminus1
)和p
(p
本身和p_kminus1
)。
是否需要兩個列表否則p [k]會計算兩次(在預測和更新步驟中)?
非常感謝!在閱讀時我只想到了幾個問題。 「a」總是不變的?如果我有一個傳感器檢測窗口是否打開了,會怎樣?如果我將a'重置爲負值,那麼(因爲房間正在冷卻而不是升溫)?你能舉一個'h'的例子嗎?它如何將當前的估計狀態轉換爲度量?你忘了告訴我'y'。您能否爲此添加解釋?這是某種「未知的休息」嗎?或者它從哪裏來? – daniel451
+我們是否每次迭代更新'q'和'r'?例如。當我知道溫度計的測量噪音越來越大,房間變得越來越熱......或者我會根據以前的知識採取一些平均誤差,而不會更新'q'和'r'? – daniel451
@ascenator我試圖根據您的後續問題擴展答案 - 檢查編輯以獲取更改。 tldr版本:所有這些都可以改變,但它使事情變得更難; 'q'和'r'可能意味着錯誤,或者你可以根據你所在的狀態空間中的哪個位置來修改它們。 'h'是一個線性變換。 – jepio