卡尔曼滤波是很很常用的预测和估计方法,自己学习了也挺久,这里将自己写的卡尔曼滤波函数分享一下。卡尔曼滤波的讲解网上有很多,这里不对此进行叙述,只是对MATLAB中的函数做讲解。函数主体来自https://blog.csdn.net/u012936940/article/details/76805526,我在此基础上进行了补充和注释,并且写成了函数。链接里面也有关于卡尔曼滤波原理的解释,说明简单清晰,我看了以后也有了更深的理解。

代码部分

function  Xkf= KaermanFilter(InitX,Z,F,Q,H,R,P0)
%KAERMANFILTER 此处显示有关此函数的摘要
%参数说明: InitX:X的初始值,不知道初始值就输入零向量
%           Z:输入测量得到的数据
%           F:状态转移矩阵
%           H:观测矩阵
%           Q:协方差矩阵,反映状态受外界影响的大小
%           R:测量协方差矩阵,反映测量的精度,取决于传感器
%读取数据
X=InitX;
%数据点数目
[l,s]=size(X);%获取数据维数
L=length(Z);
%初始化观测值矩阵
Xkf=zeros(L,s);
Xkf(:,1)=X(:,1);
P=P0;
%滤波
for i=2:LXn=F*(Xkf(i-1,:)');%一步预测P=F*P*F'+Q;%一步预测误差方差阵K=P*H'*inv(H*P*H'+R);;%滤波增益矩阵(权重)Xkf(i,:)=Xn+K*(Z(i,:)-H*Xn);%状态误差方差阵估计P=(eye(s)-K*H)*P;
end
fig=figure(1);
set(fig,'position',[200 200 1200 500]);
hold on;
plot(Z(:,1),'-b.','MarkerSize',1);
hold on;
plot(Xkf(:,1),'-r','MarkerSize',1);
legend('观测轨迹','滤波轨迹');
end

结合例题讲解

其实理解卡尔曼滤波函数,主要就是理解中间的递推过程,而关键的就是理解各个参数是什么意思,或者记住怎么计算就可以了。

例题一

例题一比较简单,是我看的书上的一个例子,可以自己手算。
先给出题目和题目的解答:
(中间的delta表示克罗尼克函数,就是i和j相等的时候为1,不等的时候为0)



然后将相应条件转换为MATLAB中的矩阵

X=1;
Z=[0 2 4 3 2]';%题中X是从零时刻开始,但是Z零时刻的值不影响计算,因为X零时刻X的值是准确值,Z(0)不需要参与计算
Q=2;
R=1;
P=4;
A=2;
H=1;
KaermanFilter(X,Z, A, Q, H, R,P)

结果:
Z(0)为0时候的结果:

Z(0)为1时候的结果:

可以看到,计算的结果和手算的是一样的,并且Z(0)的取值不影响最终的结果。

例题二

例题二的数据来源于真实测量的数据,是人体运动时候盆骨的坐标,这个例子可能更接近实际应用。
ps:这里数据是师兄采集的,我只是借用一下其中一组。
链接: https://pan.baidu.com/s/1EpoCpGluIeNkeruDpZ8XXA 提取码: ccgq

clf
Z=data;
r=0.0005;
for i=1:length(Z)Z(i)=data(i)+normrnd(0,1)*r;
end
D=Z-data;
X=Z(1);
T=0.001;
V=0.1;
Q=T^2*V^2 ;
R=r^2;
P=X^2;
A=1;
H=1;
Xn=KaermanFilter(X,Z, A, Q, H, R,P);
plot(data,'g');
RMS(Z,data);
RMS(Xn,data);

对参数的选择做简单的说明,这里的单位是米。
由于数据已经经过滤波,所以将数据作为理想的轨迹,在理想轨迹上加偏差得到采样值。
由于人运动的状态方程是非线性的,且是未知的,把人的速度当成是一个随机的变量处理
因此得到递推方程
X(k+1)=AX(k)+V×v(k)×ΔTX(k+1)=AX(k)+V\times v(k)\times\Delta T X(k+1)=AX(k)+V×v(k)×ΔT
将速度视为随机变量,服从正态分布,方差为1,采样的时间间隔为0.001秒,考虑人体运动的速度,取V为适当的速度幅值,这里为0.1。于是得到方程
X(k+1)=X(k)+0.0001×w(k)X(k+1)=X(k)+0.0001\times w(k) X(k+1)=X(k)+0.0001×w(k)

Z(k)=X(k)+u(k)∗rZ(k)=X(k)+u(k)*rZ(k)=X(k)+u(k)∗r
其中w(k)和v(k)w(k)和v(k)w(k)和v(k)都是标准正态分布,r是采集的精度,取0.001。

结果

其实结果表现得不是十分好,因为本身这个数据用卡尔曼滤波来做不是十分合适,只是为了使用卡尔曼滤波而是用卡尔曼滤波。一般的卡尔曼滤波用在已知的线性系统里还是比较好用的。

最后

这次主要是对卡尔曼滤波进行一下个人总结,在写博客的过程中,对此理解又加深了不少, 也希望可以帮助到其他人。

