小編準時送知識到~
每天三分鐘,就學一點點~
----
濾波
關於濾波,一位自知乎大神這樣說:
一位專業課的教授給我們上課的時候,曾談到:filtering is weighting(濾波即加權)。濾波的作用就是給不同的信號分量不同的權重。最簡單的loss pass filter, 就是直接把低頻的信號給1權重,而給高頻部分0權重。對於更複雜的濾波,比如維納濾波,則要根據信號的統計知識來設計權重。從統計信號處理的角度,降噪可以看成濾波的一種。降噪的目的在於突出信號本身而抑制噪聲影響。從這個角度,降噪就是給信號一個高的權重而給噪聲一個低的權重。維納濾波就是一個典型的降噪濾波器。
卡爾曼濾波
Kalman Filter 算法,是一種遞推預測濾波算法。
Kalman Filter 提供了一種高效可計算的方法來估計過程的狀態,並使估計均方誤差最小。卡爾曼濾波器應用廣泛且功能強大:它可以估計信號的過去和當前狀態,甚至能估計將來的狀態,即使並不知道模型的確切性質。
Kalman Filter 也可以被認為是一種數據融合算法(Data fusion algorithm),已有50多年的歷史,是當今使用最重要和最常見的數據融合算法之一。Kalman Filter 的巨大成功歸功於其小的計算需求,優雅的遞歸屬性以及作為具有高斯誤差統計的一維線性系統的最優估計器的狀態。
Kalman Filter 只能減小均值為0的測量噪聲帶來的影響。只要噪聲期望為0,那麼不管方差多大,只要迭代次數足夠多,那效果都很好。反之,噪聲期望不為0,那麼估計值就還是與實際值有偏差[3]。
卡爾曼濾波到底是如何解決實際問題的呢?
我們以機器人為例介紹卡爾曼濾波的原理,我們的任務是要預測機器人的狀態,包括位置與速度,即可表示為:
某個時刻,我們不知道真實的位置與速度到底是多少,二者存在一個所有可能性的組合,大致如下圖所示。
卡爾曼濾波假設狀態所有的變量都是隨機的且都服從高斯分布,每個變量都有其對應的均值以及方差(它代表了不確定性)。
在上圖中,位置和速度是不相關(uncorrelated)的,這意味著某個變量的狀態不會告訴你其他變量的狀態是怎樣的。即,我們雖然知道現在的速度,但無法從現在的速度推測出現在的位置。但實際上並非如此,我們知道速度和位置是有關係的(correlated),這樣一來二者之間的組合關係變成了如下圖所示的情況。
這種情況是很容易發生的,例如,如果速度很快,我們可能會走得更遠,所以我們的位置會更大。如果我們走得很慢,我們就不會走得太遠。
這種狀態變量之間的關係很重要,因為它可以為我們提供更多信息:One measurement tells us something about what the others could be。
這就是卡爾曼濾波器的目標,我們希望從不確定的測量中儘可能多地獲取信息!
這種狀態量的相關性可以由協方差矩陣表示。簡而言之,矩陣的每個元素是第i個狀態變量和第j個狀態變量之間的相關度。(顯然地可以知道協方差矩陣是對稱的,這意味著交換i和j都沒關係)。
狀態建模成高斯分布(Gaussian blob,由於二維高斯分布長得像一個個小泡泡,之所以長這個樣子,可參考連結[2])。我們需要求解/估計在時間時刻的兩個信息:
狀態建模為高斯分布[2],求解時間時刻的兩個信息:最優估計和協方差矩陣
當然,這裡我們僅使用位置和速度,但是請記住狀態可以包含任意數量的變量,並且可以表示所需的任何變量。
接下來,我們需要某種方式來查看當前狀態(時刻)並預測在時刻處的狀態。請記住,我們不知道哪個狀態是「真實」狀態,但是這裡提到的預測(prediction)並不在乎這些。
我們可以用一個矩陣來表示這個預測過程:
這個矩陣將原始估計中的每個點移動到新的預測位置。
那麼問題來了,應該如何使用上述矩陣來預測下一時刻的位置和速度呢?為了闡述這個過程,我們使用了一個非常基礎的運動學公式(初中物理中就學過)進行描述:
寫成矩陣形式:
現在我們有了一個預測矩陣或者叫做狀態轉移矩陣,該矩陣可以幫助我們計算下一個時刻的狀態。但我們仍然不知道如何更新狀態的協方差矩陣,其實過程也是很簡單,如果我們將分布中的每個點乘以矩陣,那麼其協方差矩陣會發生什麼?
將公式(3)代入公式(4)我們可以得到:
不過我們並沒有考慮到所有的影響因素。可能有一些與狀態本身無關的變化——如外界因素可能正在影響系統。
例如,我們用狀態對列車的運動進行建模,如果列車長加大油門,火車就加速。同樣,在我們的機器人示例中,導航系統軟體可能會發出使車輪轉動或停止的命令。如果我們很明確地知道這些因素,我們可以將其放在一起構成一個向量,我們可以對這個量進行某些「處理」,然後將其添加到我們的預測中對狀態進行更正。
假設我們知道由於油門設置或控制命令而產生的預期加速度。根據基本運動學原理,我們可以得到下式:
寫成矩陣形式:
其中被稱為控制矩陣,被稱為控制向量。如果我們的預測並不是100%準確模型,這會發生什麼呢?
如果狀態受到外部因素進行演進,我們只要知道這些外部因素是什麼,那麼一切仍然很好。但在實際使用中,我們有時不知道的這些外部因素到底是如何被建模的。例如,我們要跟蹤四軸飛行器,它可能會隨風搖晃;如果我們跟蹤的是輪式機器人,則車輪可能會打滑,或者因地面顛簸導致其減速。我們無法跟蹤這些外部因素,如果發生任何這些情況,我們的預測可能會出錯,因為我們並沒有考慮這些因素。
通過在每個預測步驟之後添加一些新的不確定性,我們可以對與「世界」相關的不確定性進行建模(如我們無法跟蹤的事物):
這樣一來,由於新增的不確定性原始估計中的每個狀態都可能遷移到多個狀態。因為我們非常喜歡用高斯分布進行建模,此處也不例外。我們可以說的每個點都移動到具有協方差的高斯分布內的某個位置,如下圖所示:
這將產生一個新的高斯分布,其協方差不同(但均值相同):
所以呢,我們在狀態量的協方差中增加額外的協方差,所以預測階段完整的狀態轉移方程為:
換句話說:新的最佳估計是根據先前的最佳估計做出的預測,再加上對已知外部影響的校正。
新的不確定度是根據先前的不確定度做出的預測,再加上來自環境額外的不確定度。
上述過程描繪了狀態預測過程,那麼當我們從傳感器中獲取一些測量數據時會發生什麼呢?
狀態更新
假設我們有幾個傳感器,這些傳感器可以向我們提供有關系統狀態的信息。就目前而言,測量什麼量都無關緊要,也許一個讀取位置,另一個讀取速度。每個傳感器都告訴我們有關狀態的一些間接信息(換句話說,傳感器在狀態下運作並產生一組測量讀數)。
請注意,測量的單位可能與狀態量的單位不同。我們使用矩陣對傳感器的測量進行建模。
所以我們期望傳感器的度數可以被建模成如下形式:
卡爾曼濾波器的偉大之處就在於它能夠處理傳感器噪聲。換句話說,傳感器本身的測量是不準確的,且原始估計中的每個狀態都可能導致一定範圍的傳感器讀數,而卡爾曼濾波能夠在這些不確定性存在的情況下找到最優的狀態。
根據傳感器的讀數,我們會猜測系統正處於某個特定狀態。但是由於不確定性的存在,某些狀態比其他狀態更可能產生我們看到的讀數:
將這種不確定性(如傳感器噪聲)的協方差表示為,讀數的分布均值等於我們觀察到傳感器的讀數,我們將其表示為
這樣一來,有了兩個高斯分布:一個圍繞通過狀態轉移預測的平均值,另一個圍繞實際傳感器讀數。
因此,我們需要將基於預測狀態(粉紅色)的推測讀數與基於實際觀察到的傳感器讀數(綠色)進行融合。
那麼融合後最有可能的新狀態是什麼?對於任何可能的讀數,我們都有兩個相關的概率:(1)我們的傳感器讀數是的測量值的概率,以及(2)先前估計值的概率認為是我們應該看到的讀數。
如果我們有兩個概率,並且想知道兩個概率都為真的機會,則將它們相乘。因此,我們對兩個高斯分布進行了相乘處理:
兩個概率分布相乘得到的就是上圖中的重疊部分。而且重疊部分的概率分布會比我們之前的任何一個估計值/讀數都精確得多,這個分布的均值就是兩種估計最有可能配置(得到的狀態)。
事實證明,兩個獨立的高斯分布相乘之後會得到一個新的具有其均值和協方差矩陣的高斯分布!合併兩個高斯分布,首先考慮一維高斯情況:一個均值為,方差為的高斯分布的形式為:
兩個高斯曲線相乘會發生什麼。下圖中的藍色曲線表示兩個高斯總體的(未歸一化)交集:
將公式(9)代入公式(10),我們可以得到新的高斯分布的均值和方差如下所示:
其中的一小部分重寫為:
將公式(12)和(13)的矩陣形式寫在下面:
其中表示新高斯分布的協方差矩陣,是每個維度的均值,就是大名鼎鼎的「卡爾曼增益」(Kalman gain)。
預測的觀測和實際的觀測服從高斯分布,將其代入(15)得到二者的重疊區域
從公式(14)我們可以知道,卡爾曼增益是:
然後我們將公式(16)與公式(17)中的去除,同時將後面的去除,我們可以得到最終的化簡形式的更新方程:
預測
更新後的最優狀態!接下來我們可以繼續進行預測,然後更新,重複上述過程。下圖給出卡爾曼濾波信息流:
總結
對於非線性系統,我們使用擴展卡爾曼濾波器,該濾波器通過簡單地線性化預測和測量值的均值進行工作。
記住所有知識或許不容易,但是能記得運行已經實屬不易。
這裡是為你搜小知識~
每天學一點,不可貪杯哦
歡迎留言你想了解的內容。
不想錯過三分鐘學習機會,請關注吧~
參考資料
[1]: How a Kalman filter works, in pictures, 圖解卡爾曼濾波是如何工作的:http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/#mathybits[2]: A geometric interpretation of the covariance matrix, 協方差矩陣的幾何解釋: https://www.visiondummy.com/2014/04/geometric-interpretation-covariance-matrix[3]: Kalman Filter 卡爾曼濾波:https://sikasjc.github.io/2018/05/08/kalman_filter