面向軟件工程師的卡爾曼濾波器

深入研究Kalman濾波器,這是有史以來最廣泛且最有用的算法之一。

面向軟件工程師的卡爾曼濾波器

Photo by Clem Onojeghuo on Unsplash

與我的朋友交談時,我經常聽到:"哦,卡爾曼過濾器……我通常學習它們,理解它們,然後我忘記了一切"。 好吧,考慮到卡爾曼濾波器(KF)是世界上應用最廣泛的算法之一(如果環顧四周,您80%的技術可能已經在內部運行某種KF),讓我們嘗試將其弄清楚 一勞永逸。

在這篇文章的結尾,您將對KF的工作原理,其背後的想法,為什麼需要多個變體以及最常見的變體有一個直觀而詳細的瞭解。

狀態估計

KF是所謂的狀態估計算法的一部分。 什麼是狀態估計? 假設您有一個系統(讓我們將其視為黑匣子)。 黑匣子可以是任何東西:您的風扇,化學系統,移動機器人。 對於這些系統中的每一個,我們都可以定義一個狀態。 狀態是變量的向量,我們很想知道它們,它們可以描述系統在特定時間點的"狀態"(這就是為什麼將其稱為狀態)。 "可以描述"是什麼意思? 這意味著,如果您知道在時間k處的狀態向量和提供給系統的輸入,則可以(同時使用系統工作原理的一些知識)知道在時間k + 1處的系統狀態。

例如,假設我們有一個移動的機器人,並且我們關心知道它在空間中的位置(而不關心它的方向)。 如果我們將狀態定義為機器人的位置(x,y)及其速度(v_x,v_y),並且我們有一個關於機器人如何運動的模型,那麼就足以確定機器人的位置和位置。 下一次瞬間。

因此,狀態估計算法估計系統的狀態。 為什麼要估算呢? 因為在現實生活中,外部觀察者永遠無法訪問系統的真實狀態。 通常有兩種情況:您可以測量狀態,但是測量結果會受到噪聲的影響(每個傳感器只能產生一定精度的讀數,可能對您來說還不夠),或者您無法直接測量狀態。 一個示例可能是使用GPS計算上述移動機器人的位置(我們將位置確定為狀態的一部分),這可能會給您帶來多達10米的測量誤差,對於您可能想到的任何應用程序來說,這可能都不足夠 。

通常,在進行狀態估計時,您可以放心地假設您知道系統的輸入(因為是您提供的)和輸出。 由於測量了輸出,因此它也會受到一定的測量噪聲的影響。 據此,我們將狀態估計器定義為一個系統,該系統接收要估計其狀態的系統的輸入和輸出,並輸出系統狀態的估計值。傳統上,狀態用x表示,輸出用 y或z,u是輸入,而tilde_x是估計狀態。

面向軟件工程師的卡爾曼濾波器

System and State Estimator block diagram.

卡爾曼濾波器

您可能已經注意到,我們已經討論了一些有關錯誤的內容:

· 您可以測量系統的輸出,但是傳感器會給出測量誤差

· 您可以估計狀態,但是作為狀態估計它具有一定的置信度。

除此之外,我說過,您需要某種系統知識,您需要了解系統"行為"的模型(稍後會詳細介紹),您的模型當然並不完美,因此您將擁有 另一個錯誤。

在KF中,您可以使用高斯分佈來處理所有這些不確定性。 高斯分佈是表示您不確定的事物的一種好方法。 您當前的信念可以用分佈的均值表示,而標準差可以說明您對信念的信心。

在KF中:

· 您的估計狀態將是具有一定均值和協方差的高斯隨機變量(它將告訴我們該算法"信任"當前估計的程度)

· 您對原始系統的輸出測量的不確定性將用均值為0和一定協方差的隨機變量表示(這將告訴我們我們對測量本身的信任程度)

· 系統模型的不確定性將由均值為0和一定協方差的隨機變量表示(這將告訴我們我們對所使用模型的信任程度)。

讓我們舉一些例子來了解其背後的想法。

· 不良的模型,好的傳感器讓我們再次假設您想跟蹤機器人的位置,並且您在傳感器上花費了很多錢,它們為您提供釐米級的精度。 另一方面,您根本不喜歡機器人技術,您在Google上搜索了一下,然後發現了一個非常基本的運動模型:隨機遊動(基本上是一個僅由噪聲給出運動的粒子)。 很明顯,您的模型不是很好,不能真正被信任,而您的測量結果卻很好。 在這種情況下,您可能將使用非常窄的高斯分佈(小方差)來建模測量噪聲,而使用非常寬的高斯分佈(大方差)來建模不確定性。

