卡爾曼濾波介紹孙乖,推導戒幔,實例和應(yīng)用

參考鏈接:

這篇復制粘貼了網(wǎng)上很多講卡爾曼的文章:

https://blog.csdn.net/App_12062011/article/details/51758989

這篇是卡爾曼濾波的opencv實例:

https://www.cnblogs.com/21207-iHome/p/5238242.html

tracking的傳統(tǒng)方法的綜述:幾年前的:

?https://zhuanlan.zhihu.com/p/32453407

OpenCV寫代碼:

https://blog.csdn.net/gdfsg/article/details/50904811

MATLAB相關(guān)的卡爾曼濾波:

https://www.mathworks.com/help/vision/examples/using-kalman-filter-for-object-tracking.html#d117e5368

https://blog.csdn.net/Kerrwy/article/details/81120259

零吠谢、引入

參考網(wǎng)站:http://www.reibang.com/p/d51a3a7736ca

假設(shè)我們要研究的對象是一個房間的溫度。根據(jù)你的經(jīng)驗判斷诗茎,這個房間的溫度是恒定的囊卜,也就是下一分鐘的溫度等于現(xiàn)在這一分鐘的溫度(假設(shè)我們用一分鐘來做時間單位)。假設(shè)你對你的經(jīng)驗不是100%的相信错沃,可能會有上下偏差幾度栅组。我們把這些偏差看成是高斯白噪聲(White Gaussian Noise),也就是這些偏差跟前后時間是沒有關(guān)系的而且符合高斯分布(Gaussian Distribution)枢析。另外玉掸,我們在房間里放一個溫度計,但是這個溫度計也不準確的醒叁,測量值會比實際值偏差司浪。我們也把這些偏差看成是高斯白噪聲。

好了把沼,現(xiàn)在對于某一分鐘我們有兩個有關(guān)于該房間的溫度值:你根據(jù)經(jīng)驗的預測值(系統(tǒng)的預測值)和溫度計的值(測量值)啊易。下面我們要用這兩個值結(jié)合他們各自的噪聲來估算出房間的實際溫度值。

假如我們要估算k時刻的實際溫度值饮睬。首先你要根據(jù)k-1時刻的溫度值租谈,來預測k時刻的溫度。因為你相信溫度是恒定的捆愁,所以你會得到k時刻的溫度預測值是跟k-1時刻一樣的割去,假設(shè)是23度,同時該值的高斯噪聲的偏差是5度(5是這樣得到的:如果k-1時刻估算出的最優(yōu)溫度值的偏差是3昼丑,你對自己預測的不確定度是4度呻逆,他們平方相加再開方,就是5)菩帝。然后咖城,你從溫度計那里得到了k時刻的溫度值,假設(shè)是25度呼奢,同時該值的偏差是4度宜雀。

由于我們用于估算k時刻的實際溫度有兩個溫度值,分別是23度和25度控妻。究竟實際溫度是多少呢州袒?相信自己還是相信溫度計呢揭绑?究竟相信誰多一點弓候,我們可以用他們的covariance來判斷郎哭。因為Kg=52/(52+4^2),所以Kg=0.61菇存,我們可以估算出k時刻的實際溫度值是:23+0.61(25-23)=24.22度夸研。可以看出依鸥,因為溫度計的covariance比較泻ブ痢(比較相信溫度計),所以估算出的最優(yōu)溫度值偏向溫度計的值贱迟。

現(xiàn)在我們已經(jīng)得到k時刻的最優(yōu)溫度值了姐扮,下一步就是要進入k+1時刻,進行新的最優(yōu)估算衣吠。到現(xiàn)在為止茶敏,好像還沒看到什么自回歸的東西出現(xiàn)。對了缚俏,在進入k+1時刻之前惊搏,我們還要算出k時刻那個最優(yōu)值(24.22度)的偏差。算法如下:((1-Kg)

52)0.5=3.12忧换。這里的5就是上面的k時刻你預測的那個23度溫度值的偏差恬惯,得出的3.12就是進入k+1時刻以后k時刻估算出的最優(yōu)溫度值的偏差(對應(yīng)于上面的3)。

