【卡尔曼滤波介绍与原理解析】

学习参考外文链接:http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/.
参考链接:https://blog.csdn.net/u010720661/article/details/63253509/.

卡尔曼滤波的背景

卡尔曼滤波常用于动态多变化系统中的状态估计,是一种通用性强的自回归滤波器。它的由来和NASA登月有关。其发明者鲁道夫.E.卡尔曼在一次访问NASA的时候,发现阿波罗计划中一个难点是轨道预测问题,因而提出了一种滤波器,可以帮助高效预测轨迹,辅助导航。NASA最终使用了这个滤波器,然后成功实现人类第一次登月计划。卡尔曼滤波器由此得名。

什么是卡尔曼滤波?

  • 卡尔曼滤波器可以用来估计不确定信息,并给出状态量下一时刻的情况。即便在有噪声干扰的情况下,也可以较好的预测下一状态的情况,并找出多变量间不易察觉的相关性。

  • 因而卡尔曼滤波器可以很好适应不断变化的系统,具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),推理速度快,比较适合资源受限制的场景(实时问题和嵌入式系统)。

  • 理解和实现卡尔曼滤波,需要懂一些基本的概率和矩阵的知识。

卡尔曼滤波可以做什么?

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


而机器人的状态参数包含位置和速度信息:


注意:这个状态只是关于这个系统基本属性的一堆数字,它可以是任何其它的东西。在这个例子中是位置和速度,它也可以是一个容器中液体的总量,汽车发动机的温度,用户手指在触摸板上的位置坐标,或者任何你需要跟踪的信号。

这个机器人带有GPS,精度大约为10米,还算不错,但是,它需要将自己的位置精确到10米以内。树林里有很多沟壑和悬崖,如果机器人走错了一步,就有可能掉下悬崖,所以只有GPS是不够的。


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

在只有位置和速度这两个状态下:

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

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


在上图中,位置和速度是不相关的,这意味着由其中一个变量的状态无法推测出另一个变量可能的值。

下面的例子更有趣:位置和速度是相关的,观测特定位置的可能性取决于当前的速度:

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

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

使用矩阵来描述问题:

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

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


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


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

假设小车式匀速的

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

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

外部控制量

我们并没有捕捉到一切信息,可能存在外部因素会对系统进行控制,带来一些与系统自身状态没有相关性的改变
以火车的运动状态模型为例,火车司机可能会操纵油门,让火车加速。相同地,在我们机器人这个例子中,导航软件可能会发出一个指令让轮子转向或者停止。如果知道这些额外的信息,我们可以用一个向量

来表示,将它加到我们的预测方程中做修正

假设由于油门的设置或控制命令,我们知道了期望的加速度a,根据基本的运动学方程可以得到:

以矩阵的形式表示就是:


上述公式中:B_k 称为控制矩阵,(u_k ) 称为控制向量(对于没有外部控制的简单系统来说,这部分可以忽略)。

如果我们的预测并不是100%准确的,该怎么办呢?

外部干扰因素:

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

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

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

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


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


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


由上式可知,新的最优估计是根据上一最优估计预测得到的,并加上已知外部控制量修正。而新的不确定性上一不确定性预测得到,并加上外部环境的干扰

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

用测量值来修正估计值

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


注意:传感器读取的数据的单位和尺度有可能与我们要跟踪的状态的单位和尺度不一样,我们用矩阵 H_k 来表示传感器的数据。


可以计算出传感器读数的分布,用之前的表示方法如下式所示:
卡尔曼滤波的一大优点就是能处理传感器噪声,换句话说,我们的传感器或多或少都有点不可靠,并且原始估计中的每个状态可以和一定范围内的传感器读数对应起来。


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

我们将这种不确定性(例如:传感器噪声)用协方差 R_k
表示,该分布的均值就是我们读取到的传感器数据,称之为

现在我们有了两个高斯分布,一个是在预测值附近一个是在传感器读数附近


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

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

剩下的就是重叠部分了,这个重叠部分的均值就是两个估计最可能的值,也就是给定的所有信息中的最优估计。然而,这个重叠的区域看起来像另一个高斯分布。


