卡尔曼滤波的基本原理

  最近看的东西有点杂,扯得太宽了,一直想整理一下学习笔记,被拖延症耽搁了。新的一年,就从卡尔曼滤波开始吧。

  本文非原创,只是在大神们的基础上加入了个人体会,稍作修改。菜鸟首文,大神勿喷。

  英文原文:http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/

  本文转自中文博客:https://blog.csdn.net/u010720661/article/details/63253509/

什么是卡尔曼滤波?

  你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。

  在连续变化的系统中使用卡尔曼滤波是非常理想的,它具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),并且速度很快,很适合应用于实时问题和嵌入式系统。

  在Google上找到的大多数关于实现卡尔曼滤波的数学公式看起来有点晦涩难懂,这个状况有点糟糕。实际上,如果以正确的方式看待它,卡尔曼滤波是非常简单和容易理解的,下面我将用漂亮的图片和色彩清晰的阐述它,你只需要懂一些基本的概率和矩阵的知识就可以了。  

我们能用卡尔曼滤波做什么?

  用玩具举例:你开发了一个可以在树林里到处跑的小机器人,这个机器人需要知道它所在的确切位置才能导航。

  我们可以说机器人有一个状态 ,表示位置和速度:

  注意这个状态只是关于这个系统基本属性的一堆数字,它可以是任何其它的东西。在这个例子中是位置和速度,它也可以是一个容器中液体的总量,汽车发动机的温度,用户手指在触摸板上的位置坐标,或者任何你需要跟踪的信号。
  这个机器人带有GPS,精度大约为10米,还算不错,但是,它需要将自己的位置精确到10米以内。树林里有很多沟壑和悬崖,如果机器人走错了一步,就有可能掉下悬崖,所以只有GPS是不够的。

  或许我们知道一些机器人如何运动的信息:例如,机器人知道发送给电机的指令,知道自己是否在朝一个方向移动并且没有人干预,在下一个状态,机器人很可能朝着相同的方向移动。当然,机器人对自己的运动是一无所知的:它可能受到风吹的影响,轮子方向偏了一点,或者遇到不平的地面而翻倒。所以,轮子转过的长度并不能精确表示机器人实际行走的距离,预测也不是很完美。
  GPS 传感器告诉了我们一些状态信息,我们的预测告诉了我们机器人会怎样运动,但都只是间接的,并且伴随着一些不确定和不准确性。但是,如果使用所有对我们可用的信息,我们能得到一个比任何依据自身估计更好的结果吗?回答当然是YES,这就是卡尔曼滤波的用处。

卡尔曼滤波是如何看到你的问题的

  下面我们继续以只有位置和速度这两个状态的简单例子做解释。

  我们并不知道实际的位置和速度,它们之间有很多种可能正确的组合,但其中一些的可能性要大于其它部分:

  卡尔曼滤波假设两个变量(位置和速度,在这个例子中)都是随机的,并且服从高斯分布。每个变量都有一个均值 μ,表示随机分布的中心(最可能的状态),以及方差 ,表示不确定性。

  在上图中,位置和速度是不相关的,这意味着由其中一个变量的状态无法推测出另一个变量可能的值。下面的例子更有趣:位置和速度是相关的,观测特定位置的可能性取决于当前的速度:

  这种情况是有可能发生的,例如,我们基于旧的位置来估计新位置。如果速度过高,我们可能已经移动很远了。如果缓慢移动,则距离不会很远。跟踪这种关系是非常重要的,因为它带给我们更多的信息:其中一个测量值告诉了我们其它变量可能的值,这就是卡尔曼滤波的目的,尽可能地在包含不确定性的测量数据中提取更多信息!

  这种相关性用协方差矩阵来表示,简而言之,矩阵中的每个元素 表示第 i 个和第 j 个状态变量之间的相关度。(你可能已经猜到协方差矩阵是一个对称矩阵,这意味着可以任意交换 i 和 j)。协方差矩阵通常用“”来表示,其中的元素则表示为“ ”。

