使用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...