概述

首先明确一下卡尔曼滤波的基本概念:可参考知乎诸位大神的“如何通俗易懂地描述卡尔曼滤波“,这里我也稍微说明一下。
所谓卡尔曼滤波就是当你在测量一个值时,同时拥有模型估计和直接测量两种方式,但是两种方式都不太准确,于是就可以用卡尔曼增益系数来分配两种方式的可信度权重,以得出新的估计值,并以新估计值为基础,更新卡尔曼增益系数重新分配权重,逐步逼近真实值。卡尔曼增益系数却决于两种方式的方差,哪个更靠谱就更相信哪个。
以下三个公式用倒推的方法说明如何实现卡尔曼滤波。


公式一:用上一步的估计值更准确地求这一步的估计值

X[i+1]=(1-K[i+1])x[i]+K[i+1]*z[i+1]
x即估计值,z即测量值。
可以看出,这次的估计值是由上次的估计值和这次的测量值共同决定的,这两者所占权重由K决定,K就是我们说的卡尔曼增益系数。


公式二:卡尔曼增益系数怎么来

K[i+1]=(P[i]+Q)/(P[i]+Q+R)
P是上一次估计值的方差,Q是高斯噪声的方差,R是测量值的方差,Q和R都是常数。
可以看出,K是由两类方差的比值决定的,因为Q,R都是常数,所以上一次估计值的方差起决定性作用,如果上一次估计完以后发现方差很大,说明估计的不太靠谱,在这个式子中易知K会随之变大更接近1,这样的话结合上一个公式,测量值所占比值就会更大,也就是说这一次的估计值更信任测量值。


公式三:估计值的方差怎么来

P[i+1]=(1-K[i+1])P[i]
这一次的方差由上一次的方差和这次的增益系数决定


总结

只要满足卡尔曼滤波使用条件(各种状态符合正态分布),给出第一个估计值,第一个估计方差,高斯噪声方差,测量值方差,将这三个公式放进一个迭代循环里,估计值x就能一步一步逼近真实值。

代码

附一个C语言实现卡尔曼滤波的简单例子的代码。
代码是http://blog.csdn.net/sinat_20265495/article/details/51006311这篇博客提供的,自己按理解添加了很多注释。

#include "stdio.h"
#include "stdlib.h"
#include "math.h"double frand()
{return 2 * ((rand() / (double)RAND_MAX) - 0.5);//随机噪声(-1~1之间):rand()/RAND_MAX为0~1之间
}void main()
{float x_last = 0;//初始估计值float p_last = 0.02;//初始估计值方差float Q = 0.018;//高斯噪声方差float R = 0.542;//测量方差,反应测量的精度float kg;//卡尔曼增益float x_mid;float x_now;float p_mid;float p_now;float z_real = 0.56;//实际值(要测量的目标)float z_measure;float summerror_kalman = 0;//测量累积误差float summerror_measure = 0;//估计值累积误差int i;x_last = z_real + frand()*0.03;x_mid = x_last;for (i = 0; i < 100;i++){x_mid = x_last;//上一个卡尔曼估计值p_mid = p_last + Q;//上一个估计值方差加上噪声方差,即实际方差kg = p_mid / (p_mid + R);//新的卡尔曼增益系数,新估计值方差与新估计值方差加测量方差的比值。如果测量方差很大,显然卡尔曼系数变小,计算新估计值时,分配给测量值的权重就小一点z_measure = z_real + frand()*0.03;//新的测量值,系统随机生成x_now = x_mid + kg*(z_measure - x_mid);//即x[i]=(1-kg)*x[i-1]+kg*z[i],由测量值和上一次估计值共同决定这次估计值,信谁多一点由卡尔曼增益系数决定,卡尔曼增益系数又由每一轮的新方差决定p_now = (1 - kg)*p_mid;//新的估计方差,原方差的卡尔曼信任度算得printf("真实值:%6.3f\n", z_real);printf("测量值:%6.3f [差值(绝对值):%.3f]\n", z_measure, fabs(z_real - z_measure));printf("卡尔曼值: %6.3f [差值(绝对值):%.3f]\n", x_now, fabs(z_real - x_now));printf("\n\n");summerror_kalman += fabs(z_real - x_now);//卡尔曼误差累积summerror_measure += fabs(z_real - z_measure);//测量误差累积p_last = p_now;x_last = x_now;}printf("总体测量误差累积     :%f\n", summerror_measure);printf("总体卡尔曼滤波误差累积:%f\n", summerror_kalman);printf("卡尔曼误差所占比例(越大越好咯):%d%%\n", 100 - (int)((summerror_kalman / summerror_measure) * 100));getchar();
}
  • 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
                 <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-2b43bc2447.css" rel="stylesheet"></div>