使用矩阵来描述问题

  我们基于高斯分布来建立状态变量,所以在时刻 k 需要两个信息:最佳估计 (即均值,其它地方常用 μ 表示),以及协方差矩阵

            (1)

  (当然,在这里我们只用到了位置和速度,实际上这个状态可以包含多个变量,代表任何你想表示的信息)。接下来,我们需要根据当前状态k-1 时刻)来预测下一状态k 时刻)。记住,我们并不知道对下一状态的所有预测中哪个是“真实”的,但我们的预测函数并不在乎。它对所有的可能性进行预测,并给出新的高斯分布。

我们可以用矩阵 来表示这个预测过程:

  它将我们原始估计中的每个点都移动到了一个新的预测位置,如果原始估计是正确的话,这个新的预测位置就是系统下一步会移动到的位置。那我们又如何用矩阵来预测下一个时刻的位置和速度呢?下面用一个基本的运动学公式来表示:

  写成矩阵形式:

  现在,我们有了一个预测矩阵来表示下一时刻的状态,但是,我们仍然不知道怎么更新协方差矩阵。此时,我们需要引入另一个公式,如果我们将分布中的每个点都乘以矩阵 A,那么它的协方差矩阵 会怎样变化呢?很简单,下面给出公式:

  结合方程(4)和(3)得到:

外部控制量

  我们并没有捕捉到一切信息,可能存在外部因素会对系统进行控制,带来一些与系统自身状态没有相关性的改变。
  以火车的运动状态模型为例,火车司机可能会操纵油门,让火车加速。相同地,在我们机器人这个例子中,导航软件可能会发出一个指令让轮子转向或者停止。如果知道这些额外的信息,我们可以用一个向量来表示,将它加到我们的预测方程中做修正。
  假设由于油门的设置或控制命令,我们知道了期望的加速度,根据基本的运动学方程可以得到:

  以矩阵的形式表示就是:

  称为控制矩阵,称为控制向量(对于没有外部控制的简单系统来说,这部分可以忽略)。让我们再思考一下,如果我们的预测并不是100%准确的,该怎么办呢?

外部干扰

  如果这些状态量是基于系统自身的属性或者已知的外部控制作用来变化的,则不会出现什么问题。

  但是,如果存在未知的干扰呢?例如,假设我们跟踪一个四旋翼飞行器,它可能会受到风的干扰,如果我们跟踪一个轮式机器人,轮子可能会打滑,或者路面上的小坡会让它减速。这样的话我们就不能继续对这些状态进行跟踪,如果没有把这些外部干扰考虑在内,我们的预测就会出现偏差。

  在每次预测之后,我们可以添加一些新的不确定性来建立这种与“外界”(即我们没有跟踪的干扰)之间的不确定性模型:

  原始估计中的每个状态变量更新到新的状态后,仍然服从高斯分布。我们可以说的每个状态变量移动到了一个新的服从高斯分布的区域,协方差为。换句话说就是,我们将这些没有被跟踪的干扰当作协方差为噪声来处理。

  这产生了具有不同协方差(但是具有相同的均值)的新的高斯分布。

  我们通过简单地添加得到扩展的协方差,下面给出预测步骤的完整表达式:

  由上式可知,新的最优估计是根据上一最优估计预测得到的,并加上已知外部控制量修正。   

  而新的不确定性上一不确定预测得到,并加上外部环境的干扰。   

  好了,我们对系统可能的动向有了一个模糊的估计,用来表示。如果再结合传感器的数据会怎样呢?

