由於感測器本身的特性,任何測量結果都有誤差。因此需要在感測器測量結果的基礎上,進行跟蹤,以此來保證所觀測物體的資訊不會發生突變。這就需要用到經典跟蹤演算法——卡爾曼濾波器。
卡爾曼濾波器就是根據上一時刻的狀態,**當時時刻的狀態,將**的狀態與當時時刻的測量值進行加權,加權後的結果才認為是當前的實際狀態,而不是單單只是當前的測量值。
以下7個方程即為卡爾曼濾波器的理論描述:
** predication:
x ′=
fx+u
x' = fx + u
x′=fx+up′
=fpf
t+qp' = fpf^t + q
p′=fpf
t+q測量更新 measurement update:
y =z
−hx′
y = z - hx'
y=z−hx′k=
p′ht
(hp′
ht+r
)−1k = p'h^t(hp'h^t + r)^
k=p′ht
(hp′
ht+r
)−1x=x
′+ky
x = x' +ky
x=x′+kyp=
(i−k
h)p′
p=(i - kh)p'
p=(i−k
h)p′
接下來以飛行器追蹤小車為例,分析這7個方程的含義:
首先需要通過物理量對小車的狀態進行描述,小車相當於二維空間中的點,需要x,y方向上的座標,x,y方向上的速度,才能表示。這樣的狀態方程就有4個變數。
一、**:
1、x ′=
fx+u
x' = fx + u
x′=fx+
u x ′:
x':x′
:**狀態向量
f :f:
f:狀態轉移矩陣
u :u:
u:外部影響
x :x:
x:狀態向量
x = (1)[x
yvxv
y]\left[\begin x\\ y\\ v_x\\ v_y\\ \end\right]\tag
⎣⎢⎢⎡x
yvx
vy
⎦⎥⎥⎤
(1)
假設當前小車運動為勻速運動,即加速度為0,加速度不會對**造成影響,即:
p:協方差矩陣,表示系統的不確定度
f :f:
f:在1中提到的狀態轉移矩陣
q :q:
q:過程雜訊,無法通過方程1表示的雜訊
由於攝像頭模組只能確定小車的位置,無法測量小車的速度,因此對於攝像頭模組來說,其位置資訊準確度較高,不確定度較低;速度資訊準確度較低,不確定度較高。
因此可以這樣確定p
p = [10
0001
1100
100000
0100
]\left[\begin 1&0&0&0\\ 0&1&1&1\\ 0&0&100&0\\ 0&0&0&100\\ \end\right]
⎣⎢⎢⎡1
000
0100
011
000
0101
00⎦
⎥⎥⎤
q在工程上一般設為單位矩陣參與運算,即
q = [10
0001
0000
1000
01]\left[\begin 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end\right]
⎣⎢⎢⎡1
000
0100
001
000
01⎦
⎥⎥⎤
二、觀測:
1、y =z
−hx′
y = z - hx'
y=z−hx
′ 該公式計算的是實際觀測值z同**值x』之間的差值y。
因為z是實際觀測值,只有x,y座標兩項。
而x『是**值,存在x,y,v_x,v_y四項。
所以需要狀態轉移矩陣h來將**值x』進行乙個轉換,使其能與實際觀察值z進行運算。
r:為測量雜訊矩陣,這個表示測量值與真值之間的差值。
k :k:
k:卡爾曼增益即上乙個公式y的權值
三、狀態量更新:
1、x =x
′+ky
x = x' +ky
x=x′+k
y 該公式完成了當前狀態向量的更新,綜合考慮了上一時刻的**值和當前時刻的測量值
2、p =(
i−kh
)p′p=(i - kh)p'
p=(i−k
h)p′i:
i:i:
與狀態向量同樣維度的單位矩陣
該公式根據卡爾曼增益,更新了系統的不確定度p,用於下乙個週期的計算
#include #include #include typedef struct
kalman_filter;
kalman_filter kal = ;//引數需要調節
kalman_filter *kq = &kal;
float kalman_filter_1(kalman_filter *kal)//一維卡爾曼濾波
void main()
}
舉例而言,r固定,q越大,代表越信任側量值,q無窮代表只用測量值;
反之,q越小代表越信任模型**值,q為零則是只用模型**。
引數的確定才是用好卡爾曼演算法的根本。
未完待續…
Kalman filter的個人理解
最近在做目標跟蹤相關的工作,看了很多資料,零零總總的,過段時間自己都有些小混亂了 不知道是不是自己應該吃點核桃補腦了呢 在這裡mark些資料,當腦容量不足時候,就暫且卸掉一些,擴充容量後,再繼續裝載 kalman filter,wiki上對它的介紹很詳細,對應中文的介紹 對每一步k,定義矩陣a,h,...
C Primer Chapter One學習筆記
筆記 1.流 從io裝置上讀入或寫出的字串行,用來說明字元隨時間順序生成或消耗。2.輸入輸出符可連用原因 operator 或operator 返回stream物件。3.要測試程式那個語句出錯,使用cout 4.新建乙個內建型別,如int i 0 最好先初始化,不然用到的時候沒初始化會產生奇怪的錯誤...
BroadcastReceiver學習筆記
需要注意 的是,不要在 onreceive 方法中新增過多的邏輯或者進行任何的耗時操作,因為在廣播接收 器中是不允許開啟執行緒的,當 onreceive 方法執行了較長時間而沒有結束時,程式就會報錯。有序broadcast,sendorderedbroadcast intent,null abort...