详解卡尔曼滤波(Kalman Filter)

1. 从维纳滤波到卡尔曼滤波

黑盒(Black Box)思想最早由维纳(Wiener)在1939年提出,即假定我们对从数据到估计中间的映射过程一无所知,仅仅用线性估计(我们知道在高斯背景下,线性估计能达到克拉美劳下界,是最优估计)来掩盖我们的无知。

但是,到了二十年以后的1960年卡尔曼的年代,我们对于红框内的事(prior knowledge),很有可能是知道的,并且知道得很详细,很清楚。再这样的情况下,我们还不能有效地利用这一部分先验知识来帮助我们把估计做的更好就没有任何道理了。卡尔曼就是从红框入手,将这部分先验信息表达出来。至于怎么表达,就用到了状态空间表达(State Space Representation)

2. 状态空间表达(State Space Representation) 

我们可以写出如下一组方程:

\begin{cases}Z_n=g(Z_{n-1},v_n) & \mbox{State \ Equation}\quad (\mbox{Non-observable}) \\ X_n=h(Z_n,w_n)& \mbox{Observation\ Equation} \end{cases}

  • 状态方程(State Equation):是决定研究对象行为的关键量Z_n随时间的变化情况。Z_n我们是不能直接观测到的(因为采样的时候根本采不到这些状态,状态是隐含在观测量背后的);
  • 观测方程(Observation Equation):是状态Z_n通过某种形式、窗口、途径,让我们看到关于它的某种表现,而这种表现反映在观测量X_n当中。X_n是我们能直接观测到的。

由此可以发现,从维纳到卡尔曼有两点本质区别:

  1. 状态空间表达是我们注入先验知识的重要窗口,自此黑箱变成了白箱(White Box)因为数据\{X_n\}和估计量\{Z_n\}之间的关联关系已经完全展现在我们的面前了。
  2. Z_n时变的(Time varied),这就使得问题从平稳(Stationary)的变为非平稳的(Non-Stationary)的

值得一提的是:状态空间表达还有别的称呼,比如HMM(Hidden Markov Model)隐马尔科夫模型

3. 界定滤波问题

首先把状态空间表达进一步细化

\begin{cases} Z_n=G_nZ_{n-1}+v_n\\ X_n=H_nZ_n+w_n \end{cases}

\quad E(v_n)=E(w_n)=0,Cov(v_n)=R_n,Cov(w_n)=S_n ,

\{v_n\},\{w_n\} \mbox{ are Independent both and between}

 在此线性基础上我们来界定卡尔曼滤波的滤波问题

这里解释一下图里的逻辑脉络

  • 我们想用(X_1,...,X_n)估计Z_n
  • 虽然我们知道,条件期望是均方意义下的最优估计,但是通常在非高斯背景下我们很难求出条件期望;
  • 于是我们转而去求一个最优线性估计本质也就是把Z_n投影到由(X_1,...,X_n)张成的线性子空间里;
  • z_{n|n}中两个n的含义:第二个n表示用x_1,...,x_n的数据,第一个n表示要估计的状态是z_n。做的是线性估计,也就是上面说的投影
  • 卡尔曼滤波为了实现z_{n|n}\leftarrow z_{n-1|n-1},采用了两步走策略:第一步预测(Prediction);第二步矫正(Correction)。所以该策略也被称为预测-矫正(Prediction-Correction)策略

4. 推导细节

上面这里头核心的一步就是正交化,因为xn 和 x(1:n-1)  当然不正交,因为如果正交的话,就是高斯白噪声了。除非设备坏了,不然采出来的数据几乎不可能是个白噪声。

可以看到,方差不断地减小,这个过程是自适应完成的,非常精巧。

 5. 卡尔曼滤波总结

大名鼎鼎的卡尔曼滤波可以总结如下:

6. 理论应用

