詳解卡爾曼濾波(Kalman Filter)原理

前言

看過很多關於卡爾曼濾波的資料,發現很多資料寫的都很晦澀,初學者很難看懂。在網上找了很多資料之後,發現了這篇博文講的非常清晰易懂,特此翻譯記錄,以備後用。爲保證翻譯的原滋原味,以下均用第一人稱表述。

背景

我不得不說一說卡爾曼濾波,因爲它能做到的事情簡直令人驚歎。

很可惜的是,很少有軟件工程師和科學家對此有深入瞭解。這讓我感到很沮喪,因爲卡爾曼濾波是如此通用且強大的工具,它能在不確定情況下組合信息。有時,它提取準確信息的能力似乎幾乎是不可思議的。如果聽起來我講的太多了,那麼請看一下之前發佈的視頻,其中演示了一個利用卡爾曼濾波觀察自由浮動物體的速度來確定它的方向。能力真強大!

卡爾曼濾波是什麼?

你可以在任何含有不確定信息的動態系統中的使用卡爾曼濾波,對系統的下一步動作做出有根據的猜測。即使伴隨着各種干擾,卡爾曼濾波總是能指出真實世界發生的情況。它可以利用怪異現象之間的關聯,你可能不會想到利用這些關聯!

卡爾曼濾波對於持續變化的系統是理想的選擇。由於卡爾曼濾波除了記憶前一個狀態而不需要保留其他的歷史記憶信息,因此卡爾曼濾波具有輕量化的特點,運行速度非常快,非常適合處理實時的問題和嵌入式系統。

你在Google上找到的大部分關於卡爾曼濾波的數學描述是晦澀難懂的。那是非常糟糕的狀況!因爲卡爾曼濾波能被簡單和容易的方式所理解的。因此,本文是一個非常不錯的文章主題,本文將嘗試用許多清晰、美觀的圖片來闡明它。 本文的前提很簡單,你僅僅需要對概率和矩陣有基本的瞭解。

我們能用卡爾曼濾波做什麼?

本文將從一個簡單的例子開始,說明卡爾曼濾波可以解決的問題。但如果你想直接接觸精美的圖片和數學,請隨時跳轉。

舉一個簡單的小例子:你已經做了一個能在叢林中游走的小機器人,爲確保其能導航,機器人需要知道它所在的位置。
在這裏插入圖片描述
將機器人的運動狀態表示爲 x k ⃗ \vec{x_k} xk ,其僅僅包含了位置和速度:

x k ⃗ = ( p ⃗ , v ⃗ ) \vec{x_k}=(\vec{p},\vec{v}) xk =(p ,v )

請注意,狀態只是關於系統底層配置的數字列表,它可以是任何東西。在我們的例子中,它是位置和速度,但它可以是油箱中液體量的數據、汽車引擎的溫度、用戶手指在觸控板上的位置或者任何你需要跟蹤的東西。

我們的機器人也有GPS傳感器,精確大約10米,但它需要更精確地知道自己的位置。在樹林中有很多溝壑和懸崖,如果機器人的誤差超過幾英尺,它可能會從懸崖上掉下去。所以僅依賴GPS進行定位是遠遠不夠的。

我們可能還知道機器人是如何移動的:機器人知道發送給車輪馬達的指令,如果它朝一個方向前進,沒有任何干擾,下一刻它可能會繼續朝同一方向前進。當然,它對自己的運動並不完全瞭解:它可能會受到風的衝擊,車輪可能會打滑,或者在崎嶇不平的地形上滾動;所以輪子轉動的數量可能不能準確地代表機器人實際行走了多遠,這個預測也不會完全準確。

GPS傳感器告訴我們一些關於狀態的信息,但只是間接的,帶有一些不確定性而且並不精準。我們的預測告訴了機器人是如何移動的,但只是間接的,並且也是不確定和不精準的。

但是,如果我們利用所有可用的信息,我們能得到一個比這兩個估計本身更好的答案嗎?當然,答案是肯定的,這就是卡爾曼濾波器的作用。

如何從卡爾曼濾波的角度看待問題?

讓我們來看看我們想要詮釋的一個場景。我們繼續上一個例子,機器人僅僅包含一個位置和速度的簡單狀態。