MATLAB的卡尔曼滤波函数与实例相关推荐

  1. Matlab学习卡尔曼滤波的各种实例代码 KF,EKF,UKF,CKF

    Matlab学习卡尔曼滤波的各种实例代码 KF,EKF,UKF,CKF 本人硕士写的,有简单版本的纯m代码,也有进阶学习的Sfunction代码,以及simulink模型代码,代码附有详细的注释编号: ...

  2. matlab遗传算法函数实例,matlab遗传算法工具箱函数及实例讲解

    gaotv5 核心函数: (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 [输出参数] p ...

  3. matlab中fmincon函数应用实例,matlab中fmincon函数的使用

    一个朋友出了一个人工智能的教程,风格有特色,内容很全面,你想找的人工智能相关的基础知识里面应该都能找到. 内容讲解傻瓜化,通俗易懂,适合高中基础的小白入门.有点像看小说一样.点这里可以跳转到教程. f ...

  4. VC调用matlab中定义的.m文件中的函数的实例

    Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...

  5. matlab画图入门篇--各种基本图形绘制的函数与实例【转载】

    MATLAB画图入门篇--各种基本图形绘制的函数与实例 一. 二维图形(Two dimensional plotting) 1. 基本绘图函数(Basic plotting function):Plo ...

  6. matlab log函数怎么使用,matlab对数函数的用法和实例,来充电吧

    有时候我们在用matlab计算的时候,想使用对数函数,怎么用呢,下面来分享一下方法 工具/材料 matlab 对数函数的用法和实例 操作方法 01 第一步首先介绍自然数对数log(x),电脑中打开ma ...

  7. matlab数组求一阶导数,用matlab求符号函数数组或函数矩阵的导数实例教程

    用matlab求符号函数数组或函数矩阵的导数实例教程 在符号矩阵中,矩阵的每个元素都可以存放符号函数,这是对符号函数数组的求到运算是对数组元素逐个进行的.接下来就以实例向大家介绍一下用matlab对符 ...

  8. matlab语言unique,Matlab的unique函数的C++实现

    Matlab中的unique函数,实现的是去除重复元素,只保留一个,且剩下的非重元素按大小排列: C++中stl::unique函数与其不同之处在于:是去除相邻的重复元素,且不改变向量大小,把重复元素 ...

  9. Matlab基本函数-conj函数

    Matlab基本函数-conj函数 1.conj函数:用于计算复数的共轭值 2.用法说明:y=conj(x)函数计算复数x的共轭值.输出结果y的维数跟输入x的维数一致,返回值为:real(y)-i*i ...

  10. matlab中fprintf函数的具体使用方法

    matlab中fprintf函数的具体使用方法实例如下: fprintf函数可以将数据按指定格式写入到文本文件中.其调用格式为: 数据的格式化输出:fprintf(fid, format, varia ...

最新文章

  1. python3.7.3 离线安装paramiko_centos7 python3 安装paramiko模块
  2. 【Java】在Eclipse中使用JUnit4进行单元测试(初级篇)
  3. C语言中面向对象编程
  4. 让电流检测更精确的AMR技术
  5. mybatis的mysql参数传递参数_mybatis 传递参数的方法总结
  6. [设计模式] ------ 原型模式(浅拷贝和深拷贝)
  7. [Vue warn]: Failed to mount component: template or render function not defined. (found in root insta
  8. oracle的分支语句,Oracle中的分支语句
  9. oracle exp空数据表,Oracle11g中Exp空表的问题
  10. 拓端tecdat|R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
  11. PyTorch实战 | 文本情感分类任务 | LSTM与LSTM+Attention | TextCNN
  12. Freenom免费域名申请
  13. 【课程作业】情感分析方向SKEP: Sentiment Knowledge Enhanced Pretraining for Sentiment Analysis阅读报告
  14. 射频中IM3、IIP3、OIP3、G、P1dB指标计算
  15. 数组的c语言代码带注释,C语言之数组
  16. 新闻发布系统-用户登录.模糊分页查询
  17. 做了6年开发,工资涨不上去,怎么办?
  18. 日拱一卒——LeetCode 844.比较含退格的字符串
  19. VMware Workstation 安装 CentOS-7 (1804) 教程
  20. nvm npm nrm的简单理解

热门文章

  1. android int 字节数组,android 将int转byte,byte转int的两种方法
  2. 170925_Spring Cloud 微服务实战(翟永超著) 读书笔记(二)_什么是Spring Cloud Eureka?
  3. 虚拟仿真港珠澳大桥,大湾区综合管理信息系统
  4. 人工神经网络matlab啊6,基于MATLAB6.x的BP人工神经网络的土壤环境质量评价方法研究...
  5. 《C陷阱与缺陷》学习笔记(1):这本书值得看吗?
  6. 磁盘被写保护解除方法
  7. 论文笔记 - 《Deep Learning》(Yann LeCun Yoshua Bengio Geoffrey Hinton)经典
  8. uniyu 雷达波束_Unity使用TUIO协议接入雷达
  9. termios结构体详解
  10. Office 检测到一个与此文件相关的问题为帮助保护您的计算机,无法打开此文件。