用测量值来修正估计值

  我们可能会有多个传感器来测量系统当前的状态,哪个传感器具体测量的是哪个状态变量并不重要,也许一个是测量位置,一个是测量速度,每个传感器间接地告诉了我们一些状态信息。

  注意,传感器读取的数据的单位和尺度有可能与我们要跟踪的状态的单位和尺度不一样,我们用矩阵 将预测的状态量转化到观测量的尺度。(此为个人见解,与原文不尽相同)(上文的案例中状态量均可观测,故Hk为单位矩阵)

  我们可以计算出预测的传感器读数的分布,用之前的表示方法如下式所示:(本行加粗的三个字为个人理解)

  卡尔曼滤波的一大优点就是能处理传感器噪声,换句话说,我们的传感器或多或少都有点不可靠,并且原始估计中的每个状态可以和一定范围内的传感器读数对应起来。

  从测量到的传感器数据中,我们大致能猜到系统当前处于什么状态。但是由于存在不确定性,某些状态可能比我们得到的读数更接近真实状态。

  我们将这种不确定性(例如:传感器噪声)用协方差表示,该分布的均值就是我们读取到的传感器数据,称之为。 现在我们有了两个高斯分布,一个是在预测值附近,一个是在传感器读数附近。

  我们必须在预测值粉红色)和传感器测量值绿色)之间找到最优解。   

  那么,我们最有可能的状态是什么呢?对于任何可能的读数,有两种情况:(1)传感器的测量值;(2)由前一状态得到的预测值。如果我们想知道这两种情况都可能发生的概率,将这两个高斯分布相乘就可以了。

  剩下的就是重叠部分了,这个重叠部分的均值就是两个估计最可能的值,也就是给定的所有信息中的最优估计。   

  瞧!这个重叠的区域看起来像另一个高斯分布。

  如你所见,把两个具有不同均值和方差的高斯分布相乘,你会得到一个新的具有独立均值和方差的高斯分布!下面用公式讲解。

融合高斯分布

  先以一维高斯分布来分析比较简单点,具有方差 和 μ 的高斯曲线可以用下式表示:

  如果把两个服从高斯分布的函数相乘会得到什么呢?

  将式(9)代入到式(10)中(注意重新归一化,使总概率为1)可以得到:

  将式(11)中的两个式子相同的部分用 k  表示:

  下面进一步将式(12)和(13)写成矩阵的形式,如果 Σ 表示高斯分布的协方差, 表示每个维度的均值,则:

  矩阵称为卡尔曼增益,下面将会用到。放松!我们快要完成了!

将所有公式整合起来

  我们有两个高斯分布,预测部分,和测量部分,将它们放到式(15)中算出它们之间的重叠部分:

  由式(14)可得卡尔曼增益为:

  将式(16)和式(17)的两边同时左乘矩阵的逆(注意里面包含了 )将其约掉,再将式(16)的第二个等式两边同时右乘矩阵 的逆得到以下等式:

  上式给出了完整的更新步骤方程。就是新的最优估计,我们可以将它和放到下一个预测更新方程中不断迭代。

总结

  以上所有公式中,你只需要用到式(7)、(18)、(19)。(如果忘了的话,你可以根据式(4)和(15)重新推导一下)

  个人理解:卡尔曼滤波的核心思想是基于上一时刻的状态(分布1)得到本时刻的预测状态(分布2),预测状态(分布2)再与传感器测量得到的观测状态(分布3) 进行融合,得到对当前状态的估计(分布4)。

延伸 

  我们可以用这些公式对任何线性系统建立精确的模型,对于非线性系统来说,我们可以考虑使用扩展卡尔曼滤波(EKF),或者使用无迹卡尔曼滤波(UKF)

  关于扩展卡尔曼滤波,其与标准卡尔曼滤波的区别在于从分布1到分布2的求解过程中进行了线性近似,其余过程与标准卡尔曼滤波相同,计划在下一篇博客中讲述。

  此外还有无迹卡尔曼滤波,其与标准卡尔曼滤波的区别同样是从分布1到分布2的求解过程不同,从统计学的角度出发,效果较好,计划在下下篇博客中讲述。

  (新手学习笔记,如有错误,还请指教!)

转载于:https://www.cnblogs.com/kangdk/p/10207705.html