x ⃗ = [ p v ] \vec{x}=\begin{bmatrix} p \\ v \end{bmatrix} x =[pv]

我們不知道實際的位置和速度是什麼;有一系列可能的位置和速度組合可能是正確的,但其中一些狀態比其他的狀態更可能:

卡爾曼濾波器假設兩個變量(例子中爲位置和速度)都是隨機變量且服從高斯分佈的。隨機變量的均值爲 μ \mu μ,它表示隨機分佈的中心位置,即機器人最可能的狀態,不確定性用方差 σ 2 \sigma^2 σ2表示:

在上圖中,位置和速度是不相關的,這意味着一個變量的狀態不能推測出其他變量的狀態。

更有趣的是下面的例子:位置和速度是呈相關性的。觀察特定位置的可能性取決於你的速度:

這種情況可能會出現。例如:根據一箇舊的位置估計一個新的位置,如果速度很快,可能會走得更遠,所以位置會更遠。如果走得很慢,那麼就不會走的很遠。

這種關係非常重要,因爲它給我們提供了更多的信息:一個測量值告訴我們其他測量值可能是什麼。我們要儘可能多地從不確定的目標中壓縮卡爾曼濾波器的信息!

這種相關性被稱爲協方差矩陣。簡而言之,矩陣的每個元素 Σ i j \Sigma_{ij} Σij是第 i i i個狀態變量和 j j j個狀態變量之間的相關程度。(由於協方差矩陣是對稱的,也就是交換 i i i j j j不會影響最終的結果)。協方差矩陣往往用「 Σ \Sigma Σ」來表示,其中的元素則表示爲「 Σ i j \Sigma_{ij} Σij」。

利用矩陣描述問題

我們基於高斯分佈來建立狀態變量,所以在時間 k k k需要兩條信息:將最佳估計稱爲 x ^ k \hat{\mathbf{x}}_{\mathbf{k}} x^k(即均值 μ \mu μ)和它的協方差矩陣 P k \rm{P_k} Pk
x ^ k = [ position velocity ] P k = [ Σ p p Σ p v Σ v p Σ v v ] (1) \begin{array}{l} \hat{\mathbf{x}}_{\mathbf{k}} = \begin{bmatrix} \text{position} \\ \text{velocity} \end{bmatrix} \\ \rm{P_k} = \begin{bmatrix} \Sigma_{pp} & \Sigma_{pv} \\ \Sigma_{vp} & \Sigma_{vv} \end{bmatrix} \end{array} \tag{1} x^k=[positionvelocity]Pk=[ΣppΣvpΣpvΣvv](1)
(在這裏本文只使用了位置和速度,但是該狀態可以包含任意數量的變量,並表示任何需要表示的東西,這對於處理其他問題是非常有益的)。

接下來,我們需要某種方式來知道目前狀態(時刻 k − 1 k-1 k1)並預測下一個時刻 k k k的狀態。記住,我們不知道哪個狀態是「真實的」狀態,但我們的預測函數並不關心。它適用於所有的情況,並給出了一個新的分佈:


用矩陣 F k \mathbf{F_k} Fk表示這個估計步驟:


它將我們原始估計中的每個點都移動到了一個新的預測位置,如果原始估計是正確的話,這個新的預測位置就是系統下一步會移動到的位置。

那我們又如何用矩陣來預測下一個時刻的位置和速度呢?下面用一個基本的運動學公式來表示:
p k = p k − 1 + Δ t v k − 1 v k = v k − 1 \begin{array}{l} p_k=p_{k-1}+\Delta t v_{k-1} \\ v_k=v_{k-1} \end{array} pk=pk1+Δtvk1vk=vk1

用另一種表達方式就是:
x ^ k = [ 1 Δ t 0 1 ] x ^ k − 1 = F k x ^ k − 1 (2, 3) \begin{aligned} \hat{ \mathbf{x}}_{k} &=\left[\begin{array}{cc} 1 & \Delta t \\ 0 & 1 \end{array}\right] \hat{\mathbf{x}}_{k-1} \tag{2, 3} \\ &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1} \end{aligned} x^k=[10Δt1]x^k1=Fkx^k1(2, 3)