就是這樣亚茬,卡爾曼濾波器就不斷的把covariance遞歸酪耳,從而估算出最優(yōu)的溫度值。他運行的很快刹缝,而且它只保留了上一時刻的covariance葡兑。上面的Kg,就是卡爾曼增益(Kalman Gain)赞草。他可以隨不同的時刻而改變他自己的值讹堤,是不是很神奇!

一厨疙、公式推導和原理理解

第一個公式:

假如現(xiàn)在有一輛在路上做直線運動的小車(如下所示)洲守,該小車在 t 時刻的狀態(tài)可以用一個向量來表示,其中pt表示他當前的位置沾凄,vt表示該車當前的速度梗醇。當然,司機還可以踩油門或者剎車來給車一個加速度ut撒蟀,ut相當于是一個對車的控制量叙谨。顯然,如果司機既沒有踩油門也沒有踩剎車保屯,那么ut就等于0手负。此時車就會做勻速直線運動涤垫。

如果我們已知上一時刻 t-1時小車的狀態(tài),現(xiàn)在來考慮當前時刻t小車的狀態(tài)竟终。顯然有

易知蝠猬,上述兩個公式中,輸出變量都是輸入變量的線性組合统捶,這也就是稱卡爾曼濾波器為線性濾波器的原因所在榆芦。既然上述公式表征了一種線性關(guān)系,那么我們就可以用一個矩陣來表示它喘鸟,則有

如果另其中的

則得到卡爾曼濾波方程組中的第一條公式——狀態(tài)預測公式匆绣,而Ft就是狀態(tài)轉(zhuǎn)移矩陣,它表示我們?nèi)绾螐纳弦粻顟B(tài)來推測當前狀態(tài)什黑。而B則是控制矩陣犬绒,它表示控制量u如何作用于當前狀態(tài)。

上式中x頂上的hat表示為估計值(而非真實值)兑凿。等式左端部分的右上標“-”表示該狀態(tài)是根據(jù)上一狀態(tài)推測而來的凯力,稍后我們還將對其進行修正以得到最優(yōu)估計,彼時才可以將“-”去掉礼华。

第二個公式:

既然我們是在對真實值進行估計咐鹤,那么就理應(yīng)考慮到噪聲的影響。實踐中圣絮,我們通常都是假設(shè)噪聲服從一個0均值的高斯分布祈惶,即Noise~Guassian(0,σ)。例如對于一個一維的數(shù)據(jù)進行估計時扮匠,若要引入噪聲的影響捧请,其實只要考慮其中的方差σ即可。當我們將維度提高之后棒搜,為了綜合考慮各個維度偏離其均值的程度疹蛉,就需要引入?yún)f(xié)方差矩陣。

回到我們的例子力麸,系統(tǒng)中每一個時刻的不確定性都是通過協(xié)方差矩陣 Σ 來給出的可款。而且這種不確定性在每個時刻間還會進行傳遞暖侨。也就是說不僅當前物體的狀態(tài)(例如位置或者速度)是會(在每個時刻間)進行傳遞的梦鉴,而且物體狀態(tài)的不確定性也是會(在每個時刻間)進行傳遞的。這種不確定性的傳遞就可以用狀態(tài)轉(zhuǎn)移矩陣來表示赛糟,即(注意埃叭,這里用到了前面給出的關(guān)于協(xié)方差矩陣的性質(zhì))

但是我們還應(yīng)該考慮到摸恍,預測模型本身也并不絕對準確的,所以我們要引入一個協(xié)方差矩陣 Q 來表示預測模型本身的噪聲(也即是噪聲在傳遞過程中的不確定性)赤屋,則有

這就是卡爾曼濾波方程組中的第二條公式立镶,它表示不確定性在各個時刻間的傳遞關(guān)系壁袄。

第三個公式:

繼續(xù)我們的小汽車例子。你應(yīng)該注意到谜慌,前面我們所討論的內(nèi)容都是圍繞小汽車的真實狀態(tài)展開的。而真實狀態(tài)我們其實是無法得知的莺奔,我們只能通過觀測值來對真實值進行估計欣范。所以現(xiàn)在我們在路上布設(shè)了一個裝置來測定小汽車的位置,觀測到的值記為Y(t)令哟。而且從小汽車的真實狀態(tài)X(t)到其觀測狀態(tài)還有一個變換關(guān)系恼琼,這個變換關(guān)系我們記為h(?),而且這個h(?)還是一個線性函數(shù)屏富。此時便有:

Y(t) = h[X(t)] + V(t)

其中V(t)表示觀測的誤差晴竞。既然h(?)還是一個線性函數(shù),所以我們同樣可以把上式改寫成矩陣的形式狠半,則有

Yt=Hxt + v

就本例而言噩死,觀測矩陣 H = [1 0],這其實告訴我們x和Z(就是h[X(t)] + V(t))的維度不一定非得相同神年。在我們的例子中已维,x是一個二維的列向量,而Z(本例中即Yt)只是一個標量已日。此時當把x與上面給出的H相乘就會得出一個標量垛耳,此時得到的Y就是x中的首個元素,也就是小車的位置飘千。同樣堂鲜,我們還需要用一個協(xié)方差矩陣R來取代上述式子中的v來表示觀測中的不確定性。當然护奈,由于Z是一個一維的值缔莲,所以此時協(xié)方差矩陣R也只有一維,也就是只有一個值霉旗,即觀測噪聲之高斯分布的參數(shù)σ酌予。如果我們有很多裝置來測量小汽車的不同狀態(tài),那么Z(本例中即Yt)就會是一個包含所有觀測值的向量奖慌。

接下來要做的事情就是對前面得出的狀態(tài)估計進行修正抛虫,具體而言就是利用下面這個式子

yt為實際觀察值。

第四個公式:

前面我們提到简僧,

是根據(jù)上一狀態(tài)推測而來的建椰,那么它與“最優(yōu)”估計值之間的差距現(xiàn)在就是等式右端加號右側(cè)的部分。


表示實際觀察值與預估的觀測值之間的殘差岛马。這個殘差再乘以一個系數(shù)K就可以用來對估計值進行修正棉姐。K稱為卡爾曼系數(shù)屠列,它也是一個矩陣,它是對殘差的加權(quán)矩陣伞矩,有的資料上稱其為濾波增益陣笛洛。

定性解讀如下:

濾波增益陣首先權(quán)衡預測狀態(tài)協(xié)方差矩陣Σ 和觀測值矩陣R的大小,并以此來覺得我們是更傾向于相信預測模型還是詳細觀測模型乃坤。如果相信預測模型多一點苛让,那么這個殘差的權(quán)重就會小一點。反之亦然湿诊,如果相信觀察模型多一點狱杰,這個殘差的權(quán)重就會大一點。

不僅如此厅须,濾波增益陣還負責把殘差的表現(xiàn)形式從觀測域轉(zhuǎn)換到了狀態(tài)域仿畸。例如本題中觀測值Z(本例中即Yt)僅僅是一個一維的向量,狀態(tài) x (包含小車的位置和速度)是一個二維的向量朗和。所以在實際應(yīng)用中错沽,觀測值與狀態(tài)值所采用的描述特征或者單位都有可能不同,顯然直接用觀測值的殘差去更新狀態(tài)值是不合理的眶拉。而利用卡爾曼系數(shù)甥捺,我們就可以完成這種轉(zhuǎn)換。例如镀层,在小車運動這個例子中镰禾,我們只觀察到了汽車的位置,但K里面已經(jīng)包含了協(xié)方差矩陣sigma的信息(sigma里面就給出了速度和位置的相關(guān)性)唱逢,所以它利用速度和位置這兩個維度的相關(guān)性吴侦,從位置的殘差中推算出了速度的殘差。從而讓我們可以對狀態(tài)值 x 的兩個維度同時進行修正坞古。

