对于一个正在运动中的小车来说,如何准确的知道它所处的位置?

理论家说:我可以通过牛顿公式来计算!

实践家说:给它装个GPS不就得了!

好吧,你们说的听上去都很有道理,但我们到底该相信谁?

现实情况是:

理论家没有考虑到现实存在的摩擦力、空气阻力、时间测量误差等因素,算出来的结果存在较大误差;

实践家没有考虑GPS的测量存在较大误差。

这样一说,感觉两位半斤八两,都有误差,感觉谁都不可信。不过,我们还是要解决问题的嘛,能不能让这两位合作一下呢,理论联系实际嘛,马克思他老人家说的准没错。

我们知道,误差其实是一种噪声,那么是不是可以用滤波的方法呢?

感觉可以,我们把他俩的结果加起来,再除二嘛,均值滤波谁不会呢!但是,但是传感器的测量值(不一定是GPS)有时候简直会上天哪,这样简单粗暴肯定不靠谱,那有没有更牛X的方法呢?

-------------------------------------------------------------------------------------------------严肃的分隔线----------------------------------------------------------------------------------------

在刚刚提出的例子里,小车的状态向量可以表示为:

这时候,理论家提出,他可以预测k时刻的小车状态,并很难受的承认,这个预测是有误差的,假设这个误差服从正态分布:

给出误差的协方差矩阵

假设小车是匀速行驶,使用基本的运动学公式来表示,有:

即:

其中:

称为预测矩阵。

现实中,小车肯定不是匀速的,因为各种阻力的存在,需要时不时的给小车一个向前的力,才能使它继续向前行驶:

假设某个时刻给了小车一个向前的力,产生了一个向前的加速度a,那么:

即:

其中:

称为控制矩阵。

对于施加给小车的加速度a,它也称为一个向量,叫做控制向量,常用来表示,即有:

到这里,理论家的事情也差不多了,我们为他补上最后一步。在系统会中,可能会有其他不可预知的外力可能会干扰预测结果,我们需要把这一部分误差也加进来,假设它也是一个服从正态分布的误差,我们已经知道:

则有:

可以看出,是有上一步得来的外部不确定性误差的总和。

这时,实践家也给出了他买的山寨GPS的参数,知道了这个GPS的误差范围,那么有如下关系:

其中, 为观测向量, 为传感器与现实单位换算的转换矩阵(这里因为GPS输出单位与现实一致,就是1:1的关系), 为GPS的正态分布协方差矩阵。

OK,到现在为止,理论和实践的要素都准备完成,是时候把他们整在一起了,我们先来看一幅图片:

图中紫色的小车正在行走,理论家计算出的位置为绿色曲线(正态分布),实践家测量出的位置为蓝色曲线(也是正态分布),那么我们如果把这两个正态分布融合起来,是不是得出一个更“瘦”的曲线呢?

如上图红色所示,我们得出了融合后的曲线,这个曲线的方差要比另外两个要小了,至于为啥高斯分布和高斯分布融合起来还是高斯分布,请参考论文《Products and Convolutions of Gaussian Probability Density Functions》有详细的推导和论证,这里就不多说啦。

现在,我们有了两个不同的数据集,分别是预测的数据和测量的数据,我们用 来归一到相同的单位,则有:

稍微加以变形,不难得出:

设:

那么上面的公式变为:

代入:

为了得到最后的结果,把上面三个式子化简,最终得到:

总结一下,我们把卡尔曼滤波的过程一般分为两大部分,预测更新和测量更新:

到这里,了解了卡尔曼滤波大概的推理和机制,说白了,卡尔曼滤波就是通过不断的迭代,将测量结果不断收敛的一种方法。可能到这里我们还是不太明白卡尔曼滤波有啥牛X的,那我们接下来具体计算一下。

以小车的运动为例,为了简化运算假设它是匀速行驶,我们每隔1秒获取一次GPS的数据并算出相对位移,数据如下:

此时,由上述条件容易得知:

1) 由于是匀速行驶,所以不需要控制量,可以忽略;

2) 1秒一次的更新间隔,预测矩阵F,这里是预测因子为1;

3) GPS输出的测量数据已转换为和现实一致,故H=1;

