一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【目标定位】基于matlab粒子滤波目标定位仿真【含Matlab源码 129期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、EKF算法简介

在SLAM问题解决方法中,EKF算法是比较常用的经典算法。机器人的自定位过程是一个非线性化的过程,EKF是为了解决Kalman滤波器不能应用于非线性系统而产生的,该滤波算法的主要过程是预测和更新。在预测和更新过程中,EKF算法对原有的系统方程和观测方程进行线性化并得到一个高估计的结果。如果系统中的非线性很弱,EKF也能给出很好的估计结果。

预测时,使用系统模型如下:

式中,z(k+1)表示的是第k+1步中获得的观测量,W (k+1)表示Kalman增益,其中还包括了前向估计在实际中的权重。

实现EKF-SLAM需要以下几方面内容:系统动态方程以及相应的参量,使用的传感器类型和观测方程,根据这些可以得到EKF的相应形式。二维平面中的EKF-SLAM需要知道机器人在X、Y方向的值,还需要知道二维平面下机器人头部朝向与X轴正方向的夹角。

三、部分源代码

clc;
clear;
N1=100;
thita=1*pi/4;
speed=20;
T=2.5;
point_Q2=[400 0;0 0.64*pi^2/180^2];
%Q1=[0.36 0;0 0];     %添加机动情形
%Q1=[0 0;0 0];        %不添加机动
l=[1/2*T^2 0;T 0;0 1/2*T^2;0 T];
N=200;
object_init_state=[2 speed*cos(thita) 3 speed*sin(thita)];
for i=1:N1[real_data,view_data,real_v,point_view_data,Q1]=new_data_get(object_init_state,N,T,l);                   %前条件:目标的初始状态,目标跟踪次数已知%后条件:得到目标的观测矩阵,目标的真实值矩阵,真实速度[filter_data]=particle_filter(view_data,point_view_data,N,object_init_state,Q1,point_Q2,T,l,real_data);%前条件:目标的观测矩阵已知%后条件:得到目标的滤波矩阵和目标的各次增益[ME_temp_view_err_x(i,1:N),ME_temp_filter_err_x(i,1:N),ME_temp_view_err_y(i,1:N),ME_temp_filter_err_y(i,1:N)]=temp_err_save(real_data,...filter_data,view_data);%前条件:目标的真实值矩阵,目标的滤波矩阵,目标的观测矩阵已知%后条件:本次目标的观测误差,滤波误差得到存储
end
[ME_final_view_err_x,ME_final_filter_err_x,ME_final_view_err_y,ME_final_filter_err_y]=ME_err_count(ME_temp_view_err_x,ME_temp_filter_err_x,...
ME_temp_view_err_y,ME_temp_filter_err_y);
%前条件:目标的观测误差矩阵,目标的滤波误差矩阵已知
%后条件:得到目标的平均观测误差矩阵,平均滤波误差矩阵
[RMSE_final_view_err_x,RMSE_final_filter_err_x,RMSE_final_view_err_y,RMSE_final_filter_err_y]=RMSE_err_count(ME_temp_view_err_x,...
ME_temp_filter_err_x,ME_temp_view_err_y,ME_temp_filter_err_y,ME_final_view_err_x,ME_final_filter_err_x,ME_final_view_err_y,ME_final_filter_err_y);
%后条件:得到目标的均方观测误差矩阵,均方滤波误差矩阵
%show(ME_final_view_err_x,ME_final_filter_err_x,ME_final_view_err_y,ME_final_filter_err_y,final_filt_k1,final_filt_k2,N,real_data,view_data,filter_data,real_v);
show(ME_final_view_err_x,ME_final_filter_err_x,ME_final_view_err_y,ME_final_filter_err_y,RMSE_final_view_err_x,RMSE_final_filter_err_x,...
RMSE_final_view_err_y,RMSE_final_filter_err_y,N,real_data,view_data,filter_data,real_v);
%前条件:目标的平均观测误差矩阵,平均滤波误差矩阵已知
%后条件:作出目标的平均观测误差矩阵,平均滤波误差矩阵的仿真图
function [filter_data]=data_kalman_filter(view_data,point_view_data,N,object_init_state,Q1,point_Q2,T,l,real_data)
%定义初试滤波
filter_data0=object_init_state';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ch=[1 T 0 0;0 1 0 0;0 0 1 T;0 0 0 1];               %定义状态转移矩阵
M=10;                                               %定义粒子数为10
M_out=10;
%h=[1 0 0 0;0 0 1 0];                               %观测转移矩阵
%观测误差是随时间变化的所以需计算观测误差
%cos_2_v_thita=(object_init_state(1,1)^2)/(object_init_state(1,1)^2+object_init_state(1,3)^2);
%sin_2_v_thita=1-cos_2_v_thita;
%R_2=(object_init_state(1,1)^2+object_init_state(1,3)^2);
%Q2=zeros(2,2);
%Q2(1,1)=point_Q2(1,1)*cos_2_v_thita+R_2*sin_2_v_thita*point_Q2(2,2);
%Q2(1,2)=sqrt(cos_2_v_thita)*sqrt(sin_2_v_thita)*(point_Q2(1,1)-R_2*point_Q2(2,2));
%Q2(1,2)=0;
%Q2(2,1)=Q2(1,2);
%Q2(2,2)=point_Q2(1,1)*sin_2_v_thita+R_2*cos_2_v_thita*point_Q2(2,2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:Mw1=sqrt(Q1(1,1))*randn;w2=sqrt(Q1(2,2))*randn;w=[w1;w2];x_part(:,i)=filter_data0+l*w;
endq0=ones(1,M)/M;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%根据初始预测计算滤波值
%通过输入观测值进行卡尔曼滤波
for i=1:Nfor k=1:Mw1=sqrt(Q1(1,1))*randn;w2=sqrt(Q1(2,2))*randn;w=[w1;w2];xpart_minus(:,k)=ch*x_part(:,k)+l*w;r=sqrt(xpart_minus(1,k)^2+xpart_minus(3,k)^2);if xpart_minus(1,k)>0 thita=atan(xpart_minus(3,k)/xpart_minus(1,k));elsethita=atan(xpart_minus(3,k)/xpart_minus(1,k))+pi;endz_part=[r;thita];vhat=point_view_data(:,i)-z_part;                               %观测值和预测值的差if i==1q(i,k)=1/(2*pi*sqrt(point_Q2(1,1)*point_Q2(2,2)))*exp(-(vhat(1)^2/(2*point_Q2(1,1))+vhat(2)^2/(2*point_Q2(2,2))))*q0(k);  elseq(i,k)=1/(2*pi*sqrt(point_Q2(1,1)*point_Q2(2,2)))*exp(-(vhat(1)^2/(2*point_Q2(1,1))+vhat(2)^2/(2*point_Q2(2,2))))*q(i-1,k); endendqsum=sum(q(i,:));for k=1:Mq(i,k)=q(i,k)/qsum;                                 %  归一化权值end%x_part=xpart_minus;qsum2=q(i,:)*q(i,:)';Nff=1/qsum2;if Nff<2/3*Mu=rand/M_out; for k=1:M           qtempsum=0;for j=1:Mqtempsum=qtempsum+q(i,j);if qtempsum>= ux_part(:,k) = xpart_minus(:,j);u=u+1/M_out;break; endendendq(i,:)=ones(1,M)/M;elsex_part=xpart_minus;end%重采样有问题x_filt=zeros(4,1);for k=1:Mx_filt=q(k)*x_part(:,k)+x_filt;endfilter_data(:,i)=x_filt;end

四、运行结果

运行结果各图名称见实际运行的命名;





五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 沈再阳.精通MATLAB信号处理[M].清华大学出版社,2015.
[2]高宝建,彭进业,王琳,潘建寿.信号与系统——使用MATLAB分析与实现[M].清华大学出版社,2020.
[3]王文光,魏少明,任欣.信号处理与系统分析的MATLAB实现[M].电子工业出版社,2018.
[4]林志东.基于扩展卡尔曼滤波算法的SLAM问题分析[J].城市建筑. 2020,17(11)

【目标定位】基于matlab粒子滤波目标定位仿真【含Matlab源码 129期】相关推荐

  1. 【图像融合】基于matlab导向滤波图像融合【含Matlab源码 1959期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像融合]基于matlab导向滤波图像融合[含Matlab源码 1959期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  2. 【Matlab电力负荷预测】粒子群优化支持向量机短期电力负荷预测【含GUI源码 751期】

    一.代码运行视频(哔哩哔哩) [Matlab电力负荷预测]粒子群优化支持向量机短期电力负荷预测[含GUI源码 751期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  3. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  4. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  5. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  6. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  8. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  9. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  10. 【Matlab语音加密】语音信号加密解密(带面板)【含GUI源码 181期】

    一.代码运行视频(哔哩哔哩) [Matlab语音加密]语音信号加密解密(带面板)[含GUI源码 181期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆 ...

最新文章

  1. linux gcc编译参数顺序问题
  2. 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测...
  3. 关于Matconvnet中Conv-ReLU-Pool-NormBatch的总结与思考
  4. [PHP] PHP调用IMAP协议读取邮件类库
  5. python2.x文件编码
  6. 巧用TensorFlow实现图像处理
  7. redhat6.5 升级内核
  8. !--more--搭建的博客设置主页内容高度
  9. SQL Server FILESTREAM数据库损坏和修复
  10. 开课吧python小课学了有用吗-好消息!今天,审计、会计、税务、财务主管彻底沸腾了……...
  11. axios的http拦截
  12. 【语音识别】基于matlab GUI声纹识别【含Matlab源码 1022期】
  13. TransE算法原理与案例
  14. CocoaPods之Podfile\Podfile.lock
  15. Arduino-LiquidCrystal_I2C 液晶库
  16. 平面三角形外心坐标推导
  17. 更改Windows的鼠标滚动方式为Mac方式(win鼠标滚轮反向)
  18. 【论文阅读】Low-Resource Knowledge-Grounded Dialogue Generatio
  19. 【无标题】timescale为传输预设时间,使用geo和meo,为什么程序最后的预设时间加3呢?
  20. Windows中命令行收集

热门文章

  1. 轮询、长轮询、长连接、socket连接、WebSocket
  2. 企业管理中如何激励员工
  3. python学习记录 - python3.x中如何实现print不换行
  4. java基础 (六)面向对象(一)
  5. 解析大型.NET ERP系统 分布式应用模式设计与实现
  6. 情绪管理--不要总做“好脾气”的人。
  7. php以及Yii里面的常量收集
  8. uva10668二分解方程
  9. Java的日期格式化常用方法
  10. Java不适合于作为主要编程教学语言 -- 孟岩