Kalman Filter in SLAM (3) ——Extended Kalman Filter (EKF, 扩展卡尔曼滤波)

文章目录
- 1. 线性系统的 Kalman Filter 回顾
- 2. Extended Kalman Filter 之 DR_CAN讲解笔记
- 2.1. 非线性系统
- 2.2. 非线性系统线性化
- 2.3. Extended Kalman Filter
- 3. Extended Kalman Filter 之 我的理解与详细解释
1. 线性系统的 Kalman Filter 回顾
-
系统状态空间方程:
xk=Axk−1+BUk−1+wk−1P(ω)∼N(0,Q)zk=Hxk+HkP(v)∼N(0,R)\begin{array}{ll} x_k=A x_{k-1}+B U_{k-1}+w_{k-1} & P(\omega) \sim N(0, Q) \\ z_k=H x_k+H_k & P(v) \sim N(0, R) \end{array} xk=Axk−1+BUk−1+wk−1zk=Hxk+HkP(ω)∼N(0,Q)P(v)∼N(0,R) -
预测:
x^k−=Ax^k−1+Buk−1Pk−=APk−1A⊤+Q\begin{aligned} & \hat{x}_k^{-}=A \hat{x}_{k-1}+B u_{k-1} \\ & P_k^{-}=A P_{k-1} A^{\top}+Q \end{aligned} x^k−=Ax^k−1+Buk−1Pk−=APk−1A⊤+Q -
矫正(更新):
Kk=Pk−H⊤HPk−H⊤+RY^k=X^k−+Kk(Zk−HX^k−)Pk=(I−KkH)Pk−\begin{aligned} & K_k=\frac{P_k^{-} H^{\top}}{H P_k^{-} H^{\top}+R} \\ & \hat{Y}_k=\hat{X}_k^{-}+K_k\left(Z_k-H \hat{X}_k^{-}\right) \\ & P_k=\left(I-K_k H\right) P_k^{-} \end{aligned} Kk=HPk−H⊤+RPk−H⊤Y^k=X^k−+Kk(Zk−HX^k−)Pk=(I−KkH)Pk−
2. Extended Kalman Filter 之 DR_CAN讲解笔记
2.1. 非线性系统
对于非线性系统来说,系统数学模型和观测模型无法用状态空间方程来表达,因为状态空间方程是线性方程,而非线性系统的这两个模型都是非线性的。可以写成如下形式:
xk=f(xk−1,uk−1,ωk−1)P(ω)∼N(0,Q)zk=h(xk,vk)P(v)∼N(0,R)\begin{aligned} & x_k=f\left(x_{k-1}, u_{k-1}, \omega_{k-1}\right) & P(\omega) \sim N(0, Q)\\ & z_k=h\left(x_k, v_k\right) & P(v) \sim N(0, R) \end{aligned} xk=f(xk−1,uk−1,ωk−1)zk=h(xk,vk)P(ω)∼N(0,Q)P(v)∼N(0,R)
注意:上述的高斯噪声是在非线性函数里面的,这样即使噪声原本是高斯的,但是经过非线性系统之后,它的分布也不再是高斯分布了,如下图所示。

可以发现,Kalman Filter的两个前提条件:(1)线性系统;(2)高斯噪声,已经全都不满足了。
所以对于非线性系统应用 Kalman Filter 的最好方法就是对系统在工作点/线性化点 进行线性化,因为只有线性化之后我们才能写成线性的形式,才能得到系数矩阵AAA和HHH,进而计算Kalman Gain,最后进行数据融合。
2.2. 非线性系统线性化
线性化需要在一个线性化点进行,对于非线性系统的Kalman Filter来说,最准确的地方就是在真实状态点进行线性化。
但是真实状态点到底是多少我们永远都不知道,因为如果知道了就不需要做 Kalman Filter了。所以我们只能在我们知道的工作点处进行线性化,我们知道的工作点有两个:
- 上一次的最优估计状态x^k−1\hat{x}_{k-1}x^k−1
- 这一次的先验估计状态x^k−\hat{x}_k^-x^k−
2.2.1. 状态方程f(xk)f(x_k)f(xk)在上一次的最优估计状态x^k−1\hat{x}_{k-1}x^k−1处线性化

2.2.2. 观测方程h(xk)h(x_k)h(xk)在这一次的预测状态x~k\tilde{x}_kx~k处线性化

2.3. Extended Kalman Filter

