详解卡尔曼滤波(Kalman Filter)

2024-01-03 22:20

本文主要是介绍详解卡尔曼滤波(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)

这篇关于详解卡尔曼滤波(Kalman Filter)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567227

相关文章

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

我与Bloom filter

1 海量网页判断用Bloom Filter 面试的时候,一个面试官问我说:“有一个网络爬虫,爬虫程序会不停地爬取页面上的每一个网页,并把爬取后的网页给存储起来,那么爬虫如何判定现在在爬的网页有没有被爬过。” 我当时卡住了半天回答不上来。 面试官给我说用Bloom Filter。 Bloom Filter把爬取过的网页映射到Bloom Filter内,如果再爬取到该网页,Bloom Filt

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

Linux中拷贝 cp命令中拷贝所有的写法详解

This text from: http://www.jb51.net/article/101641.htm 一、预备  cp就是拷贝,最简单的使用方式就是: cp oldfile newfile 但这样只能拷贝文件,不能拷贝目录,所以通常用: cp -r old/ new/ 那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,

笔记-python之celery使用详解

Celery是一个用于处理异步任务的Python库,它允许你将任务分发到多个worker进行处理。以下是Celery的使用详解: 安装Celery 使用pip安装Celery: pip install celery 创建Celery实例 首先,需要创建一个Celery实例,指定broker(消息中间件)和backend(结果存储)。 from celery import Celeryap

Django 路由系统详解

Django 路由系统详解 引言 Django 是一个高级 Python Web 框架,它鼓励快速开发和干净、实用的设计。在 Django 中,路由系统是其核心组件之一,负责将用户的请求映射到相应的视图函数或类。本文将深入探讨 Django 的路由系统,包括其工作原理、配置方式以及高级功能。 目录 路由基础URL 映射路由参数命名空间URL 反向解析路由分发include 路由路由修饰符自