11.22 用Python實現卡曼濾波器

本文將為您簡化卡爾曼濾波器。 希望您搜索卡爾曼濾波器的時候,會學到和解密在Wikipedia中發現的所有這些神秘事物。

讓我們開始吧!

要了解卡爾曼濾波器,我們需要了解基礎知識。 在卡爾曼濾波器中,分佈由所謂的高斯給出。

高斯是什麼?

高斯是位置空間上的連續函數,其下面的面積之和最多為1。

用Python實現卡曼濾波器

Gaussian in graph

高斯由兩個參數定義,平均值(通常用希臘字母Mu,μ縮寫)和高斯的寬度通常稱為方差(σ西格瑪平方)。 因此,我們在常見階段的工作是維持μ和σ平方,作為對我們要查找的對象位置的最佳估計。

用Python實現卡曼濾波器

Graph showing mean & variance

確切的公式是二次函數,此處我們取表達式的指數。 現在,在下面的方程式中,如果x等於μ,則分子變為0,如果x為0,則分子即1。 事實證明,我們必須通過常數,1除以2πσ平方的平方根上,對其進行歸一化。

用Python實現卡曼濾波器

Gaussian Equation

什麼是方差?

方差是高斯分佈(即曲線下面積的分佈)的量度。 方差越大,高斯越短。 差異也是確定性的度量; 如果您想找到最確定的位置,例如汽車的位置,則需要一個高斯,其均值是汽車的位置,並且不確定性/傳播範圍最小。

用Python實現卡曼濾波器

Gaussian Function Implementation in Code

如何移動均值?

在卡爾曼濾波器中,我們迭代測量(測量更新)和運動(預測)。 並且更新將使用貝葉斯規則,該規則僅是乘積或乘法。 在預測中,我們使用總概率,它是卷積或簡單地是加法。

用Python實現卡曼濾波器

Measurement update & Prediction cycle

根據Udacity的計算機視覺課程,執行測量週期,然後執行預測週期如下:

  • 假設您正在對另一輛車進行定位,並且您具有一個如下所示的先驗分佈; 這是一個非常寬泛的高斯平均值。 這是我們之前的一個例子,我們對位置不確定,但是測量結果告訴我們有關車輛的位置。
  • 最終均值在兩個舊均值,先驗均值和測量均值之間移動。 在測量方面,它要稍遠一些,因為與以前相比,測量可以更加確定車輛的位置。 我們越確定,就越會在確定答案的方向上拉均值。
用Python實現卡曼濾波器

Localization of the mean (in green)

如何更新參數?

  • 假設我們按照貝葉斯規則將兩個高斯乘以一個先驗概率和一個測量概率。 先驗值具有μ的平均值和σ平方的方差,而度量值具有ν的平均值和r平方的協方差。
  • 那麼,新均值μ prime是舊均值的加權和。 μ由r平方加權, ν由σ平方加權,由加權因子之和標準化。
  • 顯然,先驗的高斯不確定性要高得多,因此,σ平方更大,這意味著ν的權重比μ大得多。 因此,均值將比μ更接近ν。 有趣的是,方差項不受實際方法的影響,它僅使用以前的方差。
用Python實現卡曼濾波器

Update Function

其在代碼中的實現如下:

用Python實現卡曼濾波器

如何實現高斯運動?

  • 新的均值是您的舊均值加上通常稱為u的運動。 因此,如果您在x方向上移動了10米,那麼它將是10米,並且您知道σ平方是您的舊σ平方加上運動高斯的方差。 這就是您所需要知道的,僅僅是補充。
  • 預測步驟中得到的高斯僅將這兩件事加起來,即μ加u和σ平方加r平方。
用Python實現卡曼濾波器

The motion update/ predict function

它的代碼實現如下:

用Python實現卡曼濾波器

現在,讓我們將所有內容放在一起。 讓我們編寫一個包含這兩個功能的主程序,進行更新和預測,並饋入一系列測量和運動。 在示例中,我選擇了:5、6、7、9和10的測量值分別為1.,1,,2、1、1、1。

如果初始估計值為5,那麼所有這些都將非常有效,但是我們將其設置為0,不確定性為10,000。 假設:測量不確定度為常數4,運動不確定度為常數2。

用Python實現卡曼濾波器

當您運行此命令時,該頭寸的第一筆估算值基本上應該變為5–4.99,原因是您的初始不確定性太大,因此該估算值以第一筆測量為主。 您的不確定性減少到3.99,這比測量不確定性要好一些。 然後,您預測將增加1,但不確定性增加到5.99,這是運動不確定性2。根據測量6再次更新,您將獲得5.99的估計值,幾乎是6。再次移動1。 您測量了7。您移動了2.您測量了9.您移動了1.您測量了10,然後移動了最後一個1。最後得出的結果是,該位置的預測為10.99,即您移動的10個位置 1,不確定性-剩餘不確定性4。

用Python實現卡曼濾波器

輸出結果

通過循環遍歷x值範圍並創建結果高斯值列表來繪製高斯圖將導致:

用Python實現卡曼濾波器

Graph

想在代碼中查看嗎?在這裡找 https://github.com/Garima13a/Kalman-Filters

(本文翻譯自Garima Nishad的文章《Kalman Filters: A step by step implementation guide in python》)


分享到:


相關文章: