2020年5月14日 星期四

關於卡爾曼濾波器

曾在一本機器學習與 OpenCV 影像處理書籍中看到卡爾曼濾波器, 最近在關於機器人控制的文章中又讀到這名詞, 所以就花了點時間了解一下, 發現它的應用非常廣泛, 而且一個甲子過去了還是歷久彌新, 連自駕車與無人車也用上了, 參考 :

機器人運動估計算法卡爾曼濾波
卡爾曼濾波在機器人視覺領域的應用(一)
卡爾曼濾波在機器人視覺領域的應用(二)
自動駕駛基礎之——如何寫卡爾曼濾波器?

摘要如下 :

卡爾曼濾波器演算法是一種自回歸 (自適應) 預測方法, 只需要前一時刻狀態之預測值以及目前狀態之觀測值即可計算當前狀態的預測值, 不需要大量的歷史資料學習即可進行預測. 由於它能根據一組包含雜訊的不完全觀測值預測動態系統之狀態, 效率比倒傳遞神經網路高, 被廣泛應用在機器人, 信號處理, 軌跡預測, 航空器導航, 金融與計量經濟學, 以及自動控制系統等, 例如阿波羅計畫的太空船導航電腦即使用了卡爾曼濾波器.

卡爾曼濾波器以其主要貢獻者匈牙利裔的美國數學家卡爾曼  (Rudolf E. Kalman) 博士命名, 他被譽為系統理論之父 (the father of system theory). 他在 1960 年提出的兩篇論文中以狀態空間描述時變動態系統, 卡爾曼濾波器演算法的雛形於焉誕生, 不過藍德公司 (RAND) 公司的雷達專家 Peter Swerling 在 1958 年也提出過類似的演算法. 此演算法基本上就是一個帶有雜訊項的一階遞迴預測器. 首次實作出卡爾曼濾波器的是 NASA 太空專家 Stanley F. Schmidt, 並於後來的阿波羅登月計畫中被用來預測太空船之行進軌道.

卡爾曼濾波器的原理建築在線性代數與隱藏式馬可夫模型上, 所觀測的對象基本上是用一個被高斯雜訊所干擾的動態系統來描述 (稱為 first-order Gause-Markov model), 而此動態系統則可用一個隱藏式馬可夫鏈表示. 與其他濾波器不同的是, 卡爾曼濾波器是一種純粹的時域濾波器, 可在實時 (real-time) 系統中運作, 在實作上不需要先在頻域設計好後再轉換成時域, 而且除了前一狀態量外, 不需要儲存歷史資料, 適合在記憶體很小的嵌入式設備中實現, 例如 Arduino 控制器, 參考 :

一階/二階/卡爾曼濾波比較
卡尔曼滤波学习笔记
Arduino讀取MPU6050陀螺儀數據——卡爾曼濾波算法實踐
https://github.com/regishsu/arduino/blob/master/balance5/balance5.ino

卡爾曼濾波器是一個遞迴估計 (recursive estimator) 演算法, 其運作包括預測 (prediction) 與更新 (update) 這兩個步驟, 根據信號與雜訊的狀態空間模型, 在預測階段, 濾波器使用前一狀態預測值計算 (加權) 當前狀態預測值; 而在更新階段則以當前狀態的觀測值優化在預測階段獲得的預測值以獲得一個更精確的新預測值, 亦即, 卡爾曼濾波器任一時間點的預測值只與前一個預測值以及高斯雜訊項有關. 所以卡爾曼濾波器其實就是透過觀測值來重構系統的狀態向量, 不斷地進行 "預測-觀測-更新" 迭代, 根據觀測值來消除隨機雜訊干擾, 使系統從被雜訊汙染的狀態中回復本來面目.

參考 :

# 維基 : 魯道夫卡爾曼
卡爾曼濾波 (Kalman Filter)
什麼是卡爾曼濾波
使用觀測器 / 卡爾曼濾波器識別法線上預測台灣金融股票

2020-05-14 補充 :

我在一般 DSP 書上找不到卡爾曼濾波器的資料 (是因為它不是頻域濾波器的原因嗎?), 只在下面這本書的第六章找到 Kalman filter 的介紹 :

Learning Approaches in Signal Processing (參考 Table of Content)




不過在 OpenCV 的書上倒是看到蠻多應用的.

2020-05-15 補充 :

CRC 出版的 "Handbook of Signal Processing in Acoustics" 的 3.4.1 節也有介紹.

2020-05-18 補充 :

北卡羅來納州立大學的兩位資工系教授為了授課撰寫了一本卡爾曼濾波器的小書, 從機率統計開始扼要講述基本原理, 到線性卡爾曼與擴展卡爾曼濾波器, 很值得參考 :

http://www.cs.unc.edu/~tracker/media/pdf/SIGGRAPH2001_CoursePack_08.pdf

他們還整理了卡爾曼濾波器的參考資料於下列網頁 :

http://www.cs.unc.edu/~welch/kalman/

另外母校有一本原文書也不錯 :

The Kalman filter in finance

下面這篇最吸引我興趣, 介紹無人機飛航控制 (MATLAB) :

Introduction to Aerial Robotics-States Estimates and Coding Examples

下面這篇則是以實例解釋卡爾曼濾波器應用 :

Kalman Filter Applications

下面這篇以 Python 語法實作卡爾曼濾波器 :

Kalman Filters: A step by step implementation guide in python

4 則留言 :

Olina 歐莉娜 提到...

您這句摘要:「卡爾曼濾波器演算法是一種自回歸 (自適應) 預測方法, 只需要前一時刻狀態之預測值以及目前狀態之觀測值即可計算當前狀態的預測值, 不需要大量的歷史資料學習即可進行預測. 」 讓我立刻想到這個濾波器怎麼沒有用在股市線上頭....

小狐狸事務所 提到...

有的, 非常多論文以此為工具, 不知道績效好不好而已, 有待進一步研究.

匿名 提到...

約10年前有使用過kalman filter,
記得它有使用在GPS導航中,
例如早期導航有時沒收到衛星信號或信號受雜訊干擾, 會使車輛顯示跳動或方向錯誤,
會讓使用者覺得系統不穩定, 則kalman filter因有短期記憶性可用之前的位置來預測下一個位置,
簡單的抹除不穩定跳動與增加慣性方向平穩度

而當初自己主要是用在AR應用中,
因為計算出的背景移動量可能會誤判,
導致貼上去的AR影像會跳動, 所以貼影像前將位置資訊過一層kalman filter,
使位置資訊較smooth, 讓使用者不會覺得AR物件與真實背景間互動很突兀

不過因為是約10年前的印象, 供約略參考

小狐狸事務所 提到...

感謝您寶貴的意見, 可幫助我將來進一步探索