初学者的卡尔曼滤波——扩展卡尔曼滤波

2023-11-17

简介

转自:http://www.cnblogs.com/ymxiansen/p/5368547.html


  已经历经了半个世纪的卡尔曼滤波至今仍然是研究的热点,相关的文章不断被发表。其中许多文章是关于卡尔曼滤波器的新应用,但也不乏改善和扩展滤波器算法的研究。而对算法的研究多着重于将卡尔曼滤波应用于非线性系统。

  为什么学界要这么热衷于将卡尔曼滤波器用于非线性系统呢?因为卡尔曼滤波器从一开始就是为线性系统设计的算法,不能用于非线性系统中。但是事实上多数系统都是非线性的,所以如果卡尔曼滤波器不能用在非线性系统中的话,那么它的应用范围就非常有限了。如果真的是这样,卡尔曼滤波器可能早就寿终正寝或者过很久很久才会被人注意到。幸运的是早期的学者们对这个问题理解的非常深刻,而且也找到了解决方法,就是扩展卡尔曼滤波(EKF)。

  事实上世界上的第一个卡尔曼滤波也是扩展卡尔曼滤波,而不是线性卡尔曼滤波器。扩展卡尔曼滤波有很久远的历史,如果说有一个非线性系统需要用到卡尔曼滤波的话,不必怀疑,先试试扩展卡尔曼滤波准没错。因为他有很久远的历史,所以可以轻松的找到许多这方面的资料。

  不过扩展卡尔曼滤波也不是无懈可击的,它有一个很严重的短板——发散。使用扩展卡尔曼滤波的时候请务必记在心上,时刻提醒自己,这样设计滤波器其结果会发散吗?毫不夸张地说相对于线性卡尔曼滤波设计扩展卡尔曼滤波器的就是在解决发散问题。发散问题解决了剩下的都是小事。

小结:

  • 扩展卡尔曼滤波器主要用于非线性系统;
  • 扩展卡尔曼滤波器会发散。

线性化的卡尔曼滤波器


  在讨论扩展卡尔曼滤波之前,首先要了解一下线性化卡尔曼滤波。它和线性卡尔曼滤波器在滤波器的算法方面有同样的算法结构,一样一样的。不一样的地方在于这两者的系统模型不同。线性卡尔曼滤波器的系统本身就是线性系统,而线性化卡尔曼滤波器的系统本身是非线性系统,但是机智的大神们将非线性的系统进行了线性化,于是卡尔曼滤波就可以用在非线性系统中了。对于一个卡尔曼滤波器的设计者,就不要去管你的模型到底是一开始就是线性系统还是非线性系统线性化得到的线性系统,反正只要是线性系统就好了。好了,现在你有了一个线性系统,那你还需要担心什么呢?这就是一个之前讲过的线性卡尔曼滤波器啦。

  的确是这样的,没有很大的差别,但是请跟我一起念:线性化卡尔曼滤波器会发散。为什么会发散呢?是这样,我们在对非线性系统进行线性化的过程中,只有被线性化的那个点附近的线性化模型和真实的模型相近,远的误差就大了,那么这个时候卡尔曼滤波器的效果就不好。如果懂点线性化知识这个道理就很明显。所以线性化的这个限制要时刻考虑,这也就是为什么要把线性卡尔曼滤波器和线性化卡尔曼滤波器区分开的理由。

  而决定一个线性化滤波器成功与否的关键就在于这个滤波器系统模型线性化得好不好。一个贴近于真实模型的线性化模型对于滤波器的良好输出非常重要。所以说掌握如何线性化一个非线性模型很重要,然而我们并不会讨论关于系统线性化的问题,因为这已经不属于卡尔曼滤波的范畴了,而且每个系统有不同的线性化方法,有点复杂。

  总而言之,如果你已经明白了如何使用线性卡尔曼滤波器,那么使用线性化卡尔曼滤波器就没有什么需要担心的,因为算法结构一样嘛。唯一需要注意的就是线性化卡尔曼滤波器会发散,要在有效范围内使用,要不然滤波器的表现不会好。

小结:

  • 线性化卡尔曼滤波器与线性卡尔曼滤波器有同样的算法结构,不同样的系统模型;
  • 线性化卡尔曼滤波器会发散,原因在于函数在远于被线性化的点的时候并不接近于非线性函数;
  • 线性化卡尔曼的表现取决于线性化做得好不好。