3. Extended Kalman Filter 之 我的理解与详细解释
既然是卡尔曼滤波,自然就是两个方程:状态方程和观测方程。由于卡尔曼滤波是离散的,所以下面我们先给出IMU的离散状态空间方程和状态观测方程如下:
xk=f(xk−1,wk−1)zk=h(xk,vk)\boldsymbol x_{k} = \boldsymbol f(\boldsymbol x_{k-1} , \boldsymbol w_{k-1}) \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol x_{k}, \boldsymbol v_{k} ) \\ xk=f(xk−1,wk−1)zk=h(xk,vk)
由于这两个方程都是非线性方程,所以为了使用使用卡尔曼滤波,必须对他们进行线性化。并且由于线性化必须知道线性化工作点,而我们实际知道的都是名义状态值,这里的名义值包括 上一次的状态后验值 xˇk−1\boldsymbol {\check{x}}_{k-1}xˇk−1 和 这一次的状态先验值 x^k\boldsymbol {\hat{x}}_{k}x^k。所以对上面两个公式进行线性化也都是在 名义状态 的地方进行线性化,得到如下的公式:
x^k=f(x^k−1,0)+Fk−1(xk−1−xˇk−1)+Wk−1wk−1zk=h(x^k,0)+Hk(xk−x^k)+Vkvk\boldsymbol {\hat{x}}_{k} = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) + \boldsymbol F_{k-1} (\boldsymbol x_{k-1} - \boldsymbol {\check{x}}_{k-1}) + \boldsymbol W_{k-1} \boldsymbol w_{k-1} \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \boldsymbol H_{k} (\boldsymbol x_{k} - \boldsymbol {\hat{x}}_{k}) + \boldsymbol V_{k} \boldsymbol v_{k} x^k=f(x^k−1,0)+Fk−1(xk−1−xˇk−1)+Wk−1wk−1zk=h(x^k,0)+Hk(xk−x^k)+Vkvk
注意:
(1) 时刻记住我们线性化的关键目的是什么:是为了得到系数矩阵,从而变成线性系统,可以使用典型的线性系统卡尔曼滤波。
(2) 上面的方程线性化出来的两个固定函数值 f(x^k−1,0)\boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0)f(x^k−1,0) 和 h(x^k,0)\boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0)h(x^k,0) 对我们使用卡尔曼滤波没有影响,因为我们计算协方差矩阵的时候是使用系数矩阵来计算的。
(3)假设传感器观测到的值是zm\boldsymbol z_mzm,这里省略掉了时间下标kkk,然后用下标mmm表示是 观测的测量值。然后用z\boldsymbol zz代表预测观测值,也就是我们把IMU预测得到的状态(先验状态)x^k\boldsymbol {\hat{x}}_{k}x^k 带入到观测方程中得到的 计算出来的观测值。因为看上面的典型的卡尔曼滤波公式就知道,我们是把IMU 先验状态 带入观测方程中得到一个 计算出来的预测观测值,然后和真正的观测传感器的测量值作差,再乘以卡尔曼增益进行校正。所以这里计算的 预测观测值 表达公式如下(因为我们在计算,噪声不知道是多少,所以简化为0):
z=h(x^k,0)+Hk(x^k−x^k)+Vk0=h(x^k,0)\boldsymbol z = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \boldsymbol H_{k} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\hat{x}}_{k}) + \boldsymbol V_{k} \boldsymbol 0 = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) z=h(x^k,0)+Hk(x^k−x^k)+Vk0=h(x^k,0)
(4)重要:上面的公式中,xk−1\boldsymbol {x}_{k-1}xk−1 和 xk\boldsymbol {x}_{k}xk 是 自变量,x^k\boldsymbol {\hat x}_kx^k 和 zk\boldsymbol z_{k}zk 是 函数值,所以我们带入不同的自变量值会得到不同的函数值。比如我们实际计算的时候,在预测方程中带入的是 上一次的后验状态值xˇk−1\boldsymbol {\check{x}}_{k-1}xˇk−1,那么得到的就是 本次的先验状态值 x^k=f(x^k−1,0)\boldsymbol{\hat{x}}_{k} = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1}, \boldsymbol 0)x^k=f(x^k−1,0);我们在观测方程中带入 本次的先验状态值,得到的就是 本次的先验预测观测值zk=h(x^k,0)\boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0)zk=h(x^k,0)。
(5)注意:在我们计算卡尔曼滤波的时候,我们只能按照(4)中所说的那样带入 上一次的先验状态到状态方程,然后带入 这一次的先验状态到观测方程。因为在典型的线性卡尔曼滤波中就是这么做的,我们就是要融合状态方程和观测方程。
最后,给出EKF的卡尔曼滤波方程为:
预测公式:
带入上一时刻的后验状态到自变量中,即xk−1←xˇk−1:x^k=f(x^k−1,0)+Fk−1(xˇk−1−xˇk−1)=f(x^k−1,0)P^k=Fk−1Pˇk−1Fk−1T+Q带入上一时刻的后验状态到自变量中,即\boldsymbol x_{k-1} \leftarrow \boldsymbol {\check{x}}_{k-1} : \\\boldsymbol {\hat{x}}_{k} = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) + \boldsymbol F_{k-1} (\boldsymbol {\check{x}}_{k-1} - \boldsymbol {\check{x}}_{k-1}) = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) \\ \ \boldsymbol {\hat P}_{k} = \boldsymbol F_{k-1} \boldsymbol {\check P}_{k-1} \boldsymbol F_{k-1} ^{T}+ \boldsymbol Q 带入上一时刻的后验状态到自变量中,即xk−1←xˇk−1:x^k=f(x^k−1,0)+Fk−1(xˇk−1−xˇk−1)=f(x^k−1,0) P^k=Fk−1Pˇk−1Fk−1T+Q
校正公式:
带入这一时刻的先验状态到自变量中,即xk←x^k:zk=h(x^k,0)+Hk(x^k−x^k)=h(x^k,0)Kk=P^kHTHP^kHT+Rxˇk=x^k+Kk(zm−h(x^k,0))Pˇk=(I−KkH)P^k带入这一时刻的先验状态到自变量中,即\boldsymbol x_{k} \leftarrow \boldsymbol {\hat{x}}_{k} : \\ \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) + \boldsymbol H_{k} (\boldsymbol {\hat{x}}_{k} - \boldsymbol {\hat{x}}_{k}) = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) \\ \begin{gathered} \boldsymbol K_{k}=\frac{ \boldsymbol {\hat P}_{k} \boldsymbol H^{T}}{ \boldsymbol H \boldsymbol {\hat P}_{k} \boldsymbol H^{T} + \boldsymbol R} \\ \boldsymbol {\check {x}}_{k} = \boldsymbol {\hat{x}}_{k} + \boldsymbol {K}_{k}\left( \boldsymbol {z}_m - \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) \right) \\ \boldsymbol {\check P}_{k}=\left( \boldsymbol I- \boldsymbol K_{k} \boldsymbol H\right) \boldsymbol {\hat P}_{k} \end{gathered} 带入这一时刻的先验状态到自变量中,即xk←x^k:zk=h(x^k,0)+Hk(x^k−x^k)=h(x^k,0)Kk=HP^kHT+RP^kHTxˇk=x^k+Kk(zm−h(x^k,0))Pˇk=(I−KkH)P^k

相关文章:
Kalman Filter in SLAM (3) ——Extended Kalman Filter (EKF, 扩展卡尔曼滤波)
文章目录1. 线性系统的 Kalman Filter 回顾2. Extended Kalman Filter 之 DR_CAN讲解笔记2.1. 非线性系统2.2. 非线性系统线性化2.2.1. 状态方程f(xk)f(x_k)f(xk)在上一次的最优估计状态x^k−1\hat{x}_{k-1}x^k−1处线性化2.2.2. 观测方程h(xk)h(x_k)h(xk)在这一次的预测…...
关于vertical-align的几问
vertical-align属性可以给我讲解一下吗? 当使用table-cell布局或inline元素时,可以使用CSS的vertical-align属性控制元素的垂直对齐方式。该属性可应用于元素本身以及其父元素(例如,td、th、tr和table)。 以下是vertic…...
【拜占庭将军问题】这一计谋,可以让诸葛丞相兴复汉室
我们都知道,诸葛亮第一次北伐是最可能成功的,魏国没有防备,还策反了陇西,陇西有大量的马匹可以装备蜀国骑兵,可惜街亭一丢,那边就守不住了 当时我不在,只能作诗一首~ 如果穿越过去,…...
【Linux】 -- make/Makefile
目录 Linux项目自动化构建工具 – make/Makefile 背景 依赖关系和依赖方法 多文件编译 项目清理 make原理 Linux项目自动化构建工具 – make/Makefile 背景 一个工程的源文件不计其数 按照其类型、功能、模块分别放在若干个目录当中 Makefile定义了一系列的规则来指定&…...
Forter 对支付服务商应对欺诈的四个建议和Gartner的两个关键结论
Gartner新版2023年度《线上欺诈检测市场指南》发布恰逢其时-企业正面临来自专业黑产和欺诈者与日俱增的压力。而在2023年,许多商户将调整反欺诈策略,对拒付率和转化率进行更严格的监测,以最大限度减少损失并增加营收。以下是Gartn…...
ANR系列(二)——ANR监听方案之IdleHandler
前言 关于IdleHandler,比较多同学错误地认为,这个Handler的作用是主线程空闲状态时才执行它,那么用它做一些耗时操作也没所谓。可是IdleHandler在主线程的MessageQueue中,执行queueIdle()默认当然也是执行在主线程中的࿰…...
数学小课堂:数学和自然科学的关系(数学方法,让自然科学变成科学体系。)
文章目录 引言I 数学方法,让自然科学变成科学体系。1.1 天文学1.2 博物学1.3 化学1.4 医药学1.5 物理学II 自然科学的升华过程III 数学方法的意义引言 19世纪初,英国人把采用实验的方法,系统地构造和组织知识,解释和预测自然的学问称为科学。 科学研究的是自然现象和自然…...
[蓝桥杯 2020 省 A1] 分配口罩
思路比较容易想到,因为口罩全部只有15批,因此直接暴力dfs搜索即可 //dfs #include<bits/stdc.h> using namespace std; int ans 9999; int num[] {9090400, 8499400, 5926800, 8547000, 4958200, 4422600, 5751200, 4175600, 6309600, 5865200, …...
第五章:C语言数据结构与算法之双向带头循环链表
系列文章目录 文章目录系列文章目录前言一、哨兵位的头节点二、双向链表的结点三、接口函数的实现1、创建结点2、初始化3、尾插与尾删4、头插与头删5、打印6、查找7、随机插入与随机删除8、判空、长度与销毁四、顺序表和链表的对比1. 不同点2. 优缺点五、缓存命中1、缓存2、缓存…...
一文带你了解,前端模块化那些事儿
文章目录前端模块化省流:chatGPT 总结一、参考资料二、发展历史1.无模块化引出的问题:横向拓展2.IIFE3.Commonjs(cjs)4.AMD引出的问题:5.CMD6.UMD7.ESM往期精彩文章前端模块化 省流:chatGPT 总结 该文章主要讲述了前端模块化的发展历史和各个…...
(六十五)大白话设计索引的时候,我们一般要考虑哪些因素呢?(中)
今天我们继续来说一下,在设计索引的时候要考虑哪些因素。之前已经说了,你设计的索引最好是让你的各个where、order by和group by后面跟的字段都是联合索引的最左侧开始的部分字段,这样他们都能用上索引。 但是在设计索引的时候还得考虑其他的…...
Spring事务管理
文章目录1 事务1.1 需求1.2 原因分析1.3 错误解决1.4 yml配置文件中开启事务管理日志1 事务 1.1 需求 当部门解散了不仅需要把部门信息删除了,还需要把该部门下的员工数据也删除了。可当在删除员工数据出现异常时,就不会执行删除员工操作,出…...
数字化工厂装配线生产管理看板系统
电力企业业务复杂,组织结构复杂,不同的业务数据,管理要求也不尽相同。生产管理看板系统针对制造企业的生产应用而开发,能够帮助企业建立一个规范准确即时的生产数据库。企业现状:1、计划不清晰:生产计划不能…...
vxe-grid 全局自定义filter过滤器,支持字典过滤
一、vxe-table的全局筛选器filters的实现 官网例子:https://vxetable.cn/#/table/renderer/filter 进入之后:我们可以参照例子自行实现,也可以下载它的源码,进行调整 下载好后并解压,用vscode将解压后的文件打开。全局…...
ECharts 环形图组件封装
一、ECharts引入1.安装echarts包npm install echarts --save2.引入echarts这里就演示全局引入了,挂载到vue全局,后面使用时,直接使用 $echartsimport * as echarts from echarts Vue.prototype.$echarts echarts二、写echarts组件这里演示环…...
c++ 怎么调用python 提供的函数接口
在 C 中调用 Python 函数有多种方法,以下是其中的两种常见方法:使用 Python/C APIPython 提供了 C/C API,可以通过该 API 在 C 中调用 Python 函数。使用这种方法,需要先将 Python 解释器嵌入到 C 代码中,然后可以通过…...
【动态规划】背包问题(01背包,完全背包)
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
记录 UE5 完全重新构建 UE C++项目
不知道搞了什么,C项目的实时代码编译罢工了,搞了半天都修不好,只能又重建了 UE5 版本为 v5.1.1 删除以下文件夹 /Binaries /Intermediate /SavedBinaries 文件夹是编译后的模块 Intermediate 文件夹里是中间层的C代码,完全由ue…...
java版云HIS系统源码 微服务架构支持VUE
云his系统源码 一个好的HIS系统,要具有开放性,便于扩展升级,增加新的功能模块,支撑好医院的业务的拓展,而且可以反过来给医院赋能,最终向更多的患者提供更好地服务。 私信了解更多! 本套基于…...
苹果内购支付检验错误码
21000 The request to the App Store didn’t use the HTTP POST request method. 对App Store的请求没有使用HTTP POST请求方法。 21001 The App Store no longer sends this status code. App Store不再发送此状态代码。 21002 The data in the receipt-data property…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
