<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7357字,需瀏覽 15分鐘

           ·

          2021-07-19 09:02

          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達

          本文轉(zhuǎn)自|磐創(chuàng)AI

          與我的朋友交談時,我經(jīng)常聽到:“哦,卡爾曼(Kalman)濾波器……我經(jīng)常學(xué)它,然后我什么都忘了”。好吧,考慮到卡爾曼濾波器(KF)是世界上應(yīng)用最廣泛的算法之一(如果環(huán)顧四周,你80%的技術(shù)可能已經(jīng)在內(nèi)部運行某種KF),讓我們嘗試將其弄清楚。
          在這篇文章的結(jié)尾,你將對KF的工作原理,其背后的想法,為什么需要多個變體以及最常見的變體有一個直觀而詳細的了解。

          狀態(tài)估計

          KF是所謂的狀態(tài)估計算法的一部分。什么是狀態(tài)估計?假設(shè)你有一個系統(tǒng)(讓我們將其視為黑箱)。黑箱可以是任何東西:你的風(fēng)扇,化學(xué)系統(tǒng),移動機器人。對于這些系統(tǒng)中的每一個,我們都可以定義一個狀態(tài)。狀態(tài)是我們關(guān)心的變量向量,可以描述系統(tǒng)處于特定時間點的“狀態(tài)”(這就是為什么將其稱為狀態(tài))。“可以描述”是什么意思?這意味著,如果你了解當(dāng)時的狀態(tài)向量k和提供給系統(tǒng)的輸入,則可以了解當(dāng)時的k+1的系統(tǒng)狀態(tài)(與此同時使用系統(tǒng)工作原理的一些知識)。
          例如,假設(shè)我們有一個移動的機器人,并且我們關(guān)心其在空間中的位置(并且不在乎其方向)。如果我們將狀態(tài)定義為機器人的位置(x, y)及其速度,( )并且我們有一個機器人如何運動的模型,那么就足以確定機器人的位置以及下一個時刻的位置。
          因此,狀態(tài)估計算法估計系統(tǒng)的狀態(tài)。為什么要估算呢?因為在現(xiàn)實生活中,外部觀察者永遠無法訪問系統(tǒng)的真實狀態(tài)。通常有兩種情況:你可以測量狀態(tài),但是測量結(jié)果會受到噪聲的影響(每個傳感器只能產(chǎn)生一定精度的讀數(shù),可能對你來說還不夠),或者你無法直接測量狀態(tài)。一個例子可能是使用GPS計算上述移動機器人的位置(我們將位置確定為狀態(tài)的一部分),這可能會給你帶來多達10米的測量誤差,對于你可能想到的任何應(yīng)用程序來說,這可能都不夠精確。
          通常,當(dāng)你進行狀態(tài)估計時,你可以放心地假設(shè)你知道系統(tǒng)的輸入(因為是你給出的)和輸出。由于測量了輸出,因此它也會受到一定的測量噪聲的影響。據(jù)此,我們將狀態(tài)估計器定義為一個系統(tǒng),該系統(tǒng)接收你要估計其狀態(tài)的系統(tǒng)的輸入和輸出并輸出系統(tǒng)狀態(tài)的估計。
          傳統(tǒng)上,狀態(tài)用表示x,輸出用y或z,u是輸入, 是估計狀態(tài)。

          卡爾曼濾波器

          你可能已經(jīng)注意到,我們已經(jīng)討論了一些有關(guān)誤差的內(nèi)容:
          • 你可以測量系統(tǒng)的輸出,但是傳感器會給出測量誤差
          • 你可以估計狀態(tài),但是作為狀態(tài)估計它具有一定的置信度。
          除此之外,我說過,你需要某種系統(tǒng)知識,你需要了解系統(tǒng)“行為”的模型(稍后會詳細介紹),你的模型當(dāng)然并不完美,因此你將擁有另一個誤差。
          在KF中,你可以使用高斯分布來處理所有這些不確定性。高斯分布是表示你不確定的事物的一種好方法。你當(dāng)前確定的東西可以用分布的均值表示,而標(biāo)準(zhǔn)差可以說明你對該確定的信心。
          在KF中:
          • 你的估計狀態(tài)將是具有一定均值和協(xié)方差的高斯隨機變量(它將告訴我們該算法“確定”其當(dāng)前估計的程度)
          • 你對原始系統(tǒng)的輸出度量的不確定性將用均值為0和一定協(xié)方差的隨機變量表示(這將告訴我們我們對度量本身的信任程度)
          • 系統(tǒng)模型的不確定性將由均值為0和一定協(xié)方差的隨機變量表示(這將告訴我們我們對使用的模型有多信任)。
          讓我們舉一些例子來了解其背后的想法。
          1. 不良模型,好的傳感器,讓我們再次假設(shè)你要跟蹤機器人的位置,并且你在傳感器上花費了很多錢,它們?yōu)槟闾峁├迕准壍木取A硪环矫?,你根本不喜歡機器人技術(shù),搜索了一下,發(fā)現(xiàn)了一個非?;镜倪\動模型:隨機游走(基本上是一個僅由噪聲給出運動的粒子)。很明顯,你的模型不是很好,不能真正被信任,而你的測量結(jié)果卻很好。在這種情況下,你可能將使用非常窄的高斯分布(小方差)來建模測量噪聲,而使用非常寬的高斯分布(大方差)來建模不確定性。
          2. 傳感器質(zhì)量差,模型好,如果傳感器質(zhì)量不好(例如GPS),但是你花費大量時間對系統(tǒng)進行建模,則情況恰好相反。在這種情況下,你可能將使用非常窄的高斯分布(小方差)來建模模型不確定性,而使用非常寬的高斯分布(大方差)來建模噪聲。
          估計的狀態(tài)不確定性如何?
          KF將根據(jù)估計過程中發(fā)生的事情進行更新,你唯一要做的就是將其初始化為足夠好的值?!白銐蚝谩比Q于你的應(yīng)用程序,你的傳感器,你的模型等。通常,KF需要一點時間才能收斂到正確的估計值。

          KF如何工作?

          正如我們所說,要讓KF正常工作,你需要對系統(tǒng)有“一定的了解”。特別是對于KF,你需要兩個模型:
          • 狀態(tài)轉(zhuǎn)換模型:某些函數(shù),給定時間步k的狀態(tài)和輸入,給出時間步k+1的狀態(tài)。
          • 測量模型:某個函數(shù),給定時間步k的狀態(tài),即可為你提供同一時間的測量結(jié)果
          稍后,我們將了解為什么需要這些功能,讓我們首先查看一些示例以了解它們的含義。

          狀態(tài)轉(zhuǎn)換模型

          該模型告訴你系統(tǒng)如何隨時間變化(如果你還記得的話,我們之前曾談到狀態(tài)必須具有足夠的描述性以及時推斷系統(tǒng)行為)。這在很大程度上取決于系統(tǒng)本身以及你對系統(tǒng)的關(guān)心。如果你不知道如何對系統(tǒng)建模,則可以使用一些Google搜索來提供幫助。對于運動的物體(如果以適當(dāng)?shù)牟蓸勇蕼y量),可以使用恒速模型(假定物體以恒定的速度運動),對于車輛,可以使用單輪腳踏車模型,等等……
          讓我們假設(shè)一種或另一種方式,我們建立了一個模型。我們在這里做出一個重要的假設(shè),這對于KF的工作是必要的:你的當(dāng)前狀態(tài)僅取決于先例。換句話說,系統(tǒng)狀態(tài)的“歷史”會壓縮為先前的狀態(tài),也就是說,給定先例狀態(tài),每個狀態(tài)都獨立于過去。這也稱為馬爾可夫假設(shè)。如果這不成立,你將無法僅根據(jù)先例來表達當(dāng)前狀態(tài)。

          測量模型(Measurement model)

          測量模型告訴你如何將輸出和狀態(tài)聯(lián)系在一起。直觀上,你需要這樣做,因為你知道測量的輸出,并且想要在估計期間從中推斷出狀態(tài)。同樣,此模型因情況而異。例如,在移動機器人示例中,如果你的狀態(tài)是位置并且你擁有GPS,則你的模型就是單位函數(shù)(identity function),因為你已經(jīng)在知道了狀態(tài)的有噪聲版本。
          每個步驟的數(shù)學(xué)公式和解釋如下:
          那么,KF實際如何運作?該算法分兩個步驟工作,稱為預(yù)測和更新。假設(shè)我們在時間步k,并且那時我們具有估計狀態(tài)。首先,我們使用狀態(tài)轉(zhuǎn)換模型,并使估計狀態(tài)預(yù)測到下一個時刻。這相當(dāng)于說:鑒于我目前對狀態(tài)的信念,我所擁有的輸入以及對系統(tǒng)的了解,我希望我的下一個狀態(tài)是這樣。這是預(yù)測步驟。
          現(xiàn)在,由于我們還具有輸出和測量模型,因此我們實際上可以使用實際測量“校正”預(yù)測。在更新步驟中,我們采用預(yù)期狀態(tài),我們計算輸出(使用測量模型)(2),并將其與實際測量的輸出進行比較。然后,我們以“智能方式”使用兩者之間的差異來校正狀態(tài)估計(3)。
          通常,我們在校正之前用apex -表示狀態(tài)的估計,它來自于預(yù)測步驟。K是卡爾曼增益。這就是巧妙之處:K取決于我們對度量的信任程度,取決于我們對當(dāng)前估計的信任程度(這取決于我們對模型的信任程度),根據(jù)這些信息,K“決定”預(yù)測的估計在多大程度上被測量糾正。如果我們的測量噪聲與我們對來自預(yù)測步驟的估計的信任程度相比是“小”的,我們將使用測量對估計進行大的校正,如果相反,我們將對其進行最小程度的校正。
          注意:為簡單起見,我寫方程式時就好像在處理普通變量一樣,但是你必須考慮到在每一步中我們都在處理隨機的高斯變量,因此我們還需要通過函數(shù)傳播變量的協(xié)方差,而不僅僅是均值。
          讓我們舉例說明。假設(shè)我們正在(再次)跟蹤一個機器人的位置。實際位置顯示為灰色,k時刻我們認(rèn)為機器人處于綠色位置,估計協(xié)方差表示為一個橢圓。粗略地說,你可以從橢圓的形狀看出,我們的過濾器在這一步對橫向定位比在向前運動方向的定位更“自信”。在使用狀態(tài)轉(zhuǎn)換模型讓系統(tǒng)演進的預(yù)測步驟之后,我們認(rèn)為新的位置是紅色的。由于橢圓在橫向上變大了,我們現(xiàn)在對新的估計位置不太確定(例如,因為我們不太相信模型)。然后我們讀取GPS,得到黑色的位置。在更新步驟中,實際的位置估計將是深綠色的虛線部分。如果我們更信任模型(與測量噪聲協(xié)方差相比,協(xié)方差更小),估計值將更接近紅色;如果我們更信任測量(與模型不確定性相比,噪聲測量協(xié)方差更小),估計值將更接近紅色。

          KF家族

          根據(jù)所使用的模型類型(狀態(tài)轉(zhuǎn)換和測量),可以將KF分為兩個大類:如果模型是線性的,則具有線性卡爾曼濾波器,而如果它們是非線性的,則具有非線性卡爾曼濾波器。
          為什么要區(qū)分?好吧,KF假設(shè)你的變量是高斯變量,當(dāng)通過線性函數(shù)傳遞時,高斯變量仍然是高斯變量,如果通過非線性函數(shù)傳遞,則不正確。這打破了卡爾曼假設(shè),因此我們需要找到解決方法。
          歷史上,人們發(fā)現(xiàn)了兩種主要的方法:利用模型作弊和利用數(shù)據(jù)作弊。如果你在模型上做了弊你基本上是將當(dāng)前估計周圍的非線性函數(shù)線性化,這樣你就回到了線性的情況下。這種方法稱為擴展卡爾曼濾波(EKF)。這種方法的主要缺點是必須能夠計算f()和h()的雅可比矩陣?;蛘撸绻阍跀?shù)據(jù)上作弊,你使用非線性函數(shù),然后你嘗試“高斯化”(如果這個詞存在的話)你做出的非高斯分布。這是通過一種叫做無損變換的智能采樣技術(shù)實現(xiàn)的。這個變換允許你用平均值和協(xié)方差來描述(近似地)一個分布(只有高斯分布才能被前兩個矩完全描述)。這種方法稱為無損卡爾曼濾波(UKF)。理論上,UKF優(yōu)于EKF,因為無損變換比線性化模型得到的近似更接近結(jié)果分布。在實踐中,你必須有相當(dāng)大的非線性才能真正看到大的區(qū)別。

          實際中的KF

          由于我談到了很多有關(guān)帶GPS的移動機器人的內(nèi)容,因此我就此情況作了簡短的演示(如果要使用它,可以在這里找到代碼)。機器人的運動是使用單輪模型生成的。用于KF的狀態(tài)轉(zhuǎn)換模型是等速模型,其狀態(tài)包含x和y位置,轉(zhuǎn)向角及其導(dǎo)數(shù)。
          機器人會及時移動(實際位置顯示為黑色),在每個步驟中,你都會得到非常嘈雜的GPS測量值,該測量值給出x和y(紅色)并估算位置(藍色)。你可以使用不同的參數(shù),看看它們?nèi)绾斡绊憼顟B(tài)估計。如你所見,我們可以進行非常嘈雜的測量,并對實際位置進行很好的估算。

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

          讓我們看一下線性KF情況下卡爾曼增益的公式,并試圖更深入地了解增益的工作原理。
          其中 ,當(dāng)前估算狀態(tài)的協(xié)方差(我們對估算的信心程度)C是測量模型的線性變換,其中y(k) = Cx(k)和R是測量噪聲的協(xié)方差矩陣。請注意,分?jǐn)?shù)符號并不是真正正確的,但是可以使發(fā)生的事情更容易可視化。
          根據(jù)等式,如果R變?yōu)?,則我們有:
          代入我們定義(3)的算法步驟,可以看到我們將完全忽略預(yù)測步驟的結(jié)果,并且使用測量模型的逆變換來獲得僅來自測量的狀態(tài)估計。
          相反,如果我們非常信任模型/估計, 則將趨于0,得出:
          因此,我們得到的最終估計與預(yù)測步長輸出相同。
          需要注意的是,我正在交替使用“信任模型”和“信任當(dāng)前估計”。他們是不一樣的但是他們是相關(guān)的,因為我們有多么信任預(yù)測的評估是我們有多信任模型(如預(yù)測步驟完成只使用模型)與我們有多么信任前一步的濾波的組合。

          獎勵2:庫

          有很多不錯的庫可以在線計算KF,這是我的一些最愛。
          作為一個GO愛好者,我將從這個非常不錯的GO庫開始,其中包含幾個預(yù)實現(xiàn)的模型:https://github.com/rosshemsley/kalman
          對于Python,你可以查看:https://pykalman.github.io/
          結(jié)論:我們深入研究了狀態(tài)估計是什么,卡爾曼濾波器的工作原理,其背后的直覺是什么,如何使用它們以及何時使用。我們介紹了一個玩具(但現(xiàn)實生活中)的問題,并介紹了如何使用卡爾曼濾波器解決該問題。然后,我們更深入地研究了Kalman濾波器在幕后的實際作用。
          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 78
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲免费AV电影 | 国产盗摄AV | 豆花视频国产原创 | 一级黄色三级黄色视频 | 亚洲精品视频在线观看免费 |