扩展卡尔曼滤波器


   在这节具体介绍卡尔曼滤波器。首先从比较熟悉的线性卡尔曼滤波器开始比较扩展卡尔曼滤波器与线性化卡尔曼滤波器的异同,从系统模型到滤波器算法,并解释这些不同。之后将提供两个具体的应用例子来加以体会。这门书的重点在于如何感性的理解和使用卡尔曼滤波器,所以对于算法的推导不会被具体描述。但是如何理解和区别这些不同,这些不同表达了什么意义将会一一解释。如下图所示,右面是我们已经熟悉的经典的线性化卡尔曼滤波的算法结构和步骤,左面则是扩展卡尔曼滤波器的算法结构和步骤,其中不同的地方已经用红笔圈出来。可以看到两个滤波器的算法结构是相同的,只有几个方程上有细微的差别。

  非线性系统模型

  在非线性系统中,系统模型是这样的:

xk+1 = f(Xk)+ wk

zk = h(Xk) + vk

  这与线性系统的区别在于非线性系统的状态向量和其系数是不能够分离的。

 

  比如说,在GPS定位的伪距与接收机位置的关系中:ρ[Xu]= [(xu-xsi)2 + (yu -ysi)2 +(zu - zsi)2 ]1/2 + b + vi ,

  其中[Xu]=[xu,yu,zu,b]是系统状态向量,分别是接收机的位置和接收机与卫星的钟差,

    [xsi,ysi,zsi]是卫星的位置坐标,ρ是伪距,vi是观测噪声。

  在这个关系中状态向量与它的系数就是不可分离的,没有办法写成AXk的形式,只能是f(Xk)。h(Xk)的存在同理。

 

  扩展卡尔曼滤波器算法

  比较上图,可以看到差别主要在这样两个地方:

  1. 第  I   步中xk+1 = f(xk-1),与原来的xk+1 = Axk-1;
  2. 第 III 步中Xk = Xk- + Kk(zk - h(xk-)),与原来的Xk = Xk- + Kk(zk - Hxk-);

  其他的地方则完全一样。那么是不是只需要改动这两点就可以将一个线性卡尔曼滤波变成扩展卡尔曼滤波呢?不是的,有一些更重要的差别隐藏在公式中。在右图中,也就是线性卡尔曼滤波器中矩阵A和矩阵H是已知的,在而左图中虽然将第I步和第III步中的A和H替换成f和h,但是其他地方的A和H却仍然存在,可是在非线性系统中,哪有A和H呢?

  A和H的获得就要涉及到之前所提到的决定扩展卡尔曼滤波器表现的决定因素:线性化。线性化的方法很经典:

  将非线性系统中的f对x求(xk估计)处的偏导得到A,同样的求h对x求(xk)处的偏导得到H。(向量和矩阵怎么求偏导?)

  

  线性化滤波器和扩展卡尔曼滤波器的共同点在于他们都需要经历一个线性化的过程,不同点在于,扩展卡尔曼滤波器是将xk估计作为线性化的参考点,线性化卡尔曼滤波器不是。(线性化滤波器是用什么作为线性化参考点?参考点是不是就是求偏导以后的带入值?) 在设计扩展卡尔曼滤波器的时候是不是知道这一点并不会有什么不同。但是如果你在犹豫我是要用扩展卡尔曼滤波器还是用线性化卡尔曼滤波器的时候,明白这一点是非常重要的。下面对线性化滤波器和卡尔曼滤波器线性化参考点的差异做简单的解释。

  在扩展卡尔曼滤波中,我们并不用前一个时刻的先验值Xk-(卡尔曼滤波器未经过修正的预测值)作为参考点,而是用前一个时刻的估计值作为参考点做线性化。这是因为相对于先验值,前一个时刻的估计值更加贴近于真实值,将估计值作为线性化参考点可以得到一个更加贴近于实际的线性化系统模型。这种线性化方法跟适合难以提前确定线性化参考点的系统模型。而相反的。如果说线性化参考点已经确定了,那么完全不必用前一刻的估计值作为线性化参考点。比如说在对卫星的位置这样的系统模型进行线性化的时候,由于卫星的运动轨迹有一个连续的轨道,在这种情况下,就不必用前一个时刻的估计值作为线性化参考点。(而是直接用系统对下一个时刻的预测就可以了?)

  总而言之,你只要有个概念,扩展卡尔曼滤波器是基于先验估计做系统线性化的就可以了。具体的细节在实验中就会有所体会。重要的是我们知道了A和H是根据上面两个公式得到的。

  总结一下这一小结讲的什么。我们看到总体而言扩展卡尔曼滤波器的结构过程都和线性卡尔曼滤波器相同。但是每一步的等式都有一些细微的差别,这些差别可以分为两块:第一个是扩展卡尔曼滤波器用非线性系统系统方程f和h替换了线性系统的A和H。第二个是扩展卡尔曼滤波器中的矩阵A和矩阵H是非线性系统的雅可比行列式(什么鬼)。除了这两块剩下的都和线性卡尔曼滤波器相同。

