SLAM基础算法(1):卡尔曼滤波
对于一个正在运动中的小车来说,如何准确的知道它所处的位置?
理论家说:我可以通过牛顿公式来计算!
实践家说:给它装个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》
最新文章
- cocos2dx骨骼动画Armature源码分析(二)
- subversion-1.8.5 windows install dist
- 直播CDN架构随想
- Android 6.0的运行时权限
- 字符匹配算法之KMP
- Date get period
- C#: 数据绑定
- 夺命雷公狗---DEDECMS----7dedecms目录结构
- 妙味课堂——HTML+CSS(第三课)
- Apache服务器配置默认首页文件名和网站路径
- Things App Engine Doesn't Do...Yet
- 如何编写敏捷开发中的user story
- 自动化构建jenkins配置
- Winform_devexpress开发框架主界面设计
- Oracle Test 日志
- ORM框架 EF - code first 的封装 优化一
- ThinkPHP 3.1,3.2中对IN和BETWEEN正则匹配不当导致的一个SQLi
- iOS调用系统页面中文显示
- [BZOJ2594][WC2006]水管局长加强版(LCT+Kruskal)
- LINUX CENTOS关机与重启命令详解