天天看點

一文圖解卡爾曼濾波(Kalman Filter)

譯者注:這恐怕是全網有關卡爾曼濾波最簡單易懂的解釋,如果你認真的讀完本文,你将對卡爾曼濾波有一個更加清晰的認識,并且可以手推卡爾曼濾波。原文作者使用了漂亮的圖檔和顔色來闡明它的原理(讀起來并不會因公式多而感到枯燥),是以請勇敢地讀下去!

本人翻譯水準有限,如有疑問,請閱讀原文;如有錯誤,請在評論區指出。推薦閱讀原文,排版比較美:)

背景

關于濾波

首先援引來自知乎大神的解釋。

“一位專業課的教授給我們上課的時候,曾談到:filtering is weighting(濾波即權重)。濾波的作用就是給不同的信号分量不同的權重。最簡單的loss pass filter, 就是直接把低頻的信号給1權重,而給高頻部分0權重。對于更複雜的濾波,比如維納濾波, 則要根據信号的統計知識來設計權重。

從統計信号處理的角度,降噪可以看成濾波的一種。降噪的目的在于突出信号本身而抑制噪聲影響。從這個角度,降噪就是給信号一個高的權重而給噪聲一個低的權重。維納濾波就是一個典型的降噪濾波器。”

關于卡爾曼濾波

Kalman Filter 算法,是一種遞推預測濾波算法,算法中涉及到濾波,也涉及到對下一時刻資料的預測。Kalman Filter 由一系列遞歸數學公式描述。它提供了一種高效可計算的方法來估計過程的狀态,并使估計均方誤差最小。卡爾曼濾波器應用廣泛且功能強大:它可以估計信号的過去和目前狀态,甚至能估計将來的狀态,即使并不知道模型的确切性質。

Kalman Filter 也可以被認為是一種資料融合算法(Data fusion algorithm),已有50多年的曆史,是當今使用最重要和最常見的資料融合算法之一。Kalman Filter 的巨大成功歸功于其小的計算需求,優雅的遞歸屬性以及作為具有高斯誤差統計的一維線性系統的最優估計器的狀态。

Kalman Filter 隻能減小均值為0的測量噪聲帶來的影響。隻要噪聲期望為0,那麼不管方差多大,隻要疊代次數足夠多,那效果都很好。反之,噪聲期望不為0,那麼估計值就還是與實際值有偏差[3]。

問題描述

上面的描述可能把大家繞暈了,下面來點輕松的。

我們會有一個疑問:卡爾曼濾波到底是如何解決實際問題的呢?

我們以機器人為例介紹卡爾曼濾波的原理,我們的任務是要預測機器人的狀态,包括位置與速度,即可表示為:

某個時刻,我們不知道真實的位置與速度到底是多少,二者存在一個所有可能性的組合,大緻如下圖所示。

一文圖解卡爾曼濾波(Kalman Filter)

卡爾曼濾波假設狀态所有的變量都是随機的且都服從高斯分布,每個變量都有其對應的均值以及方差(它代表了不确定性)。

一文圖解卡爾曼濾波(Kalman Filter)

在上圖中,位置和速度是不相關(uncorrelated)的,這意味着某個變量的狀态不會告訴你其他變量的狀态是怎樣的。即,我們雖然知道現在的速度,但無法從現在的速度推測出現在的位置。但實際上并非如此,我們知道速度和位置是有關系的(correlated),這樣一來二者之間的組合關系變成了如下圖所示的情況。

一文圖解卡爾曼濾波(Kalman Filter)

這種情況是很容易發生的,例如,如果速度很快,我們可能會走得更遠,是以我們的位置會更大。如果我們走得很慢,我們就不會走得太遠。

這種狀态變量之間的關系很重要,因為它可以為我們提供更多資訊:One measurement tells us something about what the others could be。這就是卡爾曼濾波器的目标,我們希望從不确定的測量中盡可能多地擷取資訊!

這種狀态量的相關性可以由協方差矩陣表示。簡而言之,矩陣的每個元素是第i個狀态變量和第j個狀态變量之間的相關度。(顯然地可以知道協方差矩陣是對稱的,這意味着交換i和j都沒關系)。協方差矩陣通常标記為“ ”,是以我們将它們的元素稱為“”。

一文圖解卡爾曼濾波(Kalman Filter)

狀态預測

問題的矩陣形式表示