主要问题如下: 

1. 运动及观察模型用泰勒级数的一阶或二阶展开近似成线性模型,忽略了高阶项,不可避免的引入线性误差,甚至导致滤波器发散。有如下误差补偿方法: 
泰勒近似使得状态预测必然存在误差: 
A) 补偿状态预测中的误差,附加“人为过程噪声”,即通过增大过程噪声协方差来实现这一点。 
B) 扩大状态预测协方差矩阵,用标量加权因子φ>1乘状态预测协方差矩阵 
C) 利用对角矩阵φ=diag(sqrt(φi)), φi>1来乘以状态预测协方差矩阵 
其实无论增大过程噪声协方差还是状态预测协方差矩阵,都是为了增大kalman增益,即状态预测是不准的,我要减小一步状态预测在状态更新中的权重。 
2. 雅克比矩阵(一阶)及海塞矩阵(二阶)计算困难。二阶EKF的性能要好于一阶的,而二阶以上的性能相比于二阶并没有太大的提高,所以超过二阶以上的EKF一般不采用。但二阶EKF的性能虽好,但计算量大,一般情况下不用

小结:

  • 在第I步和第III步中,用f和h代替原来的A和H;
  • 剩下的A和H,分别求f和h在(xk估计)和(xk-)处的偏导得到;
  • 扩展卡尔曼滤波器用前一个时刻的估计值作为参考点做线性化。

 总结:

  所谓扩展卡尔曼滤波器,就是适用于非线性系统的卡尔曼滤波器。它与经典的线性卡尔曼滤波器很相似,算法步骤和结构都相同。不同在于系统模型和矩阵A和H。在扩展卡尔曼滤波器当中用非线性系统模型方程代替线性系统墨香的系统方程;将系统模型求偏导得到新的扩展卡尔曼滤波器当中的矩阵A和H,在偏导的求解过程中,也是就是线性化的过程中用前一个时刻的估计值作为参考点。通过这样的修改就得到了适用于非线性系统的扩展卡尔曼滤波器。在使用的过程中我们要时刻牢记,扩展卡尔曼滤波会发散。下一篇是实验。

  未解决的问题:1.如何对非线性系统线性化,求偏导就可以吗?2.矩阵和向量怎么求偏导?3.为什么f和h求偏导的点不同?4.线性化参考点是不是就是求偏导以后的参考点?5.雅可比行列式?

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初学者的卡尔曼滤波——扩展卡尔曼滤波 的相关文章

