%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 功能说明:基于观测距离,无迹卡尔曼滤波完成对目标状态估计
% 详细原理介绍及中文注释请参考:
% 《卡尔曼滤波原理及应用-MATLAB仿真》,电子工业出版社,黄小平著。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [sys,x0,str,ts]=UKF(t,x,u,flag)
global Zdist;
global Xukf;
Q=diag([0.01,0.04]);
R=1;
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
case 2
sys=mdlUpdate(t,x,u,Q,R);
case 3
sys=mdlOutputs(t,x,u);
case {1,4}
sys=[];
case 9
save('Xukf','Xukf');
save('Zdist','Zdist');
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [sys,x0,str,ts]=mdlInitializeSizes(N)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 2;
sizes.NumOutputs = 2;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0,0]';
str = [];
ts = [-1 0];
global Zdist;
Zdist=[];
global Xukf;
Xukf=[x0];
global P;
P=0.01*eye(2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function sys=mdlUpdate(t,x,u,Q,R)
global Zdist;
global Xukf;
global P;
Zdist=[Zdist,u];
%——————————————————————————————————————
Xin=Xukf(:,length(Xukf(1,:)));
[Xnew,P]=GetUkfResult(Xin,u,P,Q,R)
Xukf=[Xukf,Xnew];
sys=Xnew;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function sys=mdlOutputs(t,x,u)
sys = x;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Xout,P]=GetUkfResult(Xin,Z,P,Q,R)
L=2;
alpha=0.01;
kalpha=0;
belta=2;
ramda=alpha^2*(L+kalpha)-L;
for j=1:2*L+1
Wm(j)=1/(2*(L+ramda));
Wc(j)=1/(2*(L+ramda));
end
Wm(1)=ramda/(L+ramda);
Wc(1)=ramda/(L+ramda)+1-alpha^2+belta;
xestimate=Xin;
P
cho=(chol(P*(L+ramda)))';
for k=1:L
xgamaP1(:,k)=xestimate+cho(:,k);
xgamaP2(:,k)=xestimate-cho(:,k);
end
Xsigma=[xestimate,xgamaP1,xgamaP2];
for k=1:2*L+1
Xsigmapre(:,k)=ffun(Xsigma(:,k));
end
Xpred=zeros(2,1);
for k=1:2*L+1
Xpred=Xpred+Wm(k)*Xsigmapre(:,k);
end
Ppred=zeros(2,2);
for k=1:2*L+1
Ppred=Ppred+Wc(k)*(Xsigmapre(:,k)-Xpred)*(Xsigmapre(:,k)-Xpred)';
end
Ppred=Ppred+Q;
chor=(chol((L+ramda)*Ppred))';
for k=1:L
XaugsigmaP1(:,k)=Xpred+chor(:,k);
XaugsigmaP2(:,k)=Xpred-chor(:,k);
end
Xaugsigma=[Xpred XaugsigmaP1 XaugsigmaP2];
for k=1:2*L+1
Zsigmapre(1,k)=hfun(Xaugsigma(:,k));
end
Zpred=0;
for k=1:2*L+1
Zpred=Zpred+Wm(k)*Zsigmapre(1,k);
end
Pzz=0;
for k=1:2*L+1
Pzz=Pzz+Wc(k)*(Zsigmapre(1,k)-Zpred)*(Zsigmapre(1,k)-Zpred)';
end
Pzz=Pzz+R;
Pxz=zeros(2,1);
for k=1:2*L+1
Pxz=Pxz+Wc(k)*(Xaugsigma(:,k)-Xpred)*(Zsigmapre(1,k)-Zpred)';
end
K=Pxz*inv(Pzz);
Xout=Xpred+K*(Z-Zpred);
P=Ppred-K*Pzz*K';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
卡尔曼滤波的simulink仿真,包括EKF和UKF的滤波器设计。(Simulink simulation of Kalman filtering, including filter design for EKF and UKF.)
资源推荐
资源详情
资源评论
收起资源包目录
卡尔曼滤波的simulink仿真.zip (24个子文件)
卡尔曼滤波的simulink仿真
7.3.2
DeviationAnalysis.m 1KB
Xkalman.mat 3KB
Xstate.mat 3KB
System_TargetTracking_KF_Simulation.mdl 27KB
Zobserv.mat 2KB
KalmanFilter.m 2KB
SimuStateFunction.m 1KB
7.3.1
SimuKalmanFilter.m 2KB
DistanceMessurement.mdl 17KB
7.2.1
sfuntmpl.m 2KB
7.4.2
GetDistanceFunction.m 1KB
System_TargetTracking_UKF_Simulation.mdl 23KB
hfun.m 66B
DataAnalysis.m 1KB
UKF.m 3KB
SimuStateFunction.m 1KB
ffun.m 71B
7.4.1
GetDistanceFunction.m 1KB
EKF.m 2KB
hfun.m 67B
DataAnalysis.m 1KB
System_TargetTracking_EKF_Simulation.mdl 23KB
SimuStateFunction.m 1KB
ffun.m 71B
共 24 条
- 1
资源评论
- 人生最浪漫2022-06-12用户下载后在一定时间内未进行评价,系统默认好评。
- weixin_582016372022-08-25这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
- 这个代码不太懂2023-09-28超级好的资源,很值得参考学习,对我启发很大,支持!
- kfxiaoning2023-04-06发现一个宝藏资源,赶紧冲冲冲!支持大佬~
- weixin_141517182022-06-28用户下载后在一定时间内未进行评价,系统默认好评。
wouderw
- 粉丝: 268
- 资源: 2960
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功