2015-10-28 38 views
3

我嘗試瞭解卡爾曼濾波器是如何工作的,並且由於多維變量在開始時過於混淆,所以我開始使用一維示例。卡爾曼濾波器(一維):幾種方法?

我發現了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 ]可以改爲xp


溶液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_estx_est本身和x_est_kminus1)和pp本身和p_kminus1)。

是否需要兩個列表否則p [k]會計算兩次(在預測和更新步驟中)?

回答

11

所有這些解決方案都是一般方程式的特例,我們將不得不看看每個方案有什麼特殊之處。

正確的方程

讓我們開始對一維情況下,正確的一般公式:

# prediction 
x[k] = a * x[k - 1] 
p[k] = a * p[k - 1] * a + q 
# update 
y = z - h * x[k] 
kg = p * h/(h * p * h + r) 
x[k] = x[k] + kg * y 
p[k] = (1 - kg * h) * p[k] 
  • x - 狀態
  • p - 誤差(方差)
  • a - 狀態轉變
  • q - 轉換誤差
  • z - 測量
  • h - 國家對計量改造
  • y - 之間是我們沒有料想到會衡量基礎上,預測和我們實際測量
  • kg差異 - 卡爾曼獲得
  • r - 測量誤差

所有的模型參數(a,q,r,h)原則上也可以具有索引k,並且隨着系統的發展而變化。但在簡單情況下,它們都可以被視爲不變。

如何解決從正確的公式

只有解決方案不同,1實現了a這很好。 a告訴您如何狀態的變化從一個步驟到另一個,如果假設溫度爲靜止然後a == 1,像在溶液2和3

溶液1不具有qq是我們可以對過程錯誤進行估計的地方。同樣,如果該過程是關於系統靜止(a == 1),那麼我們可以設置q = 0

您的解決方案沒有一個h,這是觀察轉換(如何從測量到狀態)。如果您是根據溫度測量結果估算溫度,則h = 1

h可能與1不同的一個示例是,如果您測量的是其他項目而不是您有興趣估算的項目,例如,使用溼度測量來估計溫度。然後h將是線性轉換T(humidity) = h * humidity。我強調線性,因爲上面是線性卡爾曼濾波方程,它們只適用於線性(在數學意義上)系統。

當前和前面的步驟問題

kk - 1,並具有x_estx_est_kminus1純粹是執行的問題的問題。在這方面,你所有的解決方案都是一樣的。

您在解決方案1中關於kk - 1的想法已關閉。只有預測階段需要考慮當前和前一步驟(因爲它是基於前一步驟的當前狀態的預測),而不是更新步驟。更新步驟對預測起作用。

從可讀性的角度來看,解決方案3最接近數學方程。原則上,預測步驟不會給我們x_est[k],但更像predicted_x_est[k]。然後更新步驟在此predicted_x_est[k]上運行並給我們我們的實際x_est[k]

但正如我所說的,所有的實現都是等價的,因爲當它們被編程時,可以看到在預測步驟之後,不再需要過去。所以你可以安全地使用一個變量px而不需要保留一個列表。

關於卡爾曼增益

您寫道:

因此,對於高卡爾曼增益公斤*(Z - x_est [K-1])的 三角洲Z A 「大塊」 - x_est [k-1]被添加到新估計中。如果一個人總是計算當前值,那麼這個事情是不是毫無意義?

在這些情況下,卡爾曼增益只能在0和1之間。什麼時候最大?當r(測量誤差)爲0時,這意味着我們無限信任我們的測量。等式然後簡化爲

​​

這意味着我們丟棄我們的預測值(x_est在右手側),並設置我們的更新的估計等於我們的測量。當我們無限信任我們所衡量的內容時,這是一件有效的事情。

適應測量

我實施的解決方案2,但我卡爾曼濾波是不是真的工作(它 高度適應自己測量並沒有真正考慮就可以了 噪聲)。

調整卡爾曼濾波器是棘手,需要制度和qr正確估計的深入瞭解。請記住,q是過程中的錯誤(狀態演變),r是我們測量中的錯誤。如果您的卡爾曼濾波是適應自身過多的測量就意味着:

  • q太大
  • r太小

或兩者的組合。你將不得不玩的價值觀,找到工作。

+0

非常感謝!在閱讀時我只想到了幾個問題。 「a」總是不變的?如果我有一個傳感器檢測窗口是否打開了,會怎樣?如果我將a'重置爲負值,那麼(因爲房間正在冷卻而不是升溫)?你能舉一個'h'的例子嗎?它如何將當前的估計狀態轉換爲度量?你忘了告訴我'y'。您能否爲此添加解釋?這是某種「未知的休息」嗎?或者它從哪裏來? – daniel451

+0

+我們是否每次迭代更新'q'和'r'?例如。當我知道溫度計的測量噪音越來越大,房間變得越來越熱......或者我會根據以前的知識採取一些平均誤差,而不會更新'q'和'r'? – daniel451

+0

@ascenator我試圖根據您的後續問題擴展答案 - 檢查編輯以獲取更改。 tldr版本:所有這些都可以改變,但它使事情變得更難; 'q'和'r'可能意味着錯誤,或者你可以根據你所在的狀態空間中的哪個位置來修改它們。 'h'是一個線性變換。 – jepio