4) 假设小车初速为0,方差为1;

5) 就上面说的,GPS的误差是R=1米

可以看出,滤波后的结果相比测量的结果,是比较收敛的,接近于小车匀速运动的现实情况。

References:

[1]"A New Approach to Linear Filtering and Prediction Problems" by R.E.Kalman,1960

[2]"Kalman filter" in wikipedia

[3]"How a Kalman filter works,in pictures" by Bzarg's blog

[4]《Probabilistic Robotics》

SLAM基础算法(1):卡尔曼滤波的更多相关文章

  1. PHP基础算法

    1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...

  2. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  3. Java基础算法集50题

    最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...

  4. 贝叶斯公式由浅入深大讲解—AI基础算法入门

    1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...

  5. 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】

    本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...

  6. java入门学习(3)—循环,选择,基础算法,API概念

    1.顺序结构:也就是顺着程序的前后关系,依次执行.2.选择分支:利用if..else , / switch(){case [ 这个必须是常量]:}; / if..else if….. ….else.. ...

  7. Java - 冒泡排序的基础算法(尚学堂第七章数组)

    /** * 冒泡排序的基础算法 */ import java.util.Arrays; public class TestBubbleSort1 { public static void main(S ...

  8. c/c++面试总结---c语言基础算法总结2

    c/c++面试总结---c语言基础算法总结2 算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之 ...

  9. c/c++面试指导---c语言基础算法总结1

    c语言基础算法总结 1  初学者学习任何一门编程语言都必须要明确,重点是学习编程方法和编程思路,不是学习语法规则,语法规则是为编程实现提供服务和支持.所以只要认真的掌握了c语言编程方法,在学习其它的语 ...

随机推荐

  1. 3DPytorch-API NVIDIA Kaolin

    3DPytorch-API NVIDIA Kaolin NVIDIA Kaolin library provides a PyTorch API for working with a variety ...

  2. Samsung WLAN AP RCE漏洞及利用工具

    1.漏洞详情: 三星 WLAN AP WEA453e 路由器 远程命令执行 2.fofa语句 title=="Samsung WLAN AP" 3.复现 payload: POST ...

  3. spring——自动装配【非常详细】

    什么是自动装配? 自动装配就是让应用程序上下文为你找出依赖项的过程.说的通俗一点,就是Spring会在上下文中自动查找,并自动给bean装配与其关联的属性! spring中实现自动装配的方式有两种,一 ...

  4. springmvc——mvc:annotation-driven标签的作用

  5. 基本FTP服务: 文件传输协议

    1.服务端虚拟机Server,安装可以提供FTP服务软件 [root@server0 ~]# yum -y install vsftpd 2.虚拟机Server操作,启动 vsftpd服务,设置为开机 ...

  6. robotframework用户关键字创建过程

    robotframework是一个关键字驱动框架,核心在于关键字的应用.系统本身通过各种库自带了大量关键字,同时支持用户自定义关键字.关键字可以简单理解为各种处理数据的方法. 关键字区别与用户参数. ...

  7. 实验4、Flask基于Blueprint & Bootstrap布局的应用服务

    1. 实验内容 模块化工程内容能够更好的与项目组内成员合作,Flask Blueprint提供了重要的模块化功能,使得开发过程更加清晰便利.此外,Flask也支持Bootstrap的使用. 2. 实验 ...

  8. python学习笔记05-条件分支与循环1

    思考问题:100分制,90分以上为A,80-90为B,60-80为C,60以下为D,当用户输入成绩后,打印对应的字母 temp=input('请输入你的成绩:') score=int(temp) if ...

  9. 【模拟7.22】visit(卢卡斯定理&&中国剩余定理)

    如此显然的组合数我把它当DP做,我真是.... 因为起点终点已经确定,我们发现如果我们确定了一个方向的步数其他方向也就确定了 组合数做法1: 设向右走了a步,然后向左走了b=a-n步,设向上为c,向下 ...

  10. 数据泵导入,报错:ORA-12899: value too large for column "SCOTT"."TEST112"."JOIN" (actual: 9, maximum: 8)

    1.报错: 数据泵执行导入时报错:ORA-12899: value too large for column "SCOTT"."TEST112"."J ...