詳細推導參考文獻:【1】秦永元备韧,張洪鉞,汪叔華痪枫,卡爾曼濾波與組合導航原理织堂,西北工業(yè)大學出版社? 的第35-37頁

第五個公式:

最后,還需對最優(yōu)估計值的噪聲分布進行更新奶陈。所使用的公式為


總結(jié):

至此易阳,我們便獲得了實現(xiàn)卡爾曼濾波所需的全部五個公式:

我們將這五個公式分成預測組和更新組。預測組總是根據(jù)前一個狀態(tài)來估計當前狀態(tài)吃粒。更新組則根據(jù)觀測信息來對預測信息進行修正潦俺,以期達到最優(yōu)估計之目的。

整個卡爾曼濾波的算法基本如下:

參考網(wǎng)頁:https://zhuanlan.zhihu.com/p/21692854

二、MATLAB簡單實例

當然事示,你可能困惑于卡爾曼濾波是否真的有效早像。下面利用參考文件【2】卡爾曼濾波的原理以及在MATLAB中的實現(xiàn),http://blog.csdn.net/revolver/article/details/37830675 中給出的例子來演示卡爾曼濾波的威力肖爵。這個例子模擬質(zhì)點進行勻速直線運動(速度為1)卢鹦,然后引入一個非常大的噪聲,再用卡爾曼濾波來對質(zhì)點的運動狀態(tài)進行軌跡劝堪。注意是勻速直線運動冀自,所以其中不含有控制變量(即加速度)。

%觀測值(含噪聲)

Z = (1:100);%真實值

noise = randn(1,100);

Z = Z +noise;

%狀態(tài)值的初始化

X = [0;0];%二維幅聘,代表起始時凡纳,該點的位置和速度

Sigma = [1 0 ; 0 1];%狀態(tài)轉(zhuǎn)移協(xié)方差矩陣

F = [1 1;0 1]; %delta t = 1

Q = [0.0001 0;0 0.0001];%狀態(tài)轉(zhuǎn)移協(xié)方差矩陣的噪聲矩陣

H = [1 0];

R = 1;

figure;

hold on;

for i = 1:100

? X_ = F*X;

? Sigma_ = F*Sigma*F'+Q;

? K = Sigma_*H'/(H*Sigma_*H'+R);

? %/的速度比inv快

? X = X_ +K*(Z(i) - H* X_);

? Sigma = (eye(2) - K*H)*Sigma_;

? %eye是對角線元素為1的矩陣

? plot(X(1),X(2),'.','MarkerSize',10)

? %畫點窃植,橫軸表示位置帝蒿,縱軸表示速度。

end

plot([0,100],[1,1],'r-')

結(jié)果如下:

下圖給出了上述代碼的執(zhí)行結(jié)果巷怜「鸪可見經(jīng)過最開始的幾次迭代后,質(zhì)點運動的狀態(tài)估計就回到了正確軌跡上延塑,而且估計的結(jié)果基本圍繞在真實值附近绣张,效果還是很理想的。

三关带、用MATLAB進行小球位置預測

參考網(wǎng)站:https://www.mathworks.com/help/vision/examples/using-kalman-filter-for-object-tracking.html

中文翻譯版本:https://blog.csdn.net/Kerrwy/article/details/81120259

四侥涵、用MATLAB進行多目標位置跟蹤

https://www.mathworks.com/help/vision/examples/motion-based-multiple-object-tracking.html

五、用卡爾曼濾波進行自己的數(shù)據(jù)的跟蹤

1.把待測數(shù)據(jù)通過Unet test宋雏,得到經(jīng)過Unet segment之后的分割圖

(1)用label的圖片或者segmented的圖片作為input芜飘,我暫時用tif格式的。

(2)直接下載singleball.mp4跑一下源代碼

遇到問題1:無法調(diào)用matlab自定義函數(shù)

參考網(wǎng)站:https://www.ilovematlab.cn/thread-134014-1-1.html

解決辦法:新建的時候新建錯了吧 不要新建 script文件 可以選擇新建function的 就能使用定義function了磨总。成功解決嗦明。

遇到問題2:報錯未定義變量 "utilities" 或類"utilities.videoReader"。

解決辦法:在對應(yīng)子函數(shù)的開頭加上:param = getDefaultParameters(); utilities = createUtilities(param);

遇到問題3:未定義函數(shù)或變量 'frame'蚪燕,?'detectedLocation'娶牌,。

解決辦法:global一下frame變量

遇到問題4:tracking部分第12行報錯:matlab運算符異常馆纳。

解決辦法:global utilities.foregroundMask 這樣不行

各種bug诗良。。鲁驶。累榜。。。

六壹罚、卡爾曼濾波器調(diào)參需要注意的事項

應(yīng)根據(jù)探測器的精度選擇MeasurementNoise的值葛作。 測量噪聲設(shè)置為較大的值會獲得不太精確的檢測器。 以下示例說明了錯誤配置的分段閾值的噪聲檢測猖凛。 增加測量噪聲會導致卡爾曼濾波器更多地依賴于其內(nèi)部狀態(tài)而不是輸入的測量值赂蠢,從而補償檢測噪聲。

通常辨泳,物體不會以恒定的加速度或恒定的速度移動虱岂。 您可以使用MotionNoise指定與理想運動模型的偏差量。 當您增加運動噪聲時菠红,卡爾曼濾波器更多地依賴于輸入測量而不是內(nèi)部狀態(tài)第岖。 嘗試使用MotionNoise參數(shù)進行試驗,以了解有關(guān)其效果的更多信息试溯。

七蔑滓、試試這個toolbox

https://github.com/rlabbe/filterpy

安裝:pip install filterpy

介紹:Python Kalman filtering and optimal estimation library. Implements Kalman filter, particle filter, Extended Kalman filter, Unscented Kalman filter, g-h (alpha-beta), least squares, H Infinity, smoothers, and more. Has companion book 'Kalman and Bayesian Filters in Python'.

中文翻譯在這里:https://github.com/loveuav/Kalman-and-Bayesian-Filters-in-Python

先讀設(shè)計這一章:

https://github.com/loveuav/Kalman-and-Bayesian-Filters-in-Python/blob/chinese/08-%E8%AE%BE%E8%AE%A1%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2%E5%99%A8.ipynb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遇绞,隨后出現(xiàn)的幾起案子键袱,更是在濱河造成了極大的恐慌,老刑警劉巖摹闽,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹄咖,死亡現(xiàn)場離奇詭異,居然都是意外死亡付鹿,警方通過查閱死者的電腦和手機澜汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舵匾,“玉大人俊抵,你說我怎么就攤上這事∨Τ祝” “怎么了务蝠?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烛缔。 經(jīng)常有香客問我馏段,道長,這世上最難降的妖魔是什么践瓷? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任院喜,我火速辦了婚禮,結(jié)果婚禮上晕翠,老公的妹妹穿的比我還像新娘喷舀。我一直安慰自己砍濒,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布硫麻。 她就那樣靜靜地躺著爸邢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拿愧。 梳的紋絲不亂的頭發(fā)上杠河,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音浇辜,去河邊找鬼券敌。 笑死,一個胖子當著我的面吹牛柳洋,可吹牛的內(nèi)容都是我干的待诅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼熊镣,長吁一口氣:“原來是場噩夢啊……” “哼卑雁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轧钓,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤序厉,失蹤者是張志新(化名)和其女友劉穎锐膜,沒想到半個月后毕箍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡道盏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年而柑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荷逞。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒咳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出种远,到底是詐尸還是另有隱情涩澡,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布坠敷,位于F島的核電站妙同,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膝迎。R本人自食惡果不足惜粥帚,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望限次。 院中可真熱鬧芒涡,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旱幼,卻和暖如春乎串,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速警。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工叹誉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷旧。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓长豁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忙灼。 傳聞我的和親對象是個殘疾皇子匠襟,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容