卡尔曼滤波器学习笔记(一)
卡尔曼滤波器的原理及应用
最近在学习Probablistic Robotics这本书,获益良多。以前学了概率论和随机过程之后一直觉得这些是虚的,不知道在工程上怎么用,而这本书恰恰就是讲如何把这些概率理论和方差估计应用到工程上去,更确切的说,应用到机器人上去。
- 应用前提
- 算法详细介绍
- 应用举例
- 下一步
1.应用前提
要应用kalman Filter,首先要有三个前提假设:
当前状态的概率分布必须是上一状态和将要执行的控制量的线性函数,再叠加一个高斯噪声。表达式如下:
其中和是状态变量,如果系统有多个自由度的话,它们表示状态向量。这样的话根据高斯分布
可以得到状态转移概率
其中表示上一状态的均值,表示方差。
对状态的测量必须是状态的线性函数叠加高斯噪声
其含义与上类似,不再赘述。
初始状态分布为高斯分布
2.算法详细介绍
Kalman Filter五条黄金公式 :
这五条公式基本上就是Kalman Filter的主要内容了, 它的本质就是通过预测结合测量来估计当前系统的状态。举个lizi,假如我们要估计一架飞行器的姿态,可以通过IMU来实时测量,但是测量值有一定的风险是不准确的,所以并不能完全依赖传感器。任何一个满足物理规律的系统应当是连续的,所以我们还可以通过上一状态来预测当前状态。Kalman Filter正是结合这两条进行状态估计,到底是相信哪一个多一点,还要根据Kt来决定,我们定义Kt为卡尔曼增益,它是根据 测量和预测的协方差来计算的。
下面逐条解释:
line 2: 首先通过上一状态最优值和将要施加的控制量来预测当前状态,由假设一可以得到:
因为我们只是求均值,而高斯噪声均值为0,所以可省去最后一项。
line 3: 除了预测均值之外,我们还需要预测值的协方差来计算Kalman增益。
根据假设2,这条公式可以很容易得到。
line 4:准备工作完成之后,需要根据预测值的协方差,测量值和状态
的比例系数,测量值的协方差来计算Kalman增益。
具体证明需要用到假设中的高斯分布公式,因为我们只是应用,所以就不在blog中讨论啦,感兴趣的小伙伴可以看书中3.2.4节 Mathematical Derivation of the KF,里面讲的很详细,分享一下下载链接
http://download.csdn.net/detail/lizilpl/8632071。line 5:这一行可以说是Kalman Filter 的精华了,现在我们有了对状态的预测值和协方差,同时也收集到了对状态的测量值。这时就可以通过kalman增益来计算状态估计值了。
增益越大,表明我们越相信测量值。
line 6: 根据 line3 ,预测当前状态需要用到上一状态的协方差,所以我们还需要计算当前状态的协方差用于下一次迭代。它同样要根据Kalman增益来计算:
相信到这里,大家应该对kalman Filter的原理有了一个大致的了解,算法中,从初始状态开始,不断计算当前状态的均值和方差来迭代,直至系统结束。
3.应用实例
% 初始化参数 n_iter = 100; %计算连续n_iter个时刻 sz = [n_iter, 1]; x = 24; % 温度的真实值 Q = 4e-4; % 对温度预测值的方差 R = 0.25; % 测量方差,反应温度计的测量精度 T_start = 23.5; %温度初始估计值 delta_start = 1; %温度初始估计方差 z = x + sqrt(R)*randn(sz); % z是温度计的测量结果,在真实值的基础上加上了方差为0.25的高斯噪声。 % 初始化数组 state_kalman=zeros(sz); % 对温度的估计值。即在k时刻,结合温度计当前测量值与k-1时刻预测值,得到的最终估计值 variance_kalman=zeros(sz); % 估计值的方差 state_pre=zeros(sz); % 对温度的预测 variance_pre=zeros(sz); % 预测值的方差 K=zeros(sz); % 卡尔曼增益 state_kalman(1) = T_start; %温度估计值初始化 variance_kalman(1) =delta_start; %估计值方差初始化 % %开始迭代计算 for k = 2:n_iter state_pre(k) = state_kalman(k-1); %用上一时刻的最优估计值来作为对当前时刻的温度的预测 variance_pre(k) = variance_kalman(k-1)+Q; %预测的方差为上一时刻温度最优估计值的方差与高斯噪声方差之和 % %计算卡尔曼增益 K(k) = variance_pre(k)/( variance_pre(k)+R ); % %结合当前时刻温度计的测量值,对上一时刻的预测进行校正,得到校正后的最优估计。由于是直接测量,故C为1. state_kalman(k) = state_pre(k)+K(k)*(z(k)-state_pre(k)); variance_kalman(k) = (1-K(k))*variance_pre(k); %计算最终估计值的方差用于下一次迭代 end %绘图相关。。。。。 FontSize=14; LineWidth=3; figure(); plot(z,'k+'); %画出温度计的测量值 hold on; plot(state_kalman,'b-','LineWidth',LineWidth) %画出最优估计值 hold on; plot(x*ones(sz),'g-','LineWidth',LineWidth); %画出真实值 legend('温度测量值', 'Kalman估计值', '真实值'); xl=xlabel('时间(分钟)'); yl=ylabel('温度'); set(xl,'fontsize',FontSize); set(yl,'fontsize',FontSize); hold off; set(gca,'FontSize',FontSize); figure(); valid_iter = [2:n_iter]; % variance_pre not valid at step 1 plot(valid_iter,variance_kalman([valid_iter]),'LineWidth',LineWidth); %画出最优估计值的方差 legend('Kalman估计的误差估计'); xl=xlabel('时间(分钟)'); yl=ylabel('℃^2'); set(xl,'fontsize',FontSize); set(yl,'fontsize',FontSize); set(gca,'FontSize',FontSize);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
“`
运行结果如下:
由结果可以看出来,虽然测量值噪声很大,但Kalman Filter的预测值还是逐渐逼近了真实温度,并且估计值的方差逐渐收敛!
4.下一步
如上讨论,经典的卡尔曼滤波只适用于线性且满足高斯分布的系统,但实际工程中并不是这么简单,比如飞行器在水平运动时有可能伴随着自身的自旋,这时就需要应用扩展卡尔曼滤波(EKF)来解决这种情况。等我研究完之后和大家分享。
卡尔曼滤波器学习笔记(一)相关推荐
- 卡尔曼滤波器学习笔记(二)
扩展卡尔曼滤波器的原理及应用 经典的卡尔曼滤波只适用于线性且满足高斯分布的系统,但实际工程中并不是这么简单,比如飞行器在水平运动时有可能伴随着自身的自旋,此时的系统并不是线性的,这时就需要应用扩展卡尔 ...
- 【滤波器学习笔记】一阶RC低通滤波
一阶RC低通滤波 从模拟到数字 本文整理自网络.<匠人手记>等书籍文章 模拟电路低通滤波时域.频域 软件低通滤波 典型电路 图1 典型RC电路 直流.交流.脉冲信号都可以用它 时域 电容电 ...
- 卡尔曼滤波与组合导航原理_图解卡尔曼滤波器,无需深厚的数学知识也易懂(第五部分:多维卡尔曼滤波器)...
译者前言:因第1-4部分(基础)已经学习完毕,接下来需要学习多维卡尔曼滤波器与扩展的卡尔曼滤波器(EKF),但是1-4部分的作者对接下来要学习的内容还没有更新,因此我们将从华盛顿大学教授的教材开始学习 ...
- SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解
之前在SLAM14讲学习笔记(六)后端(最难一章:卡尔曼滤波器推导.理解以及扩展)中,介绍了卡尔曼滤波器的推导. 但是感觉不太直观,因此这次用了几个简单的图,希望能一目了然卡尔曼滤波器是在干什么. 先 ...
- 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解
优达学城<无人驾驶入门>的第二个项目是实现矩阵类,要求通过python编写一个用来计算矩阵的类Matrix.编写这个类并不难,涉及到的线性代数方面的知识也不多,比如矩阵的加法.减法.乘法, ...
- 卡尔曼滤波器1——递归算法(笔记篇 + 代码实现)
前言 本文是观看DR_CAN老师的视频后,简单总结了一下的笔记,并根据思路写了示例代码:这里主要讲卡尔曼滤波器与递归算法. 视频地址:https://www.bilibili.com/video/BV ...
- 卡尔曼滤波器2——数据融合(笔记篇 + 代码实现)
前言 本文是观看DR_CAN老师的视频后,简单总结了一下的笔记,并根据思路写了示例代码:这里主要讲使用卡尔曼滤波器进行数据融合. 视频地址:[卡尔曼滤波器]2_数学基础_数据融合_协方差矩阵_状态空间 ...
- OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...
- AI学习笔记(七)图像滤波器、OpenCV算法解析
AI学习笔记之图像滤波器.OpenCV算法解析 图像滤波器 图像噪声 噪声的产生 信噪比 高斯噪声 椒盐噪声 其他噪声 图像滤波 滤波的目的 滤波的要求 各种滤波器 均值滤波 中值滤波 最大最小值滤波 ...
最新文章
- python英语-我们用程序整理出了一份Python英语高频词汇表,拿走不谢!
- spark sql定义RDD、DataFrame与DataSet
- 使用自定义DelegatingHandler编写更整洁的Typed HttpClient
- javascript运算符_JavaScript中!=或!==运算符之间的区别
- CarAppFocusManager
- 三、gridView增删改查
- 中小企业如何搭建数据分析平台?
- tomcat 配置https 访
- CentOS 8 安装Tomcat
- odb对象关系映射系统
- sql数据库去重语法_SQL如何去重?
- splunk篇5-导出csv文件中文乱码
- 所见所得的OFFICE功能区编辑器(自定义界面编辑)RibbonCreator
- Python之freshman08 Socket
- 2021-2027全球与中国牛肉罐头市场现状及未来发展趋势
- 抱歉,Xposed真的可以为所欲为——2.改为OV机型流畅玩耍高帧率王者农药
- 在Windows Server 2008系统环境下无损调整分区
- The missing semester of your CS education--调试及性能分析
- 资料员培训建筑八大员培训资料员港航工程资料管理存在的问题
- Mozilla XUL分析
热门文章
- JavaScript中闭包实现的私有属性的getter()和setter()方法
- BZOJ 2742: [HEOI2012]Akai的数学作业
- SQL查询语句执行速度快,存储过程执行慢
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
- [翻译]XNA外文博客文章精选之sixteen(中)
- 编写高性能Web应用程序的10个技巧
- 制作WEB在线编辑器-插入HTML标签
- XSSFORK:新一代XSS自动扫描测试工具(精)
- abap 生成流水号每天从1开始_条码软件如何制作循环流水号
- [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)