卡尔曼滤波的基本原理相关推荐

  1. 卡尔曼滤波算法——基本原理及举例(python实现radar数据滤波)

    卡尔曼滤波算法--基本原理及举例(python实现radar数据滤波) 一.基本原理 1.1 预测 1.2 更新 1.2.1 写法一 1.2.2 写法二 二.举例 2.1 数据说明 2.2 代码 2. ...

  2. 随机数字信号处理期末大报告——基于卡尔曼滤波的自由落体运动目标跟踪MATLAB实现

    完整的实验报告下载随机数字信号处理期末大报告-基于卡尔曼滤波的自由落体运动目标跟踪.docx-机器学习文档类资源-CSDN下载 ​​​​​​ 程序包及所需数据下载 target tracking us ...

  3. pixfllow光流传感器数据获取及悬停程序编写

    最近再和师兄做这个项目,再次做一个简单的记录. 目前已完成的进度有光流传感器数据的串口读取,并利用卡尔曼滤波做光流数据融合. 理解卡尔曼滤波的基本原理(求得下一时刻的在P(k|k-1)最小的条件下的预 ...

  4. 使用MATLAB的Kalman Filter做目标跟踪——来自MathWorks网站的技术文档

    目录 1.前言 2.正文 2.1 介绍 2.2 目标跟踪的挑战 2.3 使用卡尔曼滤波器跟踪单个目标 2.4 卡尔曼滤波器参数配置 2.5 多目标跟踪 3. 本例中用到的函数 1.前言 本文来自Mat ...

  5. 【电赛】2019电子设计竞赛 纸张计数显示装置(F题)

    [点击]Github项目地址.设计下载 内含: 电赛论文 程序设计 机械结构设计 硬件电路设计 综合测评相关设计 交互显示设计 设计详细说明 2019年全国大学生电子设计竞赛 纸张计数显示装置(F题) ...

  6. 【2019电赛】F题 纸张计数显示装置

    Github项目地址:https://github.com/Hyf338/2019-Electronic-Design-Competition 2019年全国大学生电子设计竞赛 纸张计数显示装置(F题 ...

  7. 嵌入式软件算法之卡尔曼滤波基本原理浅析

    卡尔曼滤波基本原理浅析 前言 一.卡尔曼滤波介绍 二.基本原理 2.1 测量值与估计值的权重配置 2.2 高斯分布数学模型的描述 2.3 基于高斯分布模型的迭代 三.一阶卡尔曼滤波 3.1温度示例模型 ...

  8. 卡尔曼滤波与组合导航原理_无人机机载导航系统和传感器基本原理

    本文首发于公众号:无人机系统技术 公众号回复"加群"进入无人机技术交流群交流 公众号回复"多旋翼"获取国际顶尖团队科研成果 公众号回复"控制分配&qu ...

  9. 【控制理论】卡尔曼滤波基本原理及公式推导

    一.卡尔曼滤波基本原理 既然是滤波,那肯定就是一种提纯数据的东西.怎么理解呢,如果现在有一个任务,需要知道家里橘子树今年长了多少个橘子.你想到去年.前年.大前年这三年你把橘子吃到过年,按每天吃3个来算 ...

最新文章

  1. Excution failed for task ':app:transformClassWithDexForDebug'
  2. HashSet中的add()方法( 二 )(详尽版)
  3. 任何网络都能山寨!新型黑盒对抗攻击可模拟未知网络进行攻击 | CVPR 2021
  4. jQuery Validate
  5. ArcGIS License Manager 相关总结
  6. C#搭建CEF(CEFGLUE) 环境。
  7. 聊聊hystrix的execution.isolation.semaphore.maxConcurrentRequests属性
  8. 直播 | 北京邮电大学助理教授王啸:网络嵌入的最新进展
  9. 为何setRequestMethod(GET)不生效
  10. spring boot——MockMvc的用法
  11. artDIalog 弹出层
  12. 分布式消息流平台:不要只想着Kafka,还有Pulsar
  13. [导入]在vs2005中调用远程WebService(幻想曲)
  14. python26章_笨方法学Python-26章练习题
  15. 华为笔记本linux好不好,华为笔记本怎么样
  16. pcie总线与cpci总线_PCI和CPCI
  17. [娱乐]帝国时代I:罗马复兴秘籍
  18. html5 video js 播放,H5播放HLS之videojs播放视频
  19. Enterprise Library 2.0 -- Exception Handing Applcation Block
  20. 全新仿DS网首页模板个人自动发卡,自动发货安装教程及其源码下载

热门文章

  1. js——window.open用法
  2. ***linux下mysql的root密码忘记解决方法
  3. ANDROID STUDIO系列教程二--基本设置与运行
  4. svn回退到具体的版本
  5. Matlab——plot polyfit polyval
  6. Windows Server 2008搭建域环境---安装活动目录
  7. DataGrid实现简单的行分组
  8. html5shiv.js css3,Modernizr, html5shiv, ie7.js, and CSS3 Pie. Which to use and when?
  9. python tableview 列宽_QTableView设置列宽
  10. python 格式化工具_推荐一个小而美的 Python 格式化工具