卡爾曼濾波

本文是國外博主Bzarg在2015年寫的一篇圖解烦秩。雖然是幾年前的文章撤奸,但是動態(tài)定位诡壁、自動導航麸锉、時間序列模型晶府、衛(wèi)星導航——卡爾曼濾波的應用范圍依然非常廣堪置。

什么是卡爾曼濾波沐绒?

對于這個濾波器犁柜,我們幾乎可以下這么一個定論:只要是存在不確定信息的動態(tài)系統(tǒng)剖毯,卡爾曼濾波就可以對系統(tǒng)下一步要做什么做出有根據的推測圾笨。即便有噪聲信息干擾,卡爾曼濾波通常也能很好的弄清楚究竟發(fā)生了什么逊谋,找出現象間不易察覺的相關性擂达。因此卡爾曼濾波非常適合不斷變化的系統(tǒng),它的優(yōu)點還有內存占用較薪鹤獭(只需保留前一個狀態(tài))板鬓、速度快悲敷,是實時問題和嵌入式系統(tǒng)的理想選擇。

本文會用大量清晰俭令、美觀的圖片和顏色來解釋這個概念镀迂,讀者只需具備概率論和矩陣的一般基礎知識。

我們能用卡爾曼濾波做什么唤蔗?

讓我們舉個例子:你造了一個可以在樹林里四處溜達的小機器人探遵,為了讓它實現導航,機器人需要知道自己所處的位置妓柜。

image

也就是說箱季,機器人有一個包含位置信息和速度信息的狀態(tài){\vec x_k}:

{\vec x_k} = \left( {\vec p,\vec v} \right)

注意,在這個例子中棍掐,狀態(tài)是位置和速度藏雏,放進其他問題里,它也可以是水箱里的液體體積作煌、汽車引擎溫度掘殴、觸摸板上指尖的位置,或者其他任何數據粟誓。

我們的小機器人裝有GPS傳感器奏寨,定位精度10米。雖然一般來說這點精度夠用了鹰服,但我們希望它的定位誤差能再小點病瞳,畢竟樹林里到處都是土坑和陡坡,如果機器人稍稍偏了那么幾米悲酷,它就有可能滾落山坡套菜。所以GPS提供的信息還不夠充分。

image

我們也可以預測機器人是怎么移動的:它會把指令發(fā)送給控制輪子的馬達设易,如果這一刻它始終朝一個方向前進逗柴,沒有遇到任何障礙物,那么下一刻它可能會繼續(xù)堅持這個路線顿肺。但是機器人對自己的狀態(tài)不是全知的:它可能會逆風行駛戏溺,輪子打滑,滾落顛簸地形……所以車輪轉動次數并不能完全代表實際行駛距離挟冠,基于這個距離的預測也不完美于购。

這個問題下,GPS為我們提供了一些關于狀態(tài)的信息知染,但那是間接的肋僧、不準確的;我們的預測提供了關于機器人軌跡的信息,但那也是間接的嫌吠、不準確的止潘。

但以上就是我們能夠獲得的全部信息,在它們的基礎上辫诅,我們是否能給出一個完整預測凭戴,讓它的準確度比機器人搜集的單次預測匯總更高?用了卡爾曼濾波炕矮,這個問題可以迎刃而解么夫。

卡爾曼濾波眼里的機器人問題

還是上面這個問題,我們有一個狀態(tài)肤视,它和速度档痪、位置有關:

{\vec x_k} = \left[ {\begin{array}{*{20}{c}} p \\ v \end{array}} \right]

我們不知道它們的實際值是多少,但掌握著一些速度和位置的可能組合邢滑,其中某些組合的可能性更高:

image

卡爾曼濾波假設兩個變量(在我們的例子里是位置和速度)都應該是隨機的腐螟,而且符合高斯分布。每個變量都有一個均值\mu 困后,它是隨機分布的中心乐纸;有一個方差{\sigma ^2} ,它衡量組合的不確定性摇予。

image

在上圖中汽绢,位置和速度是不相關的,這意味著我們不能從一個變量推測另一個變量趾盐。那么如果位置和速度相關呢庶喜?如下圖所示,機器人前往特定位置的可能性取決于它擁有的速度救鲤。

image

這不難理解,如果基于舊位置估計新位置秩冈,我們會產生這兩個結論:如果速度很快本缠,機器人可能移動得更遠,所以得到的位置會更遠入问;如果速度很慢丹锹,機器人就走不了那么遠。

這種關系對目標跟蹤來說非常重要芬失,因為它提供了更多信息:一個可以衡量可能性的標準楣黍。這就是卡爾曼濾波的目標:從不確定信息中擠出盡可能多的信息!

