使用matlab對輸入資料進行卡爾曼濾波

2021-10-08 21:21:28 字數 4209 閱讀 2551

使用matlab對輸入資料進行卡爾曼濾波。

簡單說明一下程式中的資料。假設一輛汽車從初始點(0,10)開始行駛,初始速度沿y軸正方向10m/s。然後在觀測途中向右先加速再減速變換車道。

整個過程其實有x軸座標,y軸座標,x軸速度,y軸速度以及x軸的加速度這5個物理量。但在卡爾曼濾波時我只用了x軸座標,y軸座標,x軸速度,y軸速度這4個量,相當於將x軸的人為施加的加速度當作了雜訊處理。人為施加的加速度當然不符合高斯分布,有違卡爾曼濾波的假設,這裡只是為現實應用直接處理的。有興趣的可以把x軸的加速度這個量也納入到卡爾曼濾波中。

clc

clear

close all

%% 汽車變道資料生成

% 汽車初始位置為(0,10),初始x方向速度為0,y方向速度為5m/s,向前勻速運動

% 在第400

-600幀時,向右加速,加速度為0.05m/s^

2% 在第601

-610幀時,停止加速

% 在第611

-810幀時,向左加速,加速度為0.05m/s^

2,正好使得x軸方向速度為0,完成變道

%間隔時間步長.每秒30幀t=

1/30;

%總的觀測幀數目

totaltime =

1600

;% 狀態轉移矩陣f

f_1 =[1

tt^2

/2;0

1t;0

01];

f_2 =[1

t;01

];f=

blkdiag

(f_1,f_2);%

[初始x座標, 初始x速度, 初始x加速度, 初始y座標, 初始y速度]x(

:,1)

=[00

0105]';

% 觀測矩陣h,觀測到x座標,x速度, y座標, y速度四個量h=

[100

00;0

1000

;000

10;0

0001

];% 過程雜訊,可能路面比較滑,風力等影響,對下個時刻的真實狀態造成影響

sigma =

0.00005;q

=diag

([sigma sigma/

t0 sigma sigma/t]

);% 感測器的觀測雜訊矩陣rr=

diag([

0.25

,0.25

,0.25

,0.25])

;% 觀測到的資料z(

:,1)

=h*x

(:,1

)+sqrtm(r

)*randn(4

,1);

for i =

2: totaltime

% 當前時刻的狀態由上一時刻的狀態變換過來,加上過程雜訊qx(

:,i)=f

*x(:

, i-1)

+q*randn(5

,1);

% 司機手動輸入導致加速度改變

%400-

600 車輛向右加速變道

if i>

400&& i<=

600x(3

,i)=

0.05

; end

%600-

610 車輛勻速變道

if i>

600&& i<=

610x(3

,i)=0;

end%

610-

810 車輛減速變道

if i>

610&& i<=

810x(3

,i)=

-0.05

; end

%810以後 變道完成

if i>

810x(3

,i)=0;

end% 測量結果由當前時刻的真實資料經過測量矩陣h,然後加上觀測雜訊矩陣r得到

z(:,i)=h*

x(:, i)+r

*randn(4

,1);

end%

% 卡爾曼濾波

% 卡爾曼濾波後的目標結果[x座標, x速度, y座標, y速度]

xkf(:,

1)=[

x(1:

2,1)

;x(4

:5,1

)];xkf(:

,1)=

[10;2

;15;8

];f_1 =[1

t;01

];f_2 =[1

t;01

];f=

blkdiag

(f_1,f_2)

;sigma =

0.0005;%

q表示過程雜訊。由於q對整個系統存在影響,但又不能太確定對系統的影響有多大。

% 工程上,我們一般將q設定為單位矩陣參與運算q=

diag

([sigma sigma sigma sigma]);

h=eye(4)

;%xkf(:,

1)=[

3;0;

0;20;

5];p0

=100

*eye(4

);for i =

2: totaltime

% 卡爾曼濾波7公式(y和s是中間變數,簡化後是卡爾曼濾波5公式)

% 根據上一時刻的狀態**這一時刻的狀態

xn =f*

xkf(

:,i-1)

;%p矩陣表示系統的不確定程度,這個不確定程度,在卡爾曼濾波器初始化時會很大,

% 隨著越來越多的資料注入濾波器中,不確定程度會變小,p的專業術語叫狀態協方差矩陣

p1=f

*p0*f' +q;

% y代表實際觀測到的測量值z(:

,i)與**值h

* xn之間差值

y =z(

:,i)-h

* xn;

% 卡爾曼增益k

,**的狀態與當前時刻的測量值進行加權,

就是y的權值

(s是臨時變數)s=

h*p1*

h' +r;

k=p1*

h' *

inv(s)

;% 完成對當前狀態向量x的更新,不僅考慮了上一時刻的**值,也考慮了測量值,和整個系統的雜訊

xkf(:

,i)= xn +

k* y;

% 根據卡爾曼增益,更新系統的不確定度p,用於下乙個週期的運算

p0=(

eye(4)

-k*h

)*p1;

end%

% 最終結果

figure

hold on;

box on;

grid on

plot(z

(1,:

),z(

3,:)

,'b.');

plot(x

(1,:

),x(

4,:)

,'-r');

plot

(xkf(1

,:),

xkf(3,

:),'-k');

legend

('觀測點'

,'真實軌跡'

,'濾波軌跡'

)xlabel

('x');

ylabel

('y');

daspect([

0.0311

]);figure

hold on;

box on;

grid on

plot(z

(2,:

),z(

4,:)

,'-b');

plot

(xkf(2

,:),

xkf(4,

:),'-k');

plot(x

(2,:

),x(

5,:)

,'-r');

legend

('觀測速度'

,'濾波速度'

,'真實速度'

)xlabel

('x方向速度');

ylabel

('y方向速度');

daspect([

111]

);

最終結果:

對 MVC 的輸入進行轉換。。

這兒說了一下不修改資料庫也不修改太多 的情況下將數字加密的問題,適應於json 現在問題來了,客戶端傳回來的也是加密後的字串。噗通。繫結到 int 型別的屬性,伺服器端直接報 model validate 出錯。所以,伺服器端還需要乙個反轉的過程 mvc 有很多地方可以對於上傳的值進行處理 例如最簡...

用matlab對訊號進行傅利葉變換

傅氏變換分析是訊號分析中很重要的方法,借助matlab可以很方便的對各類訊號進行傅氏頻域分析。本文介紹了集中離散的傅氏變換以及matlab實現方法。1.離散序列的傅利葉變換dtft discrete time fourier transform 1 n 8 原離散訊號有8點 2 n 0 1 n 1 ...

MATLAB 中對 Python 錯誤進行故障排除

使用 matlab 外部介面對錯誤進行故障排除比較困難,因為不確定錯誤是在 python 應用程式中還是在 matlab 中,常見錯誤有 python報告的錯誤,試圖將 python 資料轉換為 matlab 資料時的錯誤,以及試圖將 matlab 資料轉換為 python 資料的錯誤。python...