· 傳感器質量差,模型好如果傳感器質量不佳(例如GPS),但您花費大量時間對系統進行建模,則情況恰好相反。 在這種情況下,您可能將使用非常窄的高斯分佈(小方差)來建模模型不確定性,而使用非常寬的高斯分佈(大方差)來建模噪聲。

面向軟件工程師的卡爾曼濾波器

Wide variance vs. small variance Gaussian distributions.

估計狀態不確定性如何?KF將根據估計過程中發生的事情進行更新,您唯一要做的就是將其初始化為足夠好的值。 "足夠好"取決於您的應用程序,您的傳感器,您的模型等。通常,KF需要一點時間才能收斂到正確的估計值。

KF如何運作?

如前所述,要讓KF正常工作,您需要對系統有"一定的瞭解"("不確定",即不完美的模型)。 特別是對於KF,您需要兩個模型:

· 狀態轉換模型:某些函數,在時間k給出狀態和輸入,可以在時間k + 1給出狀態。

面向軟件工程師的卡爾曼濾波器

· 測量模型:給定時間為k的某個函數,可以為您提供同一時間的測量結果

面向軟件工程師的卡爾曼濾波器

稍後,我們將瞭解為什麼需要這些功能,讓我們首先看一些示例以瞭解它們的含義。

狀態轉換模型,此模型告訴您系統如何隨時間演變(如果您還記得的話,我們之前曾談到狀態如何具有足夠的描述性以及時推斷系統行為)。這在很大程度上取決於系統本身以及您對系統的關心。如果您不知道如何對系統建模,則可以使用一些Google搜索來提供幫助。對於運動的物體(如果以適當的採樣率測量),可以使用恆速模型(假定物體以恆定的速度運動),對於車輛,可以使用單輪腳踏車模型,等等……讓我們假設一種或另一種,我們建立了一個模型。我們在這裡做出一個重要的假設,這對於KF的工作是必要的:您的當前狀態僅取決於先例。換句話說,系統狀態的"歷史"濃縮為先前的狀態,也就是說,給定先前的狀態,每個狀態都獨立於過去。這也稱為馬爾可夫假設。如果這不成立,就不能僅憑先例來表達當前狀態。

度量模型度量模型告訴您如何將輸出(可以度量)和狀態聯繫在一起。 直觀上,您需要這樣做,因為您知道測量的輸出,並且想要在估計期間從中推斷出狀態。 同樣,此模型因情況而異。 例如,在移動機器人示例中,如果您關心位置並且擁有GPS,則您的模型就是身份功能,因為您已經在測量狀態的嘈雜版本。

每個步驟的數學公式和解釋如下:

面向軟件工程師的卡爾曼濾波器

那麼,KF實際如何運作? 該算法分兩個步驟工作,稱為預測和更新。 假設我們在時間k處,並且那時我們有估計狀態。 首先,我們使用狀態轉換模型,並使估計狀態演化到下一個時刻(1)。 這相當於說:鑑於我當前對狀態的信念,我所擁有的輸入以及對系統的瞭解,我希望我的下一個狀態是這樣。 這是預測步驟。

現在,由於我們還具有輸出和測量模型,因此我們實際上可以使用實際測量"校正"預測。 在更新步驟中,我們採用預期狀態,我們計算輸出(使用測量模型)(2),然後將其與實際測量的輸出進行比較。 然後,我們以"智能方式"使用兩者之間的差異來校正狀態的估計(3)。

通常,我們用頂點-表示校正前來自預測步驟的狀態估計。 K稱為卡爾曼增益。 那才是真正的聰明之處:K取決於我們對測量的信任程度,我們對當前估計的信任程度(這取決於我們對模型的信任程度),並根據此信息K"決定"了預測的估計量 用測量值校正。 如果我們的測量噪聲"小",而不是我們相信來自預測步驟的估計,那麼我們將使用該測量對估計進行很多校正,如果相反,那麼我們將對其進行最小限度的校正。

注意:為簡單起見,我寫方程式時就好像在處理普通變量一樣,但是您必須考慮到在每一步中我們都在處理隨機的高斯變量,因此我們還需要通過函數傳播 變量的協方差,而不僅僅是均值。d


面向軟件工程師的卡爾曼濾波器