現在,我們有了一個預測矩陣,該矩陣提供了下一個狀態,但是我們仍然不知道如何更新協方差矩陣。

這也就是爲什麼我們需要另一個公式的原因。如果我們將分佈中的每個點乘以矩陣 A \rm{A} A,那麼其協方差矩陣 Σ \Sigma Σ會變成什麼?

對,很簡單。下面就來確認這個:
Cov ⁡ ( x ) = Σ Cov ⁡ ( A x ) = A Σ A T (4) \begin{aligned} \operatorname{Cov}(x) &=\Sigma \\ \operatorname{Cov}(\mathbf{A} x) &=\mathbf{A} \Sigma \mathbf{A}^{T} \tag{4} \end{aligned} Cov(x)Cov(Ax)=Σ=AΣAT(4)

下一步聯合公式(4)和(3):
x ^ k = F k x ^ k − 1 P k = F k P k − 1 F k T (5) \begin{array}{l} \hat{\mathbf{x}}_{k}=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1} \\ \mathbf{P}_{k}=\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_{k}^{T} \tag{5} \end{array} x^k=Fkx^k1Pk=FkPk1FkT(5)

外部控制變量

不過,我們並沒有捕捉到所有的信息,可能會有一些與狀態本身無關的變化(外部世界的改變可能會影響到這個系統)。

例如,當模擬一列火車的狀態模型時,列車駕駛員可能會踩下油門,導致列車加速。類似地,在上述的機器人例子中,導航軟件可能會發出一個命令讓車輪轉動或停止。如果我們知道這個世界上正在發生什麼的其他信息,我們可以把它填充到一個叫做 u k ⃗ \vec{u_k} uk 的向量中,用它做一些事情,然後把它加入我們的預測中進行修正。

假設我們知道由於油門設置或控制命令而產生的預期加速度$a¥。從基本運動學我們得到:
p k = p k − 1 + Δ t v k − 1 + 1 2 a Δ t 2 v k = v k − 1 + a Δ t \begin{array}{l} p_{k}=p_{k-1}+\Delta t v_{k-1}+\frac{1}{2} a \Delta t^{2} \\ v_{k}=\quad v_{k-1}+a \Delta t \end{array} pk=pk1+Δtvk1+21aΔt2vk=vk1+aΔt

其矩陣形式爲:
x ^ k = F k x ^ k − 1 + [ Δ t 2 2 Δ t ] = F k x ^ k − 1 + B k u k → (6) \begin{aligned} \hat{\mathbf{x}}_{k} &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\left[\begin{array}{c} \frac{\Delta t^{2}}{2} \\ \Delta t \end{array}\right] \\ &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\mathbf{B}_{k} \overrightarrow{\mathbf{u}_{k}} \tag{6} \end{aligned} x^k=Fkx^k1+[2Δt2Δt]=Fkx^k1+Bkuk (6)
其中 B k \rm{B_k} Bk稱爲控制矩陣(control matrix) u k ⃗ \vec{u_k} uk 控制向量(control vector)(對於沒有外部控制變量的簡單系統而言,可以忽略掉這些)。

外部干擾

讓我們再增加一個細節。如果我們的預測不是一個100%準確的模型,那會發生什麼?

如果狀態是基於自身的屬性發展的,那麼一切都是好的。如果狀態是以外力爲基礎發展起來的,只要我們知道這些外在因素是什麼,一切還是好的。

但是對於我們不知道的外在因素呢?例如:如果我們在追蹤一個四軸飛行器,它可能會受到風的衝擊;如果我們追蹤一個帶輪子的機器人,輪子可能會打滑,或者地面上的顛簸會讓它減速。我們無法跟蹤這些東西,如果這些發生了,我們的預測可能會出錯,因爲我們沒有考慮這些額外的因素。

我們可以通過在每個預測步驟之後添加一些新的不確定性,來建立與「世界」(包括我們沒有跟蹤的事物)相關的不確定性模型:

最初估計的每個狀態都有可能移動的範圍。高斯分佈非常適合這個場景, x ^ k − 1 \hat{x}_{k-1} x^k1中的每一點點都被移動到一個高斯分佈內的某個地方協方差爲 Q k \rm{Q_k} Qk。另一種說法是,我們用協方差 Q k \rm{Q_k} Qk來處理未跟蹤的噪聲的影響。

