前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【opencv实践】easy卡尔曼滤波上:浅谈

【opencv实践】easy卡尔曼滤波上:浅谈

作者头像
周旋
发布2020-06-05 09:46:42
8210
发布2020-06-05 09:46:42
举报
文章被收录于专栏:行走的机械人行走的机械人

前言

距离上一篇文到现在有十天左右了,现在我又来更新啦!现在正值我们专业课程多的一个学期,还赶上疫情在家学习效率低,所以没能有精力写推文了,不过幸好大家都还在,我会一直更新的。

前几天有个小伙伴问我卡尔曼滤波,但奈何才疏学浅,我也不会.不过在几天恶补之后,我觉得我可以跟大家来聊一聊卡尔曼滤波啦。

在网上逛了很多相关的文章,也在几本书上找到相关内容看了一下,逛了一圈之后除了个别很独到的见解之外,很多其实讲来讲去都那么点东西。文中有些地方也引用了一些别人的说法,因为说的太好了,我都注明出处了。

大家有什么问题也可以问我,就当为我提供写作素材了,时间充裕的话我都可以写推文来跟大家讨论的。

这篇文我们先轻松愉快简单的聊一聊卡尔曼滤波,来帮助奠定一下对它的认识,后面会连续出它的数学公式以及一个实践应用。

正文

说起卡尔曼滤波,我先想起来的就是opencv中的均值滤波啊,高斯滤波啊,中值滤波啊等等,想来以为卡尔曼滤波也是一种滤波操作。

但后来在一套非常简短易懂的无人驾驶科普视频里,看到它说用卡尔曼滤波进行预测。身边也有视觉组的同学提到用卡尔曼滤波进行目标检测的预测。

那既然卡尔曼滤波是用来预测的,为啥不叫卡尔曼预测,非得叫卡尔曼滤波呢?其实,卡尔曼滤波就是一种降噪的滤波算法,只不过它可以起到一定的预测效果。

那卡尔曼滤波算法处理的对象是谁呢?

从最高层面上说处理的是动态模型(dynamic model),而动态模型有可以细分为:

离散状态分布模型,处理这类模型我们用的就是机器学习里我看不下去的那个隐马尔科夫模型(HMM)进行处理。

比如输入法,你输入一个字,输入法会给你推荐下一个字,这就可以用HMM机器学习来做(当然,可能还有其他复杂的东西)。

线性高斯模型,处理这类模型,我们就用大名鼎鼎的我稍微能看懂一丢丢的卡尔曼滤波算法来处理了。这类模型数据是线性的,噪声分布是高斯分布的。

再有就是非线性非高斯模型了,处理这类模型,我们可以用扩展卡尔曼滤波来做。

卡尔曼滤波问世之后,他的创作者鲁道夫.E.卡尔曼在一次访问NASA埃姆斯研究中心时,发现这种方法能帮助解决阿波罗计划的轨道预测问题,最终,飞船正确驶向月球,完成了人类历史上的第一次登月。

来看看大佬长什么样子:

那我们可以想想飞行器登月这个不可思议的神话故事,飞行器飞向太空,不停的用各种传感器来测量自己的位置,希望自己在预定轨道上。

但由于传感器的噪声影响,虽然它一直在测量和调整,但仍有可能慢慢偏离预定轨道(更何况是在漫长的太空飞行中,偏离一点也会有很大区别)。

所以飞行器用传感器测量了当前Xk时刻它的当前位置(由于传感器噪声所以不准确),卡尔曼滤波算法根据上一次Xk-1时刻的传感器测量值,来预测了下一次Xk的飞行器可能的位置分布(但肯定也不准)。

再将Xk时间的模型预测值和传感器测量值进行了融合,从而滤掉传感器的噪声,进而得到更为准确的位置坐标。

说了这么多,你能理解卡尔曼滤波为啥在叫滤波的时候,又说它可以预测了吧?

但是你肯定还不能体会到卡尔曼滤波的妙处:

假设你有两个传感器甚至多个,测的是同一个信号。可是它们每次的读数都不太一样,怎么办?

—— 取平均。 再假设你知道其中贵的那个传感器应该准一些,便宜的那个应该差一些。那有比取平均更好的办法吗?

——加权平均。

假设你只有一个传感器,但是你还有一个数学模型。模型可以帮你算出一个值,但也不是那么准。怎么办? —— 把模型算出来的值,和传感器测出的值,(就像两个传感器那样),取加权平均,也就是卡尔曼滤波。

出自知乎知友Kent Zeng

好了,下面我们看一篇文章里总结的图解:

代码语言:javascript
复制
https://mp.weixin.qq.com/s?__biz=MzU3Mjg1MjYwOA==&mid=2247483884&idx=1&sn=b95235f79d342e9bf1e36179e99dc1e5&chksm=fccbd103cbbc5815a094ee545e6e3eb308af3fc95e3459925d207d9eb6427ea30062e6d206cc&mpshare=1&scene=23&srcid=&sharer_sharetime=1586415172175&sharer_shareid=5b6156709f3d332ba42288712d3b8274#rd

首先通过上一时刻的状态预测得到当前时刻的状态分布(图a),然后通过传感器得到测量数据(图b加粗)。

结合测量数据调整更新,得到当前时刻最终的状态分布(图c加粗)。然后通过控制数据,接着预测下一时刻的状态分布(图d加粗)。

获取下一时刻的测量数据之后(图e加粗),综合得到下一时刻估计的状态分布(图f加粗)。

我们可以看到,测量值和预测值都是高斯分布,高斯分布到底是啥:

一个标准一维高斯钟形曲线方程如下所示:

而且预测过程是迭代的,渐进的,我们通过上一时间预测当前时间状态,再由当前状态预测下一状态。

实际中,真真正正的服从高斯分布的噪声是很少存在的,但我们将卡尔曼滤波应用到大部分噪声中是都有很好效果的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Opencv视觉实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档