Example of real position and estimation at each step of the KF algorithm.

肯德基家族

根據所使用的模型類型(狀態轉換和測量),可以將KF分為兩個大類:如果模型是線性的,則具有線性卡爾曼濾波器,而如果它們是非線性的,則具有非線性卡爾曼濾波器。

為什麼要區分? 好吧,KF假設您的變量是高斯變量,當通過線性函數傳遞時,高斯變量仍然是高斯變量,如果通過非線性函數傳遞,則不正確。 這打破了卡爾曼假設,因此我們需要找到解決方法。

從歷史上看,人們發現了兩種主要方法:用模型作弊和用數據作弊。如果您對模型作弊,則基本上可以使當前估計值周圍的非線性函數線性化,從而使您回到可以工作的線性情況。這種方法稱為擴展卡爾曼濾波器(EKF)。該方法的主要缺點是您必須能夠計算f()和h()的雅可比行列式。另外,如果您使用數據作弊,則可以使用非線性函數,但隨後嘗試對非高斯分佈進行"高斯化"(如果該詞甚至存在)。這是通過稱為"無味轉換"的智能採樣技術完成的。通過此變換,您可以(均值)和均方差來描述一個分佈(在前兩個時刻僅完全描述了高斯分佈)。這種方法稱為無味卡爾曼濾波器(UKF)。從理論上講,UKF優於EKF,因為與模型線性化相比,Unscented Transform對結果分佈的近似更好。在實踐中,必須具有相當大的非線性才能實際看到較大的差異。

肯尼迪行動

由於我談到了很多有關帶GPS的移動機器人的內容,因此我就此情況作了簡短的演示(如果要使用它,可以在這裡找到代碼)。 使用獨輪車模型生成機器人運動。 用於KF的狀態轉換模型是等速模型,其狀態包含x和y位置,轉向角及其導數。

機器人會及時移動(實際位置顯示為黑色),在每一步中,您都會得到非常嘈雜的GPS測量值,該測量值給出x和y(紅色)並估算位置(藍色)。 您可以使用不同的參數,看看它們如何影響狀態估計。 如您所見,我們可以進行非常嘈雜的測量,並對實際位置進行很好的估算。

面向軟件工程師的卡爾曼濾波器

KF in action: a robot real path (black) is tracked with a KF (blue) from noisy measurements (red).

獎勵:卡爾曼增益的直觀含義

讓我們看一下線性OF情況下卡爾曼增益的公式,並嘗試更深入地瞭解增益的工作原理。

面向軟件工程師的卡爾曼濾波器

其中P_k是當前估計狀態的協方差(我們對估計的信心程度),C是測量模型的線性變換,使得y(k)= Cx(k),R是測量噪聲的協方差矩陣 。 請注意,分數表示法並不是真正正確的,但是可以使發生的事情更容易可視化。

根據等式,如果R變為0,則我們有:

面向軟件工程師的卡爾曼濾波器

代之以定義的算法步驟(3),可以看到我們將完全忽略預測步驟的結果,並且使用測量模型的逆變換來獲得僅來自測量的狀態估計。

相反,如果我們非常信任模型/估計,則P_k將趨於0,從而得出:

面向軟件工程師的卡爾曼濾波器

因此,我們得到的最終估計與預測步長輸出相同。

請注意,我正在交替使用"信任模型"和"信任當前估計"。 它們並不相同,但它們是相關的,因為我們對預測步驟的估計的信任程度是我們對模型的信任程度(因為僅使用模型完成預測步驟)加上我們對模型的信任程度的組合。 估計上一步過濾。

獎勵2:庫

有很多不錯的庫可以在線計算KF,這是我的一些最愛。

作為GO愛好者,我將從這個非常不錯的GO庫開始,其中包含幾個預先實現的模型:rosshemsley/kalman

對於Python,您可以查看 pykalman.github.io


結論:我們深入研究了什麼是狀態估計,卡爾曼濾波器的工作原理,其背後的直覺,如何使用它們以及何時使用。 我們介紹了一個玩具(但現實生活中)的問題,並介紹瞭如何使用卡爾曼濾波器解決該問題。 然後,我們更深入地研究了Kalman濾波器在幕後的實際作用。

乾杯!


(本文翻譯自Lorenzo Peppoloni的文章《Kalman Filters for Software Engineers》,參考:https://towardsdatascience.com/kalman-filters-for-software-engineers-3d2a05dee465)


分享到:


相關文章: