视觉SLAM十四讲 第9讲 卡尔曼滤波
視覺SLAM十四講 第9講 卡爾曼濾波
- 1. 什么是卡爾曼濾波
- 2. SLAM的狀態估計
- 3. 卡爾曼濾波器的推導
- 4. 擴展卡爾曼濾波
1. 什么是卡爾曼濾波
百度百科定義:卡爾曼濾波(Kalman filtering)是一種利用線性系統狀態方程,通過系統輸入輸出觀測數據,對系統狀態進行最優估計的算法。由于觀測數據中包括系統中的噪聲和干擾的影響,所以最優估計也可以看作是濾波過程。
有簡單一點的話術來總結:
卡爾曼濾波是一種系統狀態最優估計的方法。
2. SLAM的狀態估計
在后端優化中,我們可以根據所考慮時刻(幀數)信息的多少來進行分類:
- k時刻的狀態和前面所有時刻的信息有關,甚至用未來的信息來更新,這樣的處理方式稱為“批量的(Batch)”。這種處理方式常用非線性優化方法。
- k時刻的狀態只和k-1時刻的狀態有關,即馬爾科夫性,并且是一階馬爾科夫性。這種處理方式稱為濾波器方法(卡爾曼濾波器)。
3. 卡爾曼濾波器的推導
根本思路:記住卡爾曼濾波器是對系統狀態進行最優估計的方法,且利用的是線性系統狀態方程。
第一步:狀態估計:
根據運動方程的狀態方程(式9.3),我們用貝葉斯法則,利用0到k時刻的數據來估計k時刻狀態分布:
P(xk∣x0,u1:k,z1:k)∝P(zk∣xk)P(xk∣x0,u1:k,z1:k?1)P(x_k|x_0,u_{1:k},z_{1:k})\propto P(z_k|x_k)P(x_k|x_0,u_{1:k},z_{1:k-1})P(xk?∣x0?,u1:k?,z1:k?)∝P(zk?∣xk?)P(xk?∣x0?,u1:k?,z1:k?1?)
- 正比于符號∝\propto∝的左邊即k時刻的狀態分布(后驗分布,它根據了zkz_kzk?觀測數據來求狀態,是知果求因)
- 符號右邊第一項是似然(知因求果)
- 符號右邊第二項是先驗(歷史求因)
實際上,整個式子就是如下公式:后驗∝似然×先驗后驗 \propto 似然 \times 先驗后驗∝似然×先驗
我們卡爾曼濾波器,求的就是這個式子,我們希望估計k時刻的后驗分布,那么只要求得k時刻的似然和先驗即可,整個推導過程牢記這個式子,以免在推導的過程中迷失了自己。(甚至可以粗暴的認為,卡爾曼濾波器就是一個矩陣A,假設k-1時刻的后驗為x,通過Ax=b我們就求得的k時刻的后驗分布b。)
然后,我們將先驗以xk?1x_{k-1}xk?1?時刻為條件概率展開:
x時刻的先驗:(下面為了簡便用A、B表示)
P(xk∣x0,u1:k,z1:k?1)=P(A∣B)=∫P(A∣B,xk?1)P(xk?1∣B)dxk?1P(x_k|x_0,u_{1:k},z_{1:k-1}) = P(A|B)=\int P(A|B,x_{k-1})P(x_{k-1}|B)dx_{k-1}P(xk?∣x0?,u1:k?,z1:k?1?)=P(A∣B)=∫P(A∣B,xk?1?)P(xk?1?∣B)dxk?1?
然后我們再假設馬爾科夫性,簡化這個式子,會得到一個抽象關系式:
x時刻的先驗=k時刻的運動方程×(k?1)時刻的狀態分布(后驗)x時刻的先驗 = k時刻的運動方程 \times (k-1)時刻的狀態分布(后驗)x時刻的先驗=k時刻的運動方程×(k?1)時刻的狀態分布(后驗)
這兩步想說明的是,我們實際在做的是“如何把k-1時刻的狀態分布推導至k時刻”,即我們用k-1時刻的后驗分布,計算k時刻的先驗,最后求得k時刻的后驗(狀態分布)。我們只要維護一個狀態量(后驗),對它不斷迭代和更新即可。
后面的證明不會用到這兩步。只需要知道,我們假設k-1時刻的后驗已知,后驗分布均值為x^k?1\hat{x}_{k-1}x^k?1?,后驗分布協方差為P^k?1\hat{P}_{k-1}P^k?1?
第二步:線性高斯系統
我們知道卡爾曼濾波器利用的是線性系統狀態方程,所以我們要假設運動方程和觀測方程可以用線性方程描述:
{xk=Akxk?1+uk+wkzk=Ckxk+vkk=1,...,N\begin{cases}x_k=A_kx_{k-1}+u_k+w_k \\ z_k = C_kx_k+v_k\end{cases} k=1,...,N{xk?=Ak?xk?1?+uk?+wk?zk?=Ck?xk?+vk??k=1,...,N
這里的噪聲服從零矩陣高斯分布wk~N(0,R).vk~N(0,Q)w_k \sim N(0,R). \ \ v_k \sim N(0,Q)wk?~N(0,R).??vk?~N(0,Q)
實際上,運動方程這里隱藏的信息是:k時刻的先驗=k-1時刻的后驗的線性映射
第三步:預測
預測,意思是如何從上一個時刻的狀態(即后驗,假設已知),根據輸入信息(有噪聲,服從高斯分布)推斷當前時刻的狀態分布(先驗)。然后根據線性方程即運動方程和附錄A.3(高斯系統復合即加、乘之后的均值和協方差的變化情況),可以將k時刻的先驗分布求出來:
P(xk∣x0,u1:k,z1:k?1)=N(Akx^k?1+uk,AkP^k?1Ak?+R)P(x_k|x_0,u_{1:k},z_{1:k-1})=N(A_k\hat{x}_{k-1}+u_k,A_k\hat{P}_{k-1}A^\top_k + R)P(xk?∣x0?,u1:k?,z1:k?1?)=N(Ak?x^k?1?+uk?,Ak?P^k?1?Ak??+R)
我們記預測的兩個式子為預測:(k時刻的先驗=線性k-1時刻的后驗)
xˇk=Akx^k?1+uk,Pˇk=AkP^k?1Ak?+R\check{x}_k = A_k\hat{x}_{k-1}+uk, \ \ \check{P}_k=A_k\hat{P}_{k-1}A^\top_k+Rxˇk?=Ak?x^k?1?+uk,??Pˇk?=Ak?P^k?1?Ak??+R
第四步:卡爾曼增益和后驗分布的推導
P(zk∣xk)=N(Ckxk,Q)P(z_k|x_k)=N(C_kx_k,Q)P(zk?∣xk?)=N(Ck?xk?,Q)
至于這里為什么協方差不是附錄4.3中的形式即CkP^kCk?+QC_k\hat{P}_kC^\top_k+QCk?P^k?Ck??+Q,這個問題,博客zkk9527給出了解釋。而我的理解是,回顧整個推導過程,xkx_kxk?(既不是后驗也不是先驗)的作用是作為一個參考量,我們利用與xkx_kxk?相關的一次項系數和二次項系數來求得預測和卡爾曼增益。它不存在于我們最后的卡爾曼濾波器5個公式中,所以這里的xkx_kxk?是一個定值,如果是定值則沒有協方差之說,而均值就等于它本身。
N(x^k,P^k)=ηN(Ckxk,Q)?N(xˇk,Pˇk)N(\hat{x}_k,\hat{P}_k)=\eta N(C_kx_k,Q)\cdot N(\check{x}_k,\check{P}_k)N(x^k?,P^k?)=ηN(Ck?xk?,Q)?N(xˇk?,Pˇk?)
(回顧書上P236式9.5中的貝葉斯公式,分母evidence即P(A∣B)=P(B∣A)P(A)P(B)P(A|B)=\frac{P(B|A)P(A)}{P(B)}P(A∣B)=P(B)P(B∣A)P(A)?中的P(B)P(B)P(B)被省略掉了,所以等式用了正比于符號∝\propto∝表示。而后推導出兩邊高斯分布的均值和協方差后,又把正比于符號用等號代替,增加了一個比例系數η\etaη,那么嚴格來說這里的η\etaη,就是前面的evidence的倒數,即使知道了這個,書上的推導還是假設了兩邊的因子相等,不知道為什么)
所以接下來我們把指數部分展開:
至此,我們已經推導了卡爾曼濾波器的整個過程。再來總結一下,卡爾曼濾波器推導后有5個公式(2個預測即先驗的均值和協方差,1個卡爾曼增益,還有2個即后驗分布的均值和協方差):
- 預測:
- xˇk=Akx^k?1,Pˇk=AkP^k?1Ak?+R\check{x}_k=A_k\hat{x}_{k-1}, \ \ \check{P}_k=A_k\hat{P}_{k-1}A^\top_k + Rxˇk?=Ak?x^k?1?,??Pˇk?=Ak?P^k?1?Ak??+R
- 更新
- 卡爾曼增益:
- K=PˇkCk?(CkPˇkCk?+Qk)?1K=\check{P}_kC^\top_k(C_k\check{P}_kC^\top_k+Q_k)^{-1}K=Pˇk?Ck??(Ck?Pˇk?Ck??+Qk?)?1
- 后驗:
- x^k=xˇk+K(zk?Ckxˇk)\hat{x}_k=\check{x}_k+K(z_k-C_k\check{x}_k)x^k?=xˇk?+K(zk??Ck?xˇk?)
- P^k=(I?KCk)Pˇk\hat{P}_k = (I-KC_k)\check{P}_kP^k?=(I?KCk?)Pˇk?
- 卡爾曼增益:
如何更好的記憶呢?
k時刻的先驗和k-1時刻的后驗成線性映射;k時刻后驗的均值等于先驗均值加上一個卡爾曼增益和觀測誤差的乘積。
卡爾曼的濾波全部推導完了,現在我們總結一下簡化的步驟:
4. 擴展卡爾曼濾波
我們知道,卡爾曼濾波利用的是線性系統方程,而SLAM中的運動方程和觀測方程通常是非線性的,特別是加入了相機內參模型和李代數表示的位姿,更不可能是一個線性系統。一個高斯分布,經過非線性變換后,往往不再是高斯分布。
所以我們需要將卡爾曼濾波器的結果拓展到非線性系統中。處理方法是:在某個點附近考慮運動方程及觀測方程的一階泰勒展開,只保留一階項,即線性的部分。然后按照線性系統進行推導。總的來說,就是把非線性近似到線性,再利用相似的推導推導出擴展卡爾曼濾波。
流程:
總結
以上是生活随笔為你收集整理的视觉SLAM十四讲 第9讲 卡尔曼滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fastreport 直接调网络打印机_
- 下一篇: Java Servlet(一):创建工程