卡尔曼滤波怎么用呢?只需要给定初值\Sigma_{0|0}=I,(其实初值取什么不太重要别是0就行),和参数取值G_n,H_n,就可以随着数据的到来不断递推下去,获得越来越精准的结果,因为数据当中的信息是会不断地吸收进你的滤波器当中,这个其实也就是机器学习。

 追踪模型(Target Tracking)[Z_n,Z_n^{'},Z_n^{''}]

状态方程:

假设物体做匀加速直线运动:

\left[\begin{matrix} Z_n\\ Z_n^{'}\\ Z_n^{''} \end{matrix}\right] =\left(\begin{matrix} 1&\Delta t&\frac{1}{2}(\Delta t)^2\\ 0&1&\Delta t\\ 0&0&1 \end{matrix}\right) \left[\begin{matrix} Z_{n-1}\\ Z_{n-1}^{'}\\ Z_{n-1}^{''} \end{matrix}\right] +v_n

观测方程:

X_n=[1,0,0]\left[\begin{matrix} Z_n\\ Z_n^{'}\\ Z_n^{''} \end{matrix}\right]+w_n

 7. 卡尔曼滤波的优缺点(Pros and Cons)

我们平常形容某一门信号处理技术或者别的什么技术成熟了,是什么意思?

要知道成熟绝不等于热门热门的意思是:现在研究的人特别的多,文章特别多,对于这个方法的各种各样的扩充改进更新等等层出不穷,这个叫热门,但这个时候一定是不成熟的,原因很简单,是因为大家还没有看到这个方法的缺点。当大家知道的不仅仅是它能干什么,还有它不能干什么,那么这个方法就成熟了。卡尔曼滤波的缺点主要体现在以下三个方面:

1. 模型失配(Model Mismatch)

卡尔曼滤波说到底,虽然后面的推导看起来那么复杂,但其实就干了正交化这一件事而已。

另一方面,卡尔曼滤波极度依赖状态空间表达。在上述的追踪模型中,如果物体做的不是匀加速直线运动,是由模型失配导致Z_{n|n}中的误差项(X_n-H_nZ_{n|n-1})增大,而卡尔曼滤波却依旧坚持认为这个误差项是由于噪声造成的,并且不断增大卡尔曼增益,导致错上加错,最后乱套。

对付模型失配,有一个技术叫做IMM(交互式多模型Interacting Multiple Models),其实就是准备了很多个模型,总有一款适合你。模型之间有交互,是为了确认你究竟处于哪个模型当中。

2. 非线性(Non-Linear)

卡尔曼滤波线性性。但是现实情况大多是非线性的:

\begin{cases} Z_n=g(Z_{n-1},v_n)\\ X_n=h(Z_n,w_n) \end{cases}

比如,导航信号在穿过大气层的时候,是会有很严重的电离层的散射和畸变。(因为导航星很高,要飞两万公里以上过大气层,没到3万6的同步轨道,也不是几百公里侦查星)具有很强的非线性。那么,在非线性的情况下如何使用卡尔曼滤波?

一个很简单的办法就是线性化:EKF(扩展的卡尔曼滤波 Extended Kalman Filtering)

\begin{cases} Z_n=J_g^{(1)}Z_{n-1}+J_g^{(2)}v_n)\\ X_n=J_h^{(1)}Z_n+J_h^{(2)}w_n) \end{cases}

线性化只能局部做,所以模型要隔一段时间变一下,很正常。

3. 分布本身的推演(Distribution Propagation)

我们知道高斯能够完全由均值和方差确定,而卡尔曼滤波推演的只有均值和协方差阵,是因为我们假设噪声是高斯分布。要是噪声的情况非高斯,我们面临每一时刻,状态的分布情况都不一样,所以我能不能设计一种方法,使得这个状态的分布本身(不是一阶矩、二阶矩)能够随时间演化。这个问题,人们也解决了,靠的是粒子滤波技术(Particle Filtering)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/325926.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity组件开发--升降梯

我开发的升降梯由三个部分组成,反正适用于我的需求了,其他人想复用到自己的项目的话,不一定。写的也不是很好,感觉搞的有点复杂啦。完全可以在优化一下,项目赶工期,就先这样吧。能用就行,其他的…

异常“Service id not legal hostname (sc_goods)”处理

Service id not legal hostname (sc_goods)异常处理 遇到问题: 写Feign调微服务时,发现该服务的服务名sc_goods”的格式,于是Feign的FeignClient 注解写成了 FeignClient(value "sc_goods") 然后启动服务,直接报错…

【年终总结系列 2023】新起点,同时追寻更高的起点

什么是攀登者,用一个场景来概括就是:经常弯腰低头手脚并用向上攀爬,待到山的顶峰后终于可以舒展一下身体,但若舒展的时间过长便会觉得无聊,此时向远处眺望,发现了更高的山峰,便又充满了激情。对…

C#,快速排序算法(Quick Sort)的非递归实现与数据可视化

排序算法是编程的基础。 常见的四种排序算法是:简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显,一般使用递归方式实现,但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。 快速排序(Quick Sor…

iOS苹果和Android安卓测试APP应用程序的区别差异

在移动应用开发中,测试是一个至关重要的环节。无论是iOS苹果还是Android安卓,测试APP应用程序都需要注意一些差异和细节。本文将详细介绍iOS和Android的测试差异,包括操作系统版本、设备适配、测试工具和测试策略,并回答一些新手容…

Flutter+Go_Router+Fluent_Ui仿阿里网盘桌面软件开发跨平台实战-买就送仿小米app开发

Flutter是谷歌公司开发的一款开源、免费的UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发。 Flutter官方介绍,目前Flutte…

CentOS 8 8.5.2111 网络在线安装系统 —— 筑梦之路

之前写过一篇关于centos 8 官方停止更新维护后解决yum源问题的文章: CentOS 8 停止维护后换可用yum源——筑梦之路_http://ftp.iij.ad.jp/pub/linux/centos-vault/8.5.21-CSDN博客 由于centos 8 dvd的镜像比较大,有时候我们根本不需要去下载一个10G以上…

纵向拼接图片,一键批量处理,工作更高效!

在创意和设计工作中,图片的拼接和处理是必不可少的环节。为了帮助您更高效地完成这一任务,我们推出了一款纵向拼接图片的批量处理工具。这款工具不仅操作简单,而且功能强大,让您的图片处理工作变得轻松又高效! 首先&a…

leetcode 每日一题 2024年01月06日 在链表中插入最大公约数

题目 2807. 在链表中插入最大公约数 给你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个数的 最大公约数 是可以被两个数…

Linux第18步_安装“Ubuntu系统下的C语言编译器GCC”

Ubuntu系统没有提供C/C的编译环境,因此还需要手动安装build-essential软件包,它包含了 GNU 编辑器,GNU 调试器,和其他编译软件所必需的开发库和工具。本节用于重点介绍安装“Ubuntu系统下的C语言编译器GC&a…

TypeScript接口、对象

目录 1、TypeScript 接口 1.1、实例 1.2、联合类型和接口 1.3、接口和数组 1.4、接口和继承 1.5、单继承实例 1.6、多继承实例 2、TypeScript 对象 2.2、对象实例 2.3、TypeScript类型模板 2.4、鸭子类型(Duck typing) 1、TypeScript 接口 接口…

自定义事件总线

文章目录 什么是自定义事件总线具体实现思路分析定义结构实现 on实现 emit实现 off 源码 什么是自定义事件总线 自定义事件总线属于一种观察着模式,其中包括三个角色发布者(Publisher):发出事件(Event)订阅…