最初的卡爾曼濾波用於解決離散系統的濾波問題,然而工程中常遇到的濾波問題是連續系統產生的濾波問題。
卡爾曼濾波器具有如下形式的離散的狀態方程: 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濾波過程同線...