這會產生一個新的高斯分佈,因此也有了一個不同的協方差,但是均值是相同的。

只需添加 Q k \rm{Q_k} Qk即可得到擴展的協方差,以下爲預測步驟完整的表達式:
x ^ k = F k x ^ k − 1 + B k u k → P k = F k P k − 1 F k T + Q k (7) \begin{aligned} \hat{\mathbf{x}}_{k} &=\mathbf{F}_{k} \hat{\mathbf{x}}_{k-1}+\mathbf{B}_{k} \overrightarrow{\mathbf{u}_{k}} \\ \mathbf{P}_{k} &=\mathbf{F}_{\mathbf{k}} \mathbf{P}_{k-1} \mathbf{F}_{k}^{T}+\mathbf{Q}_{k} \end{aligned} \tag{7} x^kPk=Fkx^k1+Bkuk =FkPk1FkT+Qk(7)

換句話說,新的最優估計的預測來自兩個方面,即先前的最優估計加上已知外部控制量的修正。

新的不確定性是根據舊的不確定性,加上一些來自環境的附加不確定性來預測的。

好,這很簡單。我們通過 x ^ k \rm\hat{x}_k x^k P \rm{P} P k _k k對系統的位置有一個模糊的估計,當我們從傳感器得到一些數據時會發生什麼?

利用外部觀測值修正估計量

我們可能有幾個傳感器,這些傳感器可以向我們提供有關係統狀態的信息。 就目前而言,衡量什麼無關緊要; 也許一個讀取位置,另一個讀取速度。 每個傳感器都告訴我們有關狀態的一些間接信息,換句話說,傳感器在狀態下運行併產生一組數據。

注意,傳感器數據的單位和比例可能與我們所追蹤的狀態的單位和比例不一樣。你也許能猜到這是怎麼回事:我們將用矩陣對傳感器進行建模, H \rm{H} H k _k k


我們可以用通常的方式找出我們希望看到的傳感器讀數的分佈:
μ ⃗ expected  = H k x ^ k Σ expected  = H k P k H k T (8) \begin{array}{l} \vec{\mu}_{\text {expected }}=\mathbf{H}_{k} \hat{\mathbf{x}}_{k} \\ \mathbf{\Sigma}_{\text {expected }}=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} \end{array} \tag{8} μ expected =Hkx^kΣexpected =HkPkHkT(8)

卡爾曼濾波器最適合做的一件事是處理傳感器噪聲。 換句話說,我們的傳感器至少有些不可靠,並且我們原始估計中的每個狀態都可能導致傳感器讀數在一定範圍內。

從我們觀察到的每一個讀數,我們可以猜測系統處於一個特定的狀態。但由於存在不確定性,一些狀態比其他狀態更有可能產生我們看到的讀數:

我們將這種不確定性(即傳感器噪聲)的協方差稱爲 R \rm{R} R k _k k。這個分佈的平均值等於我們觀察到的讀數,我們稱之爲 z k ⃗ \vec{z_k} zk

因此,現在我們有兩個高斯分佈:一個是經過轉換得預測平均值,另一個是得到的實際傳感器讀數。

我們必須嘗試將基於預測狀態(粉紅色)的讀數猜測與基於實際觀察到的傳感器讀數(綠色)的猜測保持一致。

那麼新的最可能的狀態是什麼?對於任何可能的讀數 ( z 1 , z 2 ) (z1,z2) (z1,z2),有兩個相關的概率:(1)傳感器測量值 z k ⃗ \vec{z_k} zk ( z 1 , z 2 ) (z1,z2) (z1,z2)測量誤差的概率;(2)前一個狀態得估計值 ( z 1 , z 2 ) (z1,z2) (z1,z2)

如果這兩個概率都知道,只需要把它們相乘就能夠得到最後得結果:

剩下的重疊部分,即兩個斑點都亮、可能相同的區域,比我們之前的任何一個估算值都精確得多。 這種分佈的平均值就是兩個估計最有可能的值,是給定所有信息的最佳估計。