我們把狀态模組化成高斯分布(Gaussian blob,由于二維高斯分布長得像一個個小泡泡,之是以長這個樣子,可參考連結[2])。我們需要求解/估計在時間時刻的兩個資訊:1. 最優估計以及它的協方差矩陣,我們可以寫成下面矩陣形式:

(當然,這裡我們僅使用位置和速度,但是請記住狀态可以包含任意數量的變量,并且可以表示所需的任何變量)

接下來,我們需要某種方式來檢視目前狀态(時刻)并預測在時刻處的狀态。請記住,我們不知道哪個狀态是“真實”狀态,但是這裡提到的預測(prediction)并不在乎這些。

一文圖解卡爾曼濾波(Kalman Filter)

我們可以用一個矩陣來表示這個預測過程:

一文圖解卡爾曼濾波(Kalman Filter)

這個矩陣将原始估計中的每個點移動到新的預測位置。

那麼問題來了,應該如何使用上述矩陣來預測下一時刻的位置和速度呢?為了闡述這個過程,我們使用了一個非常基礎的運動學公式(國中實體中就學過)進行描述:

寫成矩陣形式:

現在我們有了一個預測矩陣或者叫做狀态轉移矩陣,該矩陣可以幫助我們計算下一個時刻的狀态。但我們仍然不知道如何更新狀态的協方差矩陣,其實過程也是很簡單,如果我們将分布中的每個點乘以矩陣,那麼其協方差矩陣會發生什麼?

将公式(3)代入公式(4)我們可以得到:

External influence

不過我們并沒有考慮到所有的影響因素。可能有一些與狀态本身無關的變化——如外界因素可能正在影響系統。

例如,我們用狀态對列車的運動進行模組化,如果列車長加大油門,火車就加速。同樣,在我們的機器人示例中,導航系統軟體可能會發出使車輪轉動或停止的指令。如果我們很明确地知道這些因素,我們可以将其放在一起構成一個向量,我們可以對這個量進行某些“處理”,然後将其添加到我們的預測中對狀态進行更正。

假設我們知道由于油門設定或控制指令而産生的預期加速度。根據基本運動學原理,我們可以得到下式:

将其寫成矩陣形式:

其中被稱為控制矩陣,被稱為控制向量。(注意:對于沒有外部影響的簡單系統,可以忽略這個控制項)。

如果我們的預測并不是100%準确模型,這會發生什麼呢?

External uncertainty

如果狀态僅僅依賴其自身的屬性進行演進,那一切都會很好。如果狀态受到外部因素進行演進,我們隻要知道這些外部因素是什麼,那麼一切仍然很好。

但在實際使用中,我們有時不知道的這些外部因素到底是如何被模組化的。例如,我們要跟蹤四軸飛行器,它可能會随風搖晃;如果我們跟蹤的是輪式機器人,則車輪可能會打滑,或者因地面颠簸導緻其減速。我們無法跟蹤這些外部因素,如果發生任何這些情況,我們的預測可能會出錯,因為我們并沒有考慮這些因素。

通過在每個預測步驟之後添加一些新的不确定性,我們可以對與“世界”相關的不确定性進行模組化(如我們無法跟蹤的事物):

一文圖解卡爾曼濾波(Kalman Filter)

這樣一來,由于新增的不确定性原始估計中的每個狀态都可能遷移到多個狀态。因為我們非常喜歡用高斯分布進行模組化,此處也不例外。我們可以說的每個點都移動到具有協方差的高斯分布内的某個位置,如下圖所示:

一文圖解卡爾曼濾波(Kalman Filter)

這将産生一個新的高斯分布,其協方差不同(但均值相同):

一文圖解卡爾曼濾波(Kalman Filter)

是以呢,我們在狀态量的協方差中增加額外的協方差,是以預測階段完整的狀态轉移方程為:

換句話說:新的最佳估計是根據先前的最佳估計做出的預測,再加上對已知外部影響的校正。

新的不确定度是根據先前的不确定度做出的預測,再加上來自環境額外的不确定度。

上述過程描繪了狀态預測過程,那麼當我們從傳感器中擷取一些測量資料時會發生什麼呢?

狀态更新

利用測量進一步修正狀态

假設我們有幾個傳感器,這些傳感器可以向我們提供有關系統狀态的資訊。就目前而言,測量什麼量都無關緊要,也許一個讀取位置,另一個讀取速度。每個傳感器都告訴我們有關狀态的一些間接資訊(換句話說,傳感器在狀态下運作并産生一組測量讀數)。

一文圖解卡爾曼濾波(Kalman Filter)

