1 简介

  由卡尔曼这个学者提出的最佳线性滤波器,单纯时域维度即可实现【无需进行频域变换】

2 思路

  由上一时刻的最佳估计值XKE_P预测①当前时刻预测值Pxv  与  ②当前时刻的测量值Mxv  进行联立计算获得当  ③前时刻的最佳估计值XKE

3 核心

4 Matlab实例

4.1 题目【老师留的课堂作业】

研一的时候做过一次,当时没有总结;最近师弟们在写这个作业花时间重新弄了一遍,做了一次总结

4.2 源代码

不带BU参数

version9_release.m

  1. %% 卡尔曼滤波的发布版本程序
  2. %% 时间:2019.12.05
  3. %% 版本:v9
  4. %% 特性:单参处理【防止多维度计算混乱】
  5. %% TODO:引入多参数进一步优化算法
  6.  
  7. %% 数据读取
  8. % MDistance=importdata('RoverMeasurementData.txt');
  9. Mxv=importdata('data3.mat'); % 笛卡尔坐标系,测量值
  10. Txv=importdata('RoverTrueStates.txt'); % 真实值
  11. len=size(Mxv,1);
  12.  
  13. %% 参数设置
  14. q=0.010000 ; R=0.500000;
  15.  
  16. Q=[1 0;0 1].*q;
  17.  
  18. %% 正式处理
  19. XKE=zeros(4,len);
  20. for i=1:len
  21. xv = func_kalmanFilter_singleVal(Mxv(i,1),Q,R,i);
  22. XKE(1,i)=xv(1);
  23. XKE(3,i)=xv(2);
  24. end
  25.  
  26. for i=1:len
  27. xv = func_kalmanFilter_singleVal(Mxv(i,2),Q,R,i);
  28. XKE(2,i)=xv(1);
  29. XKE(4,i)=xv(2);
  30. end
  31.  
  32. %% 图谱显示
  33. figure(1);
  34. plot(Txv(1,:),Txv(2,:),'r-*','markersize',8),hold on;
  35. plot(XKE(1,:),XKE(2,:),'b-s','markersize',8),hold on;
  36. plot(Mxv(:,1),Mxv(:,2),'g-v','markersize',8),hold on;
  37. xlabel('位置x');
  38. ylabel('位置y');
  39. legend({'真实值','估计值','测量值'},'Location','northwest');%
  40. set(gca,'FontSize',25);
  41.  
  42. figure(2);
  43. sub_XKE=sqrt((XKE(1,:)-Txv(1,:)).^2+(XKE(2,:)-Txv(2,:)).^2);
  44. sub_Mxv=sqrt((Mxv(:,1)'-Txv(1,:)).^2+(Mxv(:,2)'-Txv(2,:)).^2);
  45. plot(sub_XKE,'b-s','markersize',8),hold on;
  46. plot(sub_Mxv,'g-v','markersize',8),hold on;
  47. xlabel('时间t');
  48. ylabel('与真实值的距离均方差d');
  49. legend({'估计值误差','测量值误差'},'Location','northwest');%
  50. set(gca,'FontSize',25);
  51. % print -djpeg -r600 不带BU位置点;
  52. % print -djpeg -r600 不带BU方差值;

  

