C 下擴充套件卡爾曼類(EKF)的實現

2021-08-14 08:47:37 字數 1888 閱讀 9944

最初的卡爾曼濾波用於解決離散系統的濾波問題,然而工程中常遇到的濾波問題是連續系統產生的濾波問題。

卡爾曼濾波器具有如下形式的離散的狀態方程: xk

+1=ψ

k+1,

kxk+

wk(1) x˙

=f(x

)+w(2)

其中f 通常是乙個非線性方程。

針對上述的非線性方程,擴充套件卡爾曼濾波的做法如下:

首先,狀態一定存在乙個軌跡x(

t),儘管根據式(2)我們很難具體地解出這個軌跡。假設有乙個t0

時刻的狀態估計值x^

,在狀態的估計值x^

附近把x(

t)展開得到 x(

t)=x

^+∂x

∂t∣x

=x^(

t−t0

)+⋯(3)

而 ∂x

∂t∣x

=x^=

f(x^

)(4)

因此濾波器的時間更新為 xk

+1=x

k+tf

(xk)

(5) pk

+1=ψ

k+1,

kpkψ

tk+1

,k+q

k 而狀態轉移矩陣ψk

+1,k

為 ψk+

1,k=

i+t∂

x˙∂x

∣x=x

^(6)

測量方程隨可能同樣為非線性 z=

h(x)

+v但它可以直接線性化 zk

=h(x

^)+∂

z∂x∣

x=x^

(xk−

x^)+

⋯ 於是h

陣為h=∂

z∂x∣

x=x^

接下來只剩下測量更新,按照卡爾曼濾波的那一套來執行就行了。

另外,上述在式(3)只保留了一階項,若嫌精度低可保留二階項,相應的,狀態轉移矩陣也要保留二階項。

一般的,卡爾曼濾波的q陣要比r陣更難準確獲得,因此建議先確定r陣,之後經驗性的給定q陣,觀察濾波效果以決定對q陣的調整。

在c++下將上述過程編寫為類。考慮通用性,對所有關於狀態

x 的方程都抽象為如下形式的函式

mat equation(time_stamp& time,mat& x,mat& para);
mat是矩陣類,第乙個引數time是時刻,第二個引數x是狀態,第三個引數para是方程中需要用到的引數。

以四元數微分方程為例: q˙

=12[

ω×]q

則x=q

,par

a=ω ,函式返回q˙

標頭檔案kalman.h,其中矩陣類mat和時間戳類time_stamp請自行實現:

#ifndef kalman_h

#define kalman_h

//時間更新發生在測量完成之後,即測量完成時刻為當前濾波時刻

//因此時間更新指從上乙個濾波時刻更新到當前濾波時刻

typedef mat (*pequation_of_x)(time_stamp& time,mat& x,mat& para);

class

ekf;

#endif

cpp檔案kalman.cpp:

#include 

#include "kalman.h"

ekf::ekf()

ekf::~ekf()

{}void ekf::time_update(void)

p=stm*p

*stm.trans()+q;

}else

else

}

EKF(擴充套件卡爾曼濾波)引數理解

ekf velne noise 速度在座標軸 ne 方向上的雜訊。通常是在 0 上下波動。設定方法 將飛機上電靜置若干分鐘 時間盡量長一點 記錄飛 行日誌,由 ekf3 的 ivn ive 兩個引數的均值確定。ekf veld noise 座標軸 d 高度 方向上的雜訊。通常是在 0 上下波動。設定...

擴充套件卡爾曼濾波 不變擴充套件卡爾曼濾波 技術報告

本文使用 zhihu on vscode 創作並發布 connor 2020.06.02 不變擴充套件卡爾曼濾波的適用範圍 不變擴充套件卡爾曼濾波的使用步驟 乙個矩陣李群 matrix lie group g是滿足下列條件的 其中 表示 維單位矩陣,表示矩陣 的逆,表示矩陣乘法。現在,將上述構成李群...

卡爾曼濾波原理二 擴充套件卡爾曼

1 理論部分 系統方程 各個變數意義同上一節,其中f和h代表狀態和觀測的非線性函式。在擴充套件卡爾曼濾波中,狀態的 以及觀測值的 由非線性函式計算得出,線性卡爾曼濾波中的狀態轉移矩陣a陣和觀測矩陣h陣由f和h函式的雅克比矩陣代替,假設狀態有n維,則求法如下 有了上面矩陣的計算方法,ekf濾波過程同線...