瞧!這個重疊的區域看起來像另一個高斯分佈。

  
  如你所見,把兩個具有不同均值和方差的高斯分佈相乘,你會得到一個新的具有獨立均值和方差的高斯分佈!下面用公式講解。

聯合高斯分佈

  先以一維高斯分佈來分析比較簡單點,具有方差 σ 2 \sigma^2 σ2 μ \mu μ的高斯曲線可以用下式表示:
N ( x , μ , σ ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 (9) \mathcal{N}(x, \mu, \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}} \tag{9} N(x,μ,σ)=σ2π 1e2σ2(xμ)2(9)

  如果把兩個服從高斯分佈的函數相乘會得到什麼呢?

N ( x , μ 0 , σ 0 ) ⋅ N ( x , μ 1 , σ 1 ) = ? N ( x , μ ′ , σ ′ ) (10) \mathcal{N}\left(x, \mu_{0}, \sigma_{0}\right) \cdot \mathcal{N}\left(x, \mu_{1}, \sigma_{1}\right) \stackrel{?}{=} \mathcal{N}\left(x, \mu^{\prime}, \sigma^{\prime}\right) \tag{10} N(x,μ0,σ0)N(x,μ1,σ1)=?N(x,μ,σ)(10)

將式(9)代入到式(10)中(注意重新歸一化,使總概率爲1)可以得到:
μ ′ = μ 0 + σ 0 2 ( μ 1 − μ 0 ) σ 0 2 + σ 1 2 σ ′ 2 = σ 0 2 − σ 0 4 σ 0 2 + σ 1 2 (11) \begin{aligned} \mu^{\prime} &=\mu_{0}+\frac{\sigma_{0}^{2}\left(\mu_{1}-\mu_{0}\right)}{\sigma_{0}^{2}+\sigma_{1}^{2}} \\ \sigma^{\prime 2} &=\sigma_{0}^{2}-\frac{\sigma_{0}^{4}}{\sigma_{0}^{2}+\sigma_{1}^{2}} \end{aligned} \tag{11} μσ2=μ0+σ02+σ12σ02(μ1μ0)=σ02σ02+σ12σ04(11)

將式(11)中的兩個式子相同的部分用 k \mathbf{k} k表示:
k = σ 0 2 σ 0 2 + σ 1 2 (12) \mathbf{k}=\frac{\sigma_{0}^{2}}{\sigma_{0}^{2}+\sigma_{1}^{2}} \tag{12} k=σ02+σ12σ02(12)

μ ′ = μ 0 + k ( μ 1 − μ 0 ) σ ′ 2 = σ 0 2 − k σ 0 2 (13) \begin{aligned} \mu^{\prime} &=\mu_{0}+\mathbf{k}\left(\mu_{1}-\mu_{0}\right) \\ \sigma^{\prime 2} &=\sigma_{0}^{2}-\mathbf{k} \sigma_{0}^{2} \end{aligned} \tag{13} μσ2=μ0+k(μ1μ0)=σ02kσ02(13)

下面進一步將式(12)和(13)寫成矩陣的形式,如果 Σ \Sigma Σ表示高斯分佈的協方差, μ ⃗ \vec{\mu} μ 表示每個維度的均值,則:

K = Σ 0 ( Σ 0 + Σ 1 ) − 1 (14) \mathbf{K}=\Sigma_{0}\left(\Sigma_{0}+\Sigma_{1}\right)^{-1} \tag{14} K=Σ0(Σ0+Σ1)1(14)

μ ⃗ ′ = μ 0 → + K ( μ 1 → − μ 0 → ) Σ ′ = Σ 0 − K Σ 0 (15) \begin{array}{l} \vec{\mu}^{\prime}=\overrightarrow{\mu_{0}}+\mathbf{K}\left(\overrightarrow{\mu_{1}}-\overrightarrow{\mu_{0}}\right) \\ \Sigma^{\prime}=\Sigma_{0}-\mathbf{K} \Sigma_{0} \end{array} \tag{15} μ =μ0 +K(μ1 μ0 )Σ=Σ0KΣ0(15)
  矩陣 K \mathbf{K} K稱爲卡爾曼增益,下面將會用到。放鬆!馬上就要結束了!