為了捕獲這種相關性棱烂,我們用的是協(xié)方差矩陣租漂。簡而言之,矩陣的每個值是第i個變量和第j個變量之間的相關程度(由于矩陣是對稱的, ij的位置可以隨便交換)哩治。我們用 \Sigma表示協(xié)方差矩陣秃踩,在這個例子中,就是{\Sigma _{ij}}

image

用矩陣描述問題

為了把以上關于狀態(tài)的信息建模為高斯分布(圖中色塊)业筏,我們還需要 k時的兩個信息:最佳估計{\hat x_k}(均值憔杨,也就是 \mu),協(xié)方差矩陣 P_k蒜胖。(雖然還是用了位置和速度兩個變量消别,但只要和問題相關,卡爾曼濾波可以包含任意數量的變量)

{\hat x_k} = \left[ {\begin{array}{*{20}{c}} {position} \\ {velocity} \end{array}} \right]
{P_k} = \left[ {\begin{array}{*{20}{c}} {{\Sigma _{pp}}}&{{\Sigma _{pv}}} \\ {{\Sigma _{vp}}}&{{\Sigma _{vv}}} \end{array}} \right]

接下來台谢,我們要通過查看當前狀態(tài)(k-1時)來預測下一個狀態(tài)(k時)妖啥。這里我們查看的狀態(tài)不是真值,但預測函數無視真假对碌,可以給出新分布:

image

我們可以用矩陣F_k表示這個預測步驟:

image

它從原始預測中取每一點荆虱,并將其移動到新的預測位置。如果原始預測是正確的朽们,系統(tǒng)就會移動到新位置怀读。這是怎么做到的?為什么我們可以用矩陣來預測機器人下一刻的位置和速度骑脱?下面是個簡單公式:

{p_k} = {p_{k - 1}} + \Delta t{v_{k - 1}}
{v_k} = {v_{k - 1}}

換成矩陣形式:

\begin{gathered} {{\hat x}_k} = \left[ {\begin{array}{*{20}{c}} 1&{\Delta t} \\ 0&1 \end{array}} \right]{{\hat x}_{k - 1}} \hfill \\ = {F_k}{{\hat x}_{k - 1}} \hfill \\ \end{gathered}

這是一個預測矩陣菜枷,它能給出機器人的下一個狀態(tài),但目前我們還不知道協(xié)方差矩陣的更新方法叁丧。這也是我們要引出下面這個等式的原因:如果我們將分布中的每個點乘以矩陣A啤誊,那么它的協(xié)方差矩陣會發(fā)生什么變化?

\begin{gathered} Cov\left( x \right) = \sum \hfill \\ Cov\left( {Ax} \right) = A\sum {A^T} \hfill \\ \end{gathered}

把這個式子和上面的最佳估計{\hat x_k}結合拥娄,可得:

\begin{gathered} {{\hat x}_k} = {F_k}{{\hat x}_{k - 1}} \hfill \\ {P_k} = {F_k}{P_{k - 1}}F_k^T \hfill \\ \end{gathered}

外部影響

但是蚊锹,除了速度和位置,外因也會對系統(tǒng)造成影響稚瘾。比如模擬火車運動牡昆,除了列車自駕系統(tǒng),列車操作員可能會手動調速摊欠。在我們的機器人示例中丢烘,導航軟件也可以發(fā)出停止指令。對于這些信息些椒,我們把它作為一個向量{\vec u_k} 播瞳,納入預測系統(tǒng)作為修正。

假設油門設置和控制命令是已知的免糕,我們知道火車的預期加速度 a赢乓。根據運動學基本定理忧侧,我們可得:

\begin{gathered} {p_k} = {p_{k - 1}} + \Delta t{v_{k - 1}} + \frac{1}{2}a\Delta {t^2} \hfill \\ {v_k} = \begin{array}{*{20}{c}} {\begin{array}{*{20}{c}} {\begin{array}{*{20}{c}} {}&{} \end{array}}&{} \end{array}}&{{v_{k - 1}} + a\Delta t} \end{array} \hfill \\ \end{gathered}

把它轉成矩陣形式:

\begin{gathered} {{\hat x}_k} = {F_k}{{\hat x}_{k - 1}} + \left[ {\begin{array}{*{20}{c}} {\frac{{\Delta {t^2}}}{2}} \\ {\Delta t} \end{array}} \right]a \hfill \\ \begin{array}{*{20}{c}} {}&{ = {F_k}{{\hat x}_{k - 1}} + {B_k}{{\vec u}_k}} \end{array} \hfill \\ \end{gathered}

