卡爾曼濾波

2021-10-23 04:57:53 字數 3559 閱讀 7927

%房間當前溫度真實值為24度,認為下一時刻與當前時刻溫度相同,誤差為0.02度(即認為連續的兩個時刻最多變化0.02度)。

%溫度計的測量誤差為0.5度。

%開始時,房間溫度的估計為23.5度,誤差為1度。

clear all;

close all;

% intial parameters

n_iter =

500;

%計算連續n_iter個時刻

sz =

[n_iter,1]

;% size of array. n_iter行,1列

x =24

;% 溫度的真實值

q =4e-4

;% 過程方差, 反應連續兩個時刻溫度方差。更改檢視效果4e-4

r =0.25

;% 測量方差,反應溫度計的測量精度。更改檢視效果0.25

z = x +

sqrt

(r)*

randn

(sz)

;% z是溫度計的測量結果,在真實值的基礎上加上了方差為0.25的高斯雜訊。

% 對陣列進行初始化

xhat=

zeros

(sz)

;% 對溫度的後驗估計。即在k時刻,結合溫度計當前測量值與k-

1時刻先驗估計,得到的最終估計值

p=zeros

(sz)

;% 後驗估計的方差

xhatminus=

zeros

(sz)

;% 溫度的先驗估計。即在k-

1時刻,對k時刻溫度做出的估計(不准)

pminus=

zeros

(sz)

;% 先驗估計的方差

k=zeros

(sz)

;% 卡爾曼增益,反應了溫度計測量結果與過程模型(即當前時刻與下一時刻溫度相同這一模型)的可信程度

% intial guesses

%xhat最優估計

xhat(1

)=23.5

;%溫度初始估計值為23.5度p(

1)=1

;%誤差方差為1(最優估計的方差)

for k =

2:n_iter

% 時間更新(**)

xhatminus

(k)=

xhat

(k-1);

%用上一時刻的最優估計值來作為對當前時刻的溫度的**--

--獲得當前時刻的**

%(公式二:)(當前)先驗估計的方差=上一時刻最優估計的方差+過程方差

pminus

(k)=

p(k-1)

+q;%**的方差為上一時刻溫度最優估計值的方差與過程方差之和--

--獲得當前**的方差

% 測量更新(校正)

%(公式三:)(當前)卡爾曼增益=**方差/

(**方差 + 測量方差)

k(k)

=pminus

(k)/

(pminus

(k)+r )

;%計算卡爾曼增益--

--**方差/

(**方差 + 測量方差)

%(公式四:)(當前)當前**的最優=當前**+卡爾曼增益*(當前測量值-當前**)

xhat

(k)=

xhatminus

(k)+

k(k)*(

z(k)

-xhatminus

(k))

;%結合當前時刻溫度計的測量值,對上一時刻的**進行校正,得到校正後的最優估計。該估計具有最小均方差

%(公式五:)(當前)最優估計值的方差=(1

-卡爾曼增益)*先驗估計

p(k)=(

1-k(k))*

pminus

(k);

%計算最終估計值的方差

endfontsize=14;

linewidth=3;

figure()

;plot

(z,'k+');

%畫出溫度計的測量值

hold on;

plot

(xhat,

'b-'

,'linewidth'

,linewidth)

%畫出最優估計值

hold on;

plot

(x*ones

(sz)

,'g-'

,'linewidth'

,linewidth)

;%畫出真實值

legend

('溫度計的測量結果'

,'後驗估計'

,'真實值');

xl=xlabel

('時間(分鐘)');

yl=ylabel

('溫度');

set(xl,

'fontsize'

,fontsize)

;set

(yl,

'fontsize'

,fontsize)

;hold off;

set(gca,

'fontsize'

,fontsize)

;figure()

;valid_iter =[2

:n_iter]

;% pminus not valid at step 1

plot

(valid_iter,p(

[valid_iter]),

'linewidth'

,linewidth)

;%畫出最優估計值的方差

legend

('後驗估計的誤差估計');

xl=xlabel

('時間(分鐘)');

yl=ylabel

('℃^2');

set(xl,

'fontsize'

,fontsize)

;set

(yl,

'fontsize'

,fontsize)

;set

(gca,

'fontsize'

,fontsize)

;

#include

"opencv2/video/tracking.hpp"

#include

"opencv2/highgui/highgui.hpp"

#include

using

namespace cv;

static

inline point calcpoint

(point2f center,

double r,

double angle)

static

void

help()

intmain

(int

,char**

)if(code ==

27|| code ==

'q'|| code ==

'q')

break;}

return0;

}

參考:

卡爾曼 卡爾曼濾波 1

今天主要介紹一下卡爾曼濾波器,所謂卡爾曼濾波器其實是一種最優化遞迴數字處理演算法 optimal recursive data processing algorithm 卡爾曼濾波器應用 既然我們有了測量儀器,這些測量儀器可以目標給出準確測量值。還需要卡爾曼濾波器進行估計嗎?下面解釋一下為什麼需要卡...

卡爾曼 基礎卡爾曼濾波

卡爾曼濾波器是一種基礎 定位演算法。原理非常簡單易懂。核心過程可以用乙個圖說明 本質上就是這兩個狀態過程的迭代,來逐步的準確定位。更新 更具感測器獲取到比較準確的位置資訊後來更新當前的 問位置,也就是糾正 的錯誤。你可能要問為什麼有感測器的資料了還要進行更新?因為在現實世界中感測器是存在很多雜訊干擾...

卡爾曼濾波

卡爾曼濾波演算法 首先引入乙個離散控制過程的系統,用乙個線性隨機微分方程來描述 x k a x k 1 b u k w k 系統的測量值 z k h x k v k x k 是k時刻的系統狀態,u k 是k時刻對系統的控制量。a和b是系統引數,對於多模型系統,他們為矩陣。z k 是k時刻的測量值,h...