随机推荐

  • 基于深度学习的高精度人体摔倒行为检测识别系统(PyTorch+Pyside6+YOLOv5模型)

    摘要 基于深度学习的高精度人体摔倒行为检测识别系统可用于日常生活中或野外来检测与定位人体摔倒行为目标 利用深度学习算法可实现图片 视频 摄像头等方式的人体摔倒行为目标检测识别 另外支持结果可视化与图片或视频检测结果的导出 本系统采用YOLO
  • android 对话框学习

    首先需要创建ProgressDialog对象 然后使用线程控制进度条显示 具体源代码 view source print 001 package com yarin android TestOnPDialog 002 003 import
  • hdu 1080 Human Gene Functions

    Problem acm hdu edu cn showproblem php pid 1080 Meaning 给出一个二维表 similarity 表示对应核苷酸配对时的相似度值 横杠 表示用空格代替一个核苷酸 给出两个DNA序列 a 和
  • PCB添加图片或logo的方法

    系列文章目录 1 元件基础 2 电路设计 3 PCB设计 4 元件焊接 6 程序设计 文章目录 前言 一 图片预处理 转为 BMP格式 二 给Altium designer安装PCB LOGO Creator脚本插件 三 给PCB添加图片或
  • 【读书笔记->数据分析】BDA教材《数据分析》书籍介绍

    BDA教材 数据分析 书籍介绍 BDA BDA数据分析职业技能等级 旨在培养基于数据分析理论 计算机技术以及行业案例应用 三维一体 的大数据分析人才 培养数据管理 数据分析 数据挖掘 数据洞察方面的复合型和应用型专业人才 BDA数据分析师证
  • stm32霍尔编码器电机测速原理

    本次选用的编码器电机为13线的霍尔编码器电机 电机减速比为30 1 转动一圈输出13 30 390个脉冲 轮胎直径为75mm 轮胎周长为pi d 3 75 225mm 定时器采用四倍频计数 则一圈输出390 4 1560个脉冲 具体编码器知
  • Python基础 第3课

    Python基础 3 函数 独立定义 独立调用 def foo pass foo 方法 依赖定义 依赖调用 方法存在于类的内部 1 变量作用域 全局 本地 闭包 局部 全局 global一般在函数体外定义的变量成为全局变量 在函数内部定义的
  • QT笔记- QString字符串左右截取——left() 和 right()

    left int n 从左向右截取n个字符串 right int n 从右向左截取n个字符串 注 第二个参数是一个索引 表示函数的目标字符串是该索引之前的字符串
  • VUE(未写完)

    文章目录 一 如何学习VUE 二 VUE的概念 三 MVVM MV 四 如何使用VUE Vue的指令的操作 v 都是代表指令 回忆 filter 五 json server 六 生命周期 8个 七 watch 监听 八 computed 计
  • Opening a specific View directly from the SiteMap in Dynamics

    Opening a specific View directly from the SiteMap in Dynamics CRM Consultancy Blog Dynamics 365 Unified User Interface D
  • 2022蓝桥杯A组Python

    更新 江苏赛区省一 昨天特别高兴 今天有点高兴 后续会继续更新动态规划的部分 国赛最近也在刷题但有点懒得写博客了 事情有点多 2022 04 29 蓝桥杯开始啦 还有七分钟就到九点了 心情有点激动 复习不进去 发个博客吧 2022 04 0
  • 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错 整个问题排查分析过程很有意思 这里将Druid连接池 数据库层以及负载均衡层的配置分析下 记录整个问题的分析过程 同时梳理下Druid连接池的配置和连接保活及回收机制 1 问题背景 应用
  • 离散数据:析取范式与合取范式

    一 前言 析取范式和合取范式是命题逻辑等值演算中的重要内容 其目的是为了标准化命题公式 下面我将给出析取范式和合取范式的计算步骤 又由于析取范式和合取范式的形式不唯一 为了便于比较命题公式之间的关系 因此衍生出了主析取范式和主合取范式 所以
  • linux漏洞处理(更新中)

    1 Diffie Hellman Key Agreement Protocol 资源管理错误漏洞 CVE 2002 20001 vim etc ssh sshd config 在文件中加入下方配置 KexAlgorithms diffie
  • 【C++入门到精通】C++入门 —— 内存管理(new函数的讲解)

    目录 一 C C 内存分布 1 栈 Stack 2 堆 Heap 3 全局区 静态区 Global Area Static Area 4 常量区 Constant Area 5 代码区 Code Area 二 C语言中动态内存管理方式 1
  • 在Ubuntu上基于wayland/weston源码构建weston桌面

    Ubuntu构建weston桌面 简介 下载工具 库 安装ninja 设置环境变量 构建wayland 构建wayland protocols 构建weston 运行weston weston的一些测试程序 简介 wayland官网 htt
  • mybatis choose when 多条件_Mybatis—动态SQL详解

    前言 今天我们来聊聊Mybatis的动态SQL的使用 动态SQL可以说是mybatis的核心 可以对SQL语句进行灵活操作 通过表达式进行判断 对SQL进行灵活拼接 组装 在实际项目开发中 我们还可以将在业务层处理的逻辑转移到SQL中进行处
  • ubuntu下开启端口

    查看端口启动情况 sudo ufw status 开启端口号命令 sudo ufw allow lt 端口号 gt v6的意思就是 ipv6 开启防火墙 sudo ufw enable
  • 小米9开源linux内核,小米开源 Redmi Note 8 Pro 和 Note 9 Pro 系列的内核源码

    小米开源了基于 Android Q 的 Redmi Note 8 Pro 代号 begonia 以及 Redmi Note 9 Pro Note 9 Pro Max 代号 curtana 的内核源码 按照 XDA 的说法 GPLv2 要求所
  • 初学者的卡尔曼滤波——扩展卡尔曼滤波

    简介 转自 http www cnblogs com ymxiansen p 5368547 html 已经历经了半个世纪的卡尔曼滤波至今仍然是研究的热点 相关的文章不断被发表 其中许多文章是关于卡尔曼滤波器的新应用 但也不乏改善和扩展滤波