如图所示,把两个具有不同均值和方差的高斯分布相乘,会得到一个新的具有独立均值和方差的高斯分布!用公式讲解为:

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


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

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


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

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


矩阵 K 称为卡尔曼增益,下面将会用到。

将所有公式整合起来:我们有两个高斯分布,预测部分高斯分布:

和测量部分的高斯分布:


将它们放到式(15)中算出它们之间的重叠部分


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


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


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

  • 其他卡尔曼滤波相关的学习链接:

1、卡尔曼滤波学习笔记

2、卡尔曼滤波器介绍与理论分析

3、卡尔曼及扩展卡尔曼滤波

【卡尔曼滤波介绍与原理解析】相关推荐

  1. Android热修复(1):热修复的介绍和原理解析

    一.热修复的产生概述 在开发中我们会遇到如下的情况: 1.刚发布的版本出现了严重的bug,这就需要去解决bug.测试并打渠道包在各个应用市场上重新发布,这会耗费大量的人力物力,代价会比较大. 2.已经 ...

  2. Java框架tk_TKmybatis的框架介绍和原理解析

    一.tkmybatis tkmybatis 是基于 mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率. 二.怎么用? ...

  3. 光场相机重聚焦原理介绍及代码解析

    光场相机重聚焦原理介绍及代码解析 光场相机重聚焦–焦点堆栈深度估计法 全部代码下载地址: https://download.csdn.net/download/weixin_38285131/1044 ...

  4. ChatGPT原理解析以及使用方法介绍

    一.背景 这里我就直接贴上跟ChatGPT的对话作为背景输入,说真的,它的回答比我写的还要专业,具体见如下截图: 二.原理 从官网介绍可以看到,ChatGPT与InstructGPT是同源的模型.那么 ...

  5. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  6. Tomcat 架构原理解析到架构设计借鉴

    ‍ 点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这 ...

  7. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  8. 秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  9. 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 本节,将从 ...

最新文章

  1. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
  2. 阈值Java_亲测有效!一种完美动态阈值白平衡算法 Java实现。
  3. SpringMVC异常处理机制-异常处理两种方式
  4. linux如何查看git安装路径,Git - 如何验证Ubuntu上是否安装Git以及在何处安装Git - Ubuntu问答...
  5. 深入理解Tomcat和Jetty源码之第四篇tomcat系统架构上:容器是如何设计的
  6. python删除数据库_用Python删除Cosmos数据库文档
  7. DrawWindowFrame
  8. springboot和springcloud的基本概念理解
  9. 整数的素因子分解:Pollard rho method
  10. 微信昵称上标电话号码,实用的新玩法
  11. Congratulations! A Success Case on GDPR
  12. 为什么要制定一些自己根本不想执行的计划?
  13. [AGC003F] Fraction of Fractal 矩阵快速幂
  14. bootstrap 复选框及单选按钮
  15. VS2015编译eXosip2-4.1.0 osip2-4.1.0
  16. 索尼Z2(L50t)刷CM12教程
  17. LODOP打印,首次打印时,图片加载不出来、加载不完全问题
  18. if语句——python
  19. 工业机器人九龙坡区职教中心_重庆市九龙坡职业教育中心(职教中心)简介简介...
  20. 2020最新开发及环境搭建类经典面试题

热门文章

  1. 【学堂上新】Unity UGUI 渲染 3D 对象详解
  2. 小米4手机选择图库发送图片时崩溃
  3. vue族谱架构_基于 Vue 实现动态家谱图/组织结构图
  4. C#中如何隐藏滚动条(ScrollBar)同时又具备自动滚动的功能
  5. 《编写高质量代码(改善Java程序的151个建议)》读书笔记
  6. 汽车纵向动力学模型简介(汽车动力学建模入门知识)
  7. 两台手机通过4g网络直接通讯_手机直播只准备了一部手机?难怪直播效果不好!...
  8. 诛仙一直服务器维护,服务器维护《诛仙3》官方致仙友的一封信
  9. 华为od机试79 (python)身高体重排序
  10. IE6,IE7和firefox的兼容问题大集合