請注意,測量的機關可能與狀态量的機關不同。我們使用矩陣對傳感器的測量進行模組化。

一文圖解卡爾曼濾波(Kalman Filter)

是以我們期望傳感器的度數可以被模組化成如下形式:

卡爾曼濾波器的偉大之處就在于它能夠處理傳感器噪聲。換句話說,傳感器本身的測量是不準确的,且原始估計中的每個狀态都可能導緻一定範圍的傳感器讀數,而卡爾曼濾波能夠在這些不确定性存在的情況下找到最優的狀态。

一文圖解卡爾曼濾波(Kalman Filter)

根據傳感器的讀數,我們會猜測系統正處于某個特定狀态。但是由于不确定性的存在,某些狀态比其他狀态更可能産生我們看到的讀數:

一文圖解卡爾曼濾波(Kalman Filter)

我們将這種不确定性(如傳感器噪聲)的協方差表示為,讀數的分布均值等于我們觀察到傳感器的讀數,我們将其表示為

這樣一來,我們有了兩個高斯分布:一個圍繞通過狀态轉移預測的平均值,另一個圍繞實際傳感器讀數。

一文圖解卡爾曼濾波(Kalman Filter)

是以,我們需要将基于預測狀态(粉紅色)的推測讀數與基于實際觀察到的傳感器讀數(綠色)進行融合。

那麼融合後最有可能的新狀态是什麼?對于任何可能的讀數,我們都有兩個相關的機率:(1)我們的傳感器讀數是的測量值的機率,以及(2)先前估計值的機率認為是我們應該看到的讀數。

如果我們有兩個機率,并且想知道兩個機率都為真的機會,則将它們相乘。是以,我們對兩個高斯分布進行了相乘處理:

一文圖解卡爾曼濾波(Kalman Filter)

兩個機率分布相乘得到的就是上圖中的重疊部分。而且重疊部分的機率分布會比我們之前的任何一個估計值/讀數都精确得多,這個分布的均值就是兩種估計最有可能配置(得到的狀态)。

一文圖解卡爾曼濾波(Kalman Filter)

事實證明,兩個獨立的高斯分布相乘之後會得到一個新的具有其均值和協方差矩陣的高斯分布!下面開始推公式。

合并兩個高斯分布

首先考慮一維高斯情況:一個均值為,方差為的高斯分布的形式為:

我們想知道将兩個高斯曲線相乘會發生什麼。下圖中的藍色曲線表示兩個高斯總體的(未歸一化)交集:

一文圖解卡爾曼濾波(Kalman Filter)

将公式(9)代入公式(10),我們可以得到新的高斯分布的均值和方差如下所示:

我們将其中的一小部分重寫為:

這樣一來,公式的形式就簡單多了!我們順勢将公式(12)和(13)的矩陣形式寫在下面:

其中表示新高斯分布的協方差矩陣,是每個次元的均值,就是大名鼎鼎的“卡爾曼增益”(Kalman gain)。

公式彙總

我們有兩個高斯分布,一個是我們預測的觀測,另外一個是實際的觀測(傳感器讀數),我們将這兩個高斯分布帶入公式(15)中就可以得到二者的重疊區域:

從公式(14)我們可以知道,卡爾曼增益是:

然後我們将公式(16)與公式(17)中的去除,同時将後面的去除,我們可以得到最終的化簡形式的更新方程:

圖說

大功告成,就是更新後的最優狀态!接下來我們可以繼續進行預測,然後更新,重複上述過程!下圖給出卡爾曼濾波資訊流。

一文圖解卡爾曼濾波(Kalman Filter)

總結

在上述所有數學公式中,你需要實作的隻是公式(7)(18)和(19)。(或者,如果你忘記了這些,可以從等式(4)和(15)重新推導所有内容。)

這将使你能夠準确地對任何線性系統模組化。對于非線性系統,我們使用擴充卡爾曼濾波器,該濾波器通過簡單地線性化預測和測量值的均值進行工作。

參考資料

[1]: How a Kalman filter works, in pictures, 圖解卡爾曼濾波是如何工作的:

 ​​http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/#mathybits​​

[2]: A geometric interpretation of the covariance matrix, 協方差矩陣的幾何解釋: 

​​https://www.visiondummy.com/2014/04/geometric-interpretation-covariance-matrix​​

[3]: Kalman Filter 卡爾曼濾波: 

​​https://sikasjc.github.io/2018/05/08/kalman_filter​​