{{B_k}}是控制矩陣,{{{\vec u}_k}}是控制向量骏全。如果外部環(huán)境異常簡單苍柏,我們可以忽略這部分內容,但是如果添加了外部影響后姜贡,模型的準確率還是上不去试吁,這又是為什么呢?

外部不確定性

當我們監(jiān)控無人機時楼咳,它可能會受到風的影響熄捍;當我們跟蹤輪式機器人時,它的輪胎可能會打滑母怜,或者粗糙地面會降低它的移速余耽。這些因素是難以掌握的,如果出現其中的任意一種情況苹熏,預測結果就難以保障碟贾。

image

如上圖所示,加上外部不確定性后轨域, {\hat x_{k - 1}}的每個預測狀態(tài)都可能會移動到另一點袱耽,也就是藍色的高斯分布會移動到紫色高斯分布的位置,并且具有協(xié)方差Q_k干发。換句話說朱巨,我們把這些不確定影響視為協(xié)方差Q_k 的噪聲。

image

這個紫色的高斯分布擁有和原分布相同的均值枉长,但協(xié)方差不同冀续。

image

我們在原式上加Q_k

\begin{gathered} {{\hat x}_k} = {F_k}{{\hat x}_{k - 1}} + {B_k}{{\vec u}_k} \hfill \\ {P_k} = {F_k}{P_{k - 1}}F_k^T + {Q_k} \hfill \\ \end{gathered}

簡而言之,
新的最佳估計是基于原最佳估計已知外部影響校正后得到的預測必峰。
新的不確定性是基于原不確定性已知外部影響得到的預測洪唐。

現在,有了這些概念介紹自点,我們可以把傳感器數據輸入其中桐罕。

通過測量來細化估計值

我們可能有好幾個傳感器,它們一起提供有關系統(tǒng)狀態(tài)的信息桂敛。傳感器的作用不是我們關心的重點,它可以讀取位置溅潜,可以讀取速度术唬,重點是,它能告訴我們關于狀態(tài)的間接信息——它是狀態(tài)下產生的一組讀數滚澜。

image

請注意粗仓,讀數的規(guī)模和狀態(tài)的規(guī)模不一定相同,所以我們把傳感器讀數矩陣設為 H_k

image

把這些分布轉換為一般形式:

\begin{gathered} {{\vec \mu }_{\exp ected}} = {H_k}{{\hat x}_k} \hfill \\ {\Sigma _{\exp ected}} = {H_k}{P_k}H_k^T \hfill \\ \end{gathered}

卡爾曼濾波的一大優(yōu)點是擅長處理傳感器噪聲借浊。換句話說塘淑,由于種種因素,傳感器記錄的信息其實是不準的蚂斤,一個狀態(tài)事實上可以產生多種讀數存捺。

image

我們將這種不確定性(即傳感器噪聲)的協(xié)方差設為R_k,讀數的分布均值設為z_k ∈镎簦現在我們得到了兩塊高斯分布捌治,一塊圍繞預測的均值,另一塊圍繞傳感器讀數纽窟。

image

如果要生成靠譜預測肖油,模型必須調和這兩個信息。也就是說臂港,對于任何可能的讀數(z_1,z_2) 森枪,這兩種方法預測的狀態(tài)都有可能是準的,也都有可能是不準的审孽。重點是我們怎么找到這兩個準確率县袱。

最簡單的方法是兩者相乘

image

兩塊高斯分布相乘后,我們可以得到它們的重疊部分瓷胧,這也是會出現最佳估計的區(qū)域显拳。換個角度看,它看起來也符合高斯分布:

image

事實證明搓萧,當你把兩個高斯分布和它們各自的均值和協(xié)方差矩陣相乘時杂数,你會得到一個擁有獨立均值和協(xié)方差矩陣的新高斯分布。最后剩下的問題就不難解決了:我們必須有一個公式來從舊的參數中獲取這些新參數瘸洛!

結合高斯

讓我們從一維看起揍移,設方差為{\sigma ^2},均值為\mu反肋,一個標準一維高斯鐘形曲線方程如下所示:

{\rm N}\left( {x,\mu ,\sigma } \right) = \frac{1}{{\sigma \sqrt {2\pi } }}{e^{ - \frac{{{{\left( {x - \mu } \right)}^2}}}{{2{\sigma ^2}}}}}

那么兩條高斯曲線相乘呢那伐?

image

{\rm N}\left( {x,{\mu _0},{\sigma _0}} \right) \cdot {\rm N}\left( {x,{\mu _1},{\sigma _1}} \right) = {\rm N}\left( {x,\mu ',\sigma '} \right)

把這個式子按照一維方程進行擴展,可得:

\begin{gathered} \mu ' = {\mu _0} + \frac{{\sigma _0^2\left( {{\mu _1} - {\mu _0}} \right)}}{{\sigma _0^2 + \sigma _1^2}} \hfill \\ \sigma {'^2} = \sigma _0^2 - \frac{{\sigma _0^4}}{{\sigma _0^2 + \sigma _1^2}} \hfill \\ \end{gathered}

如果有些太復雜石蔗,我們用k簡化一下:

\begin{gathered} k = \frac{{\sigma _0^2}}{{\sigma _0^2 + \sigma _1^2}} \hfill \\ \mu ' = {\mu _0} + k\left( {{\mu _1} - {\mu _0}} \right) \hfill \\ \sigma {'^2} = \sigma _0^2 - k\sigma _0^2 \hfill \\ \end{gathered}

以上是一維的內容罕邀,如果是多維空間,把這個式子轉成矩陣格式:

\begin{gathered} K = {\Sigma _0}\left( {{\Sigma _0} + {\Sigma _1}} \right) \hfill \\ \vec \mu ' = {{\vec \mu }_0} + K\left( {{{\vec \mu }_1} - {{\vec \mu }_0}} \right) \hfill \\ \Sigma ' = {\Sigma _0} - K{\Sigma _0} \hfill \\ \end{gathered}

這個矩陣K就是我們說的卡爾曼增益 !!

把它們結合在一起

截至目前养距,我們有用矩陣\left( {{\mu _0},{\Sigma _0}} \right) = \left( {{H_k}{{\hat x}_k},{H_k}{P_k}H_k^T} \right)預測的分布诉探,有用傳感器讀數 \left( {{\mu _1},{\Sigma _1}} \right) = \left( {{{\vec z}_k},{R_k}} \right)預測的分布。把它們代入上節(jié)的矩陣等式中

\begin{gathered} {H_k}\hat x{'_k} = {H_k}{{\hat x}_k} + K\left( {{{\vec z}_k} - {H_k}{{\hat x}_k}} \right) \hfill \\ {H_k}P{'_k}H_k^T = {H_k}{P_k}H_k^T - K{H_k}{P_k}H_k^T \hfill \\ \end{gathered}

相應的棍厌,卡爾曼增益就是:

K = {H_k}{P_k}H_k^T{\left( {{H_k}{P_k}H_k^T + {R_k}} \right)^{ - 1}}

考慮到 K里還包含著一個H_k肾胯,我們再精簡一下上式:

\begin{gathered} \hat x{'_k} = {{\hat x}_k} + K'\left( {{{\vec z}_k} - {H_k}{{\hat x}_k}} \right) \hfill \\ P{'_k} = {P_k} - K'{H_k}{P_k} \hfill \\ K' = {P_k}H_k^T{\left( {{H_k}{P_k}H_k^T + {R_k}} \right)^{ - 1}} \hfill \\ \end{gathered}

最后竖席,\hat x{'_k}是我們的最佳估計值,我們可以把它繼續(xù)放進去做另一輪預測:

image

參考鏈接

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末敬肚,一起剝皮案震驚了整個濱河市毕荐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌艳馒,老刑警劉巖憎亚,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異鹰溜,居然都是意外死亡虽填,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門曹动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斋日,“玉大人,你說我怎么就攤上這事墓陈《袷兀” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵贡必,是天一觀的道長兔港。 經常有香客問我,道長仔拟,這世上最難降的妖魔是什么衫樊? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮利花,結果婚禮上科侈,老公的妹妹穿的比我還像新娘。我一直安慰自己炒事,他們只是感情好臀栈,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挠乳,像睡著了一般权薯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睡扬,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天盟蚣,我揣著相機與錄音,去河邊找鬼卖怜。 笑死刁俭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的韧涨。 我是一名探鬼主播牍戚,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虑粥!你這毒婦竟也來了如孝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤娩贷,失蹤者是張志新(化名)和其女友劉穎第晰,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體彬祖,經...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡茁瘦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了储笑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甜熔。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖突倍,靈堂內的尸體忽然破棺而出腔稀,到底是詐尸還是另有隱情,我是刑警寧澤羽历,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布焊虏,位于F島的核電站,受9級特大地震影響秕磷,放射性物質發(fā)生泄漏诵闭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一澎嚣、第九天 我趴在偏房一處隱蔽的房頂上張望疏尿。 院中可真熱鬧,春花似錦币叹、人聲如沸润歉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踩衩。三九已至,卻和暖如春贩汉,著一層夾襖步出監(jiān)牢的瞬間驱富,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工匹舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褐鸥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓赐稽,卻偏偏與公主長得像叫榕,于是被迫代替她去往敵國和親浑侥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容