version10_release.m

  1. %% 卡尔曼滤波的发布版本程序
  2. %% 时间:2019.12.05
  3. %% 版本:v9
  4. %% 特性:单参处理【防止多维度计算混乱】
  5. %% TODO:引入多参数进一步优化算法
  6.  
  7. %% 数据读取
  8. % MDistance=importdata('RoverMeasurementData.txt');
  9. Mxv=importdata('data3.mat'); % 笛卡尔坐标系,测量值
  10. Txv=importdata('RoverTrueStates.txt'); % 真实值
  11.  
  12. %% 参数设置
  13. MCN=20;
  14. d_range1=0.01;
  15. d_range2=0.01;
  16.  
  17. q=0:d_range1:1;
  18. R=0:d_range2:0.5;
  19.  
  20. len1=size(q,2);
  21. len2=size(R,2);
  22.  
  23. Q=[1 0;0 1];
  24.  
  25. %% 正式处理
  26. sub_map=zeros(1,len1*len2);
  27. len=len1*len2;
  28. tic;
  29. t1=toc;
  30. % for k=1:len
  31. parfor k=1:len
  32. i=mod(k-1,len1)+1; %行号
  33. j=floor((k-1)/len1)+1; %列号
  34. sub_map(k)=func_kalmanFilter_doubleVal(Mxv,Txv, Q.*q(1,i), R(1,j), MCN);
  35. fprintf('run is going on k=%d,index=(%d, %d)\n',k,i,j);
  36. end
  37. t2=toc;
  38. fprintf('耗时t=%f\n',(t2-t1));
  39.  
  40. %% 获取当前最优解
  41. sub_min=min(sub_map);
  42. k=find(sub_map==sub_min);
  43. i=mod(k-1,len1)+1; %行号
  44. j=floor((k-1)/len1)+1; %列号
  45. Eq=q(1,i);
  46. ER=R(1,j);
  47. fprintf('当前最优解 q=%f ; R=%f ,sub=%f\n',Eq,ER,sub_min);
  48.  
  49. %% 显示图谱
  50. sub_map=reshape(sub_map,len1,len2);
  51. [X,Y]= meshgrid(q,R);
  52. figure(1);
  53.  
  54. mesh(X',Y',sub_map);
  55. xlabel('Q预测模型噪声');
  56. ylabel('R观测噪声');
  57.  
  58. %% 最优数值解1
  59. % q=0.017;
  60. % R=3.6;
  61. % sub=32.0530;
  62.  
  63. % 当前最优解 q=0.010000 ; R=0.500000 ,sub=44.573339

  

带BU参数

version11_release.m

  1. %% 卡尔曼滤波的发布版本程序
  2. %% 时间:2019.12.05
  3. %% 版本:v11
  4. %% 特性:引入加速度参与计算
  5. %% TODO:引入多参数进一步优化算法
  6.  
  7. %% 数据读取
  8. % MDistance=importdata('RoverMeasurementData.txt');
  9. Mxv=importdata('data3.mat'); % 笛卡尔坐标系,测量值
  10. Txv=importdata('RoverTrueStates.txt'); % 真实值
  11. len=size(Mxv,1);
  12.  
  13. %% 参数设置
  14. % q=0.006000;
  15. % R=1.270000 ;
  16. % q=0.006000 ; R=0.010000 ;
  17. % q=0.030000 ; R=0.050000 ;
  18. % q=0.030000 ; R=0.050000;
  19. q=0.040000 ; R=0.050000;
  20. Q=[1 0;0 1].*q;
  21.  
  22. %% 正式处理
  23. XKE=zeros(4,len);
  24. for i=1:len
  25. xv = func_kalmanFilter_singleVal_withBU(Mxv(i,1),Q,R,i);
  26. XKE(1,i)=xv(1);
  27. XKE(3,i)=xv(2);
  28. end
  29.  
  30. for i=1:len
  31. xv = func_kalmanFilter_singleVal_withBU(Mxv(i,2),Q,R,i);
  32. XKE(2,i)=xv(1);
  33. XKE(4,i)=xv(2);
  34. end
  35.  
  36. %% 图谱显示
  37. figure(1);
  38. plot(Txv(1,:),Txv(2,:),'r-*','markersize',8),hold on;
  39. plot(XKE(1,:),XKE(2,:),'b-s','markersize',8),hold on;
  40. plot(Mxv(:,1),Mxv(:,2),'g-v','markersize',8),hold on;
  41. xlabel('位置x');
  42. ylabel('位置y');
  43. legend({'真实值','估计值','测量值'},'Location','northwest');%
  44. set(gca,'FontSize',25);
  45.  
  46. figure(2);
  47. sub_XKE=sqrt((XKE(1,:)-Txv(1,:)).^2+(XKE(2,:)-Txv(2,:)).^2);
  48. sub_Mxv=sqrt((Mxv(:,1)'-Txv(1,:)).^2+(Mxv(:,2)'-Txv(2,:)).^2);
  49. plot(sub_XKE,'b-s','markersize',8),hold on;
  50. plot(sub_Mxv,'g-v','markersize',8),hold on;
  51. xlabel('时间t');
  52. ylabel('与真实值的距离均方差d');
  53. legend({'估计值误差','测量值误差'},'Location','northwest');%
  54. set(gca,'FontSize',25);
  55. % print -djpeg -r600 BU位置点;
  56. % print -djpeg -r600 BU方差值;

  