整合上述公式

我們有兩個高斯分佈,預測部分 ( μ 0 , Σ 0 ) = ( H k x ^ k , H k P k H k T ) \left(\mu_{0}, \Sigma_{0}\right)=\left(\mathbf{H}_{k} \hat{\mathbf{x}}_{k}, \mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}\right) (μ0,Σ0)=(Hkx^k,HkPkHkT)和測量部分 ( μ 1 , Σ 1 ) = ( z k → , R k ) \left(\mu_{1}, \Sigma_{1}\right)=\left(\overrightarrow{\mathbf{z}_{k}}, \mathbf{R}_{k}\right) (μ1,Σ1)=(zk ,Rk),將他們放到式(15)中算出它們之間的重疊部分:

H k x ^ k ′ = H k x ^ k + K ( z k → − H k x ^ k ) H k P k ′ H k T = H k P k H k T − K H k P k H k T (16) \begin{aligned} \mathbf{H}_{k} \hat{\mathbf{x}}_{k}^{\prime} &=\mathbf{H}_{k} \hat{\mathbf{x}}_{k} &+\mathbf{K}\left(\overrightarrow{\mathrm{z}_{k}}-\mathbf{H}_{k} \hat{\mathbf{x}}_{k}\right) \\ \mathbf{H}_{k} \mathbf{P}_{k}^{\prime} \mathbf{H}_{k}^{T} &=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} &-\mathbf{K} \mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T} \end{aligned} \tag{16} Hkx^kHkPkHkT=Hkx^k=HkPkHkT+K(zk Hkx^k)KHkPkHkT(16)

由式(14)可得卡爾曼增益爲:
K = H k P k H k T ( H k P k H k T + R k ) − 1 \mathbf{K}=\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}\left(\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}+\mathbf{R}_{k}\right)^{-1} K=HkPkHkT(HkPkHkT+Rk)1

將式(16)和式(17)的兩邊同時左乘矩陣的逆(注意 K \mathbf{K} K裏面包含了 H k \mathbf{H}_{k} Hk)將其約掉,再將式(16)的第二個等式兩邊同時右乘矩陣 H k T \mathbf{H}_{k}^{T} HkT的逆得到以下等式:
x ^ k ′ = x ^ k + K ′ ( z k → − H k x ^ k ) P k ′ = P k − K ′ H k P k (18) \begin{aligned} \hat{\mathbf{x}}_{k}^{\prime} &=\hat{\mathbf{x}}_{k}+\mathbf{K}^{\prime}\left(\overrightarrow{\mathrm{z}_{k}}-\mathbf{H}_{k} \hat{\mathbf{x}}_{k}\right) \\ \mathbf{P}_{k}^{\prime} &=\mathbf{P}_{k^{-}} \mathbf{K}^{\prime} \mathbf{H}_{k} \mathbf{P}_{k} \end{aligned} \tag{18} x^kPk=x^k+K(zk Hkx^k)=PkKHkPk(18)

K ′ = P k H k T ( H k P k H k T + R k ) − 1 (19) \mathbf{K}^{\prime}=\mathbf{P}_{k} \mathbf{H}_{k}^{T}\left(\mathbf{H}_{k} \mathbf{P}_{k} \mathbf{H}_{k}^{T}+\mathbf{R}_{k}\right)^{-1} \tag{19} K=PkHkT(HkPkHkT+Rk)1(19)

上式給出了完整的更新步驟方程。 x ^ k \hat{\mathbf{x}}_{k} x^k就是新的最優估計,我們可以將它和 P k \mathbf{P}_{k} Pk放到下一個預測和更新方程中不斷迭代。

總結

對於上述所有的數學公式,你僅僅需要實現公式(7)、(18)和(19)。(如果你忘記了上述公式,你也能從公式(4)和(5)重新推導。)

總結

對於上述所有的數學公式,你僅僅需要實現公式(7)、(18)和(19)。(如果你忘記了上述公式,你也能從公式(4)和(5)重新推導。)

這將允許你精確地建模任何線性系統。對於非線性系統,需要用到擴展卡爾曼濾波,區別在於EKF多了一個把預測和測量部分進行線性化的過程。