三个最简单公式讲完卡尔曼滤波算法相关推荐

  1. 卡尔曼滤波算法的五大核心公式含义

    卡尔曼滤波算法中的五大核心公式含义 在SLAM中经常会用的卡尔曼滤波算法,这里简单的记录一下卡尔曼滤波算法的五大核心公式,以便后续查询,公式的推导不在作赘述,直接放出卡尔曼滤波算法的五大核心公式: 1 ...

  2. 数据结构几个最简单的阐述完整版(带你入门:链表,栈,队列,哈希表,树)通俗易懂简单明了

    数据结构几个最简单的阐述完整版 一.链表(Linked list): 如下图是一个链表: 1.链表是无须存储在连续的空间内,一般都是分散存储于内存中.(指针是指向下一个数据的内存地址) 2.所有要访问 ...

  3. 20130327-[转]讲完这个故事我就要嫁给别人

    讲完这个故事我就要嫁给别人 内容来源:中国时尚品牌网 [2013年03月06日07:41] 这个故事没有惊心动魄,只有波澜不惊. 讲完,我便将你安放于心. 从小就是个小心翼翼的姑娘,特别害怕将自己置于 ...

  4. 用上帝的恋爱公式讲线性回归-下

    用上帝的恋爱公式讲线性回归-下 定义模型 初始化模型 定义损失函数 定义优化算法 训练模型 在验证集上测试 前文:用上帝的恋爱公式讲线性回归-上 定义模型 net = nn.Sequential(nn ...

  5. feign post 传递空值_听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺

    文章来源:听我讲完GET.POST原理,面试官给我倒了杯卡布奇诺 原文作者:陈哈哈 来源平台:CSDN 我有一个老朋友,我们叫他熊猫.发际线及将触碰到后脑勺,大框金丝眼镜也掩盖不住那黝黑的眼圈,显得格 ...

  6. JavaScript学习笔记(三)——从简单模仿到创作

    JavaScript学习笔记(三)--从简单模仿到创作 目前我先列好提纲,利用每晚和周末的闲暇时间,将逐步写完 ^_^ 转载于:https://www.cnblogs.com/mixer/archiv ...

  7. 文件服务器异地容灾,三种异地容灾方案(完整版).pdf

    三种异地容灾方案(完整版) 一.数据级灾备--PPRC IBM 的PPRC (Peer to Peer Remote Copy,点对占点远程复 )复制技术是基于 ESS 企业级数据存储服务器,通过 E ...

  8. 【一个故事讲完https】聊聊https的诞生

    今天看了个关于https安全运输的原理,分享一下: 目录 一.序言 二.总是有一种被偷看的感觉 三.RSA:非对称加密 四.非对称加密+对称加密 五.中间人攻击 六.你到底是谁? 七.https 一. ...

  9. 一个故事讲完进程、线程和协程

    一个故事讲完进程.线程和协程 很久以前,有两个程序,暂且称他们旺财和小强吧. 旺财和小强这两个程序都很长,每个都有十几万行. 他们两个的人生价值就是到CPU上去运行,把运行结果告诉人类. CPU是稀缺 ...

最新文章

  1. C# SQLiteHelper
  2. mysql 中文截取_mysql 截取中文字符
  3. 我们与Datawhale的故事!
  4. Http Digest认证协议
  5. SQL Server 2012 安全新特性:包含数据库
  6. AJAX+JQUERRY实现分页
  7. cad2020 开始_如何设置CAD2020经典模式,原来这么简单,一起来看看
  8. 使用多个DNS供应商以缓解DDoS攻击
  9. java为何是跨平台语言,以及java如何运行
  10. android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...
  11. phpStrom编辑器常用功能教程
  12. 输入框聚焦隐藏提示语
  13. IplImage 封装释放
  14. 【引用】关于close-on-exec标志
  15. 好看的android动画效果
  16. Win10安装Git并配置
  17. 搜狗状告腾讯拼音输入法不正当竞争索赔2051万
  18. 计算机研究生哪个子专业最容易考公务员
  19. 惠普bios硬重置_惠普笔记本电脑BIOS恢复【五个免费修复步骤】
  20. fnv1 java_笔记本热键驱动_笔记本万能fn键驱动 v1.1 通用版-126g驱动网

热门文章

  1. Java 接口和抽象类可以被new么?
  2. java 23种设计模式 深入理解
  3. Aizu 2170 Marked Ancestor
  4. C#使用事件方式Winform窗体之间传值
  5. 习惯的力量之五让迟延见鬼去吧
  6. [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
  7. [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
  8. 【数据结构与算法】之深入解析“螺旋矩阵II”的求解思路与算法示例
  9. iOS之单例模式的写法
  10. LeetCode Algorithm 797. 所有可能的路径