version12_release.m

  1. %% 卡尔曼滤波的发布版本程序
  2. %% 时间:2019.12.05
  3. %% 版本:v9
  4. %% 特性:单参处理【防止多维度计算混乱】
  5. %% TODO:引入多参数进一步优化算法
  6.  
  7. %% 数据读取
  8. % MDistance=importdata('RoverMeasurementData.txt');
  9. Mxv=importdata('data3.mat'); % 笛卡尔坐标系,测量值
  10. Txv=importdata('RoverTrueStates.txt'); % 真实值
  11.  
  12. %% 参数设置
  13. MCN=20;
  14. d_range1=0.01;
  15. d_range2=0.01;
  16.  
  17. q=0:d_range1:1;
  18. R=0:d_range2:0.5;
  19.  
  20. len1=size(q,2);
  21. len2=size(R,2);
  22.  
  23. Q=[1 0;0 1];
  24.  
  25. %% 正式处理
  26. sub_map=zeros(1,len1*len2);
  27. len=len1*len2;
  28. tic;
  29. t1=toc;
  30. % for k=1:len
  31. parfor k=1:len
  32. i=mod(k-1,len1)+1; %行号
  33. j=floor((k-1)/len1)+1; %列号
  34. sub_map(k)=func_kalmanFilter_doubleVal_withBU(Mxv,Txv, Q.*q(1,i), R(1,j), MCN);
  35. fprintf('run is going on k=%d,index=(%d, %d)\n',k,i,j);
  36. end
  37. t2=toc;
  38. fprintf('耗时t=%f\n',(t2-t1));
  39.  
  40. %% 获取当前最优解
  41. sub_min=min(sub_map);
  42. k=find(sub_map==sub_min);
  43. i=mod(k-1,len1)+1; %行号
  44. j=floor((k-1)/len1)+1; %列号
  45. Eq=q(1,i);
  46. ER=R(1,j);
  47. fprintf('当前最优解 q=%f ; R=%f ,sub=%f\n',Eq,ER,sub_min);
  48.  
  49. %% 显示图谱
  50. sub_map=reshape(sub_map,len1,len2);
  51. [X,Y]= meshgrid(q,R);
  52. figure(1);
  53.  
  54. mesh(X',Y',sub_map);
  55. xlabel('Q预测模型噪声');
  56. ylabel('R观测噪声');
  57.  
  58. %% 最优数值解1
  59. % q=0.017;
  60. % R=3.6;
  61. % sub=32.0530;
  62.  
  63. % 当前最优解 q=0.040000 ; R=0.050000 ,sub=57.511923

  

func_kalmanFilter_doubleVal

  1. %% 参数比较数据QR的数据比较
  2.  
  3. function [sub_mean] = func_kalmanFilter_doubleVal(Mxv,Txv, Q, R, MCN)
  4.  
  5. sub_cell=zeros(1,MCN);
  6. len=size(Mxv,1);
  7. XKE=zeros(4,len);
  8. for iRun=1:MCN
  9.  
  10. %% 处理数据
  11. for i=1:len
  12. xv = func_kalmanFilter_singleVal(Mxv(i,1),Q,R,i);
  13. XKE(1,i)=xv(1);
  14. XKE(3,i)=xv(2);
  15. end
  16.  
  17. for i=1:len
  18. xv = func_kalmanFilter_singleVal(Mxv(i,2),Q,R,i);
  19. XKE(2,i)=xv(1);
  20. XKE(4,i)=xv(2);
  21. end
  22.  
  23. %% 计算均方差和
  24. sub=sqrt((XKE(1,end-50:end)-Txv(1,end-50:end)).^2+(XKE(2,end-50:end)-Txv(2,end-50:end)).^2);
  25. sub_cell(1,iRun)=sum(sub);
  26. end
  27. sub_mean=mean(sub_cell);
  28.  
  29. end

  

func_kalmanFilter_singleVal

  1. %% 单参卡尔曼滤波函数
  2.  
  3. function [XKE] = func_kalmanFilter_singleVal(Z,Q,R,iLoop)
  4. %FUNC_KALMANFILTER_ 此处显示有关此函数的摘要
  5. % 此处显示详细说明
  6. persistent X;
  7. persistent P;
  8. persistent F;
  9. persistent H;
  10. if iLoop==1
  11. X=[0;0];
  12. P=[1 0;0 1];
  13. F=[1 1;0 1];
  14. H=[1 0];
  15. end
  16.  
  17. X_=F*X;
  18. P_=F*P*F'+Q;
  19. K=P_*H'/(H*P_*H'+R);
  20. X=X_+K*(Z-H*X_);
  21. P=(eye(2)-K*H)*P_;
  22. XKE=X;
  23. end

  

func_kalmanFilter_doubleVal_withBU

  1. %% 参数比较数据QR的数据比较
  2.  
  3. function [sub_mean] = func_kalmanFilter_doubleVal_withBU(Mxv,Txv, Q, R, MCN)
  4.  
  5. sub_cell=zeros(1,MCN);
  6. len=size(Mxv,1);
  7. XKE=zeros(4,len);
  8. for iRun=1:MCN
  9.  
  10. %% 处理数据
  11. for i=1:len
  12. xv = func_kalmanFilter_singleVal_withBU(Mxv(i,1),Q,R,i);
  13. XKE(1,i)=xv(1);
  14. XKE(3,i)=xv(2);
  15. end
  16.  
  17. for i=1:len
  18. xv = func_kalmanFilter_singleVal_withBU(Mxv(i,2),Q,R,i);
  19. XKE(2,i)=xv(1);
  20. XKE(4,i)=xv(2);
  21. end
  22.  
  23. %% 计算均方差和
  24. sub=sqrt((XKE(1,end-50:end)-Txv(1,end-50:end)).^2+(XKE(2,end-50:end)-Txv(2,end-50:end)).^2);
  25. sub_cell(1,iRun)=sum(sub);
  26. end
  27. sub_mean=mean(sub_cell);
  28.  
  29. end

  

func_kalmanFilter_singleVal_withBU

  1. %% 带加速度参数的卡尔曼滤波器
  2.  
  3. function [XKE] = func_kalmanFilter_singleVal_withBU(Z,Q,R,iLoop)
  4. %FUNC_KALMANFILTER_SINGLEVAL_WITHBU 此处显示有关此函数的摘要
  5. % 此处显示详细说明
  6. persistent X; % 位置与速度
  7. persistent U; % 加速度
  8. persistent P; % 协方差矩阵
  9. persistent F; % 状态转移矩阵
  10. persistent B; % 状态控制矩阵
  11. persistent H; % 观测矩阵
  12. if iLoop==1
  13. X=[0;0];
  14. U=0;
  15. P=[1 0;0 1];
  16. F=[1 1;0 1];
  17. B=[1./2;1];
  18. H=[1 0];
  19. end
  20.  
  21. X_=F*X+B*U; % 状态预测公式
  22. P_=F*P*F'+Q; % ② 噪声协方差传递
  23. K=P_*H'/(H*P_*H'+R); % ③ 卡尔曼系数计算
  24. XK=X;%暂存前一时刻数据
  25. X=X_+K*(Z-H*X_); % ④ 计算最优估计值
  26. P=(eye(2)-K*H)*P_; % ⑤ 噪声协方差矩阵更新
  27. U=X(2,1)-XK(2,1);
  28. XKE=X;
  29.  
  30. end

  

4.3 结果显示

不带控制参数的位置点数据图谱:

不带控制参数的方差值图谱:

带控制参数的位置点数据图谱:

带控制参数的方差值图谱:

5 总结

  性能确实还可以的,里面的难点在于各个矩阵运算以及Q、R参数的设定,这里我是使用随机参数法,广撒网多次蒙特卡洛仿真求均值,最后在这些参数中选择最优的那个解为我的模型参数。

6 相关链接

开源代码:

链接:https://pan.baidu.com/s/1fUM0VmPVabqKv89WUyZmng  提取码:x3zv

参考链接:

https://www.jianshu.com/p/f6ce8943560c?from=singlemessage

https://www.youtube.com/watch?v=2-lu3GNbXM8

滤波器算法(1)-卡尔曼滤波小车附带题目与MATLAB程序的更多相关文章

  1. 链表算法题二,还原题目,用debug调试搞懂每一道题

    文章简述 大家好,本篇是个人的第4篇文章. 承接第3篇文章<开启算法之路,还原题目,用debug调试搞懂每一道题>,本篇文章继续分享关于链表的算法题目. 本篇文章共有5道题目 一,反转链表 ...

  2. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  3. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  4. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  5. KFCM算法的matlab程序

    KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...

  6. FCM算法的matlab程序2

    FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...

  7. FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  8. K-means算法的matlab程序

    K-means算法的matlab程序 在“K-means算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 ...

  9. FCM算法的matlab程序(初步)

    FCM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648430.html文章中已经介绍了FCM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

随机推荐

  1. Vue实现图片预加载

    <script>export default { data () { return { count: 0, } }, mounted: function() { this.preload( ...

  2. python+opencv抠图并旋转(根据坐标抠图)

    import cv2 import numpy as np def subimage(image, center, theta, width, height): theta *= np.pi / 18 ...

  3. [转]java生成 excel 并导出文件

    原文:https://blog.csdn.net/xunwei0303/article/details/53213130 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta P ...

  4. c语言字符串分割函数(转)

    源:C语言实现split以某个字符分割一个字符串 void split(char *src, const char *separator, char **dest, int *num) { /* sr ...

  5. pyqt5界面

    用pyqt5做了一个小程序,保留一下这个固定格式: import sys from PyQt5 import uic, QtGui from PyQt5.QtGui import QWindow fr ...

  6. centos7.6下编译安装zabbix4.0.10长期支持版

    一.安装数据库,这里使用的是percona-server5..24版本 配置如下 [root@zabbix4_clone:~]# cat /etc/my.cnf # Example MySQL con ...

  7. 读《中国人工智能与 IJCAI 的 40 周年,还有哪些未曾对外诉说的故事?》

    原文地址: https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_10186783044528 ...

  8. 泡泡一分钟:FMD Stereo SLAM: Fusing MVG and Direct Formulation Towards Accurate and Fast Stereo SLAM

    FMD Stereo SLAM: Fusing MVG and Direct Formulation Towards Accurate and Fast Stereo SLAM FMD Stereo ...

  9. Linux系统调优——系统整体运行状态排查(七)

    (1).vmstat vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的整体状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写 ...

  10. expect 实现自动交互脚本

    1. 说明 在编写脚本时,可能会遇到需要在另一台主机上执行一个命令,或者在本机拷贝另一台主机内的一个文件.如果两台主机之间没有做互信,就会牵扯到用户输入密码的交互过程,这对编写自动脚本来说, 就行不通 ...