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

news2024/9/25 19:22:47

在这里插入图片描述


文章目录

1. 线性系统的 Kalman Filter 回顾

  • 系统状态空间方程:
    x k = A x k − 1 + B U k − 1 + w k − 1 P ( ω ) ∼ N ( 0 , Q ) z k = H x k + H k P ( 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=Axk1+BUk1+wk1zk=Hxk+HkP(ω)N(0,Q)P(v)N(0,R)

  • 预测:
    x ^ k − = A x ^ k − 1 + B u k − 1 P k − = A P k − 1 A ⊤ + 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^k1+Buk1Pk=APk1A+Q

  • 矫正(更新):
    K k = P k − H ⊤ H P k − H ⊤ + R Y ^ k = X ^ k − + K k ( Z k − H X ^ k − ) P k = ( I − K k H ) P k − \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=HPkH+RPkHY^k=X^k+Kk(ZkHX^k)Pk=(IKkH)Pk

2. Extended Kalman Filter 之 DR_CAN讲解笔记

2.1. 非线性系统

对于非线性系统来说,系统数学模型和观测模型无法用状态空间方程来表达,因为状态空间方程是线性方程,而非线性系统的这两个模型都是非线性的。可以写成如下形式:
x k = f ( x k − 1 , u k − 1 , ω k − 1 ) P ( ω ) ∼ N ( 0 , Q ) z k = h ( x k , v k ) 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(xk1,uk1,ωk1)zk=h(xk,vk)P(ω)N(0,Q)P(v)N(0,R)

注意:上述的高斯噪声是在非线性函数里面的,这样即使噪声原本是高斯的,但是经过非线性系统之后,它的分布也不再是高斯分布了,如下图所示。

在这里插入图片描述

可以发现,Kalman Filter的两个前提条件:(1)线性系统;(2)高斯噪声,已经全都不满足了

所以对于非线性系统应用 Kalman Filter 的最好方法就是对系统在工作点/线性化点 进行线性化,因为只有线性化之后我们才能写成线性的形式,才能得到系数矩阵 A A A H H H,进而计算Kalman Gain,最后进行数据融合

2.2. 非线性系统线性化

线性化需要在一个线性化点进行,对于非线性系统的Kalman Filter来说,最准确的地方就是在真实状态点进行线性化

但是真实状态点到底是多少我们永远都不知道,因为如果知道了就不需要做 Kalman Filter了。所以我们只能在我们知道的工作点处进行线性化,我们知道的工作点有两个:

  • 上一次的最优估计状态 x ^ k − 1 \hat{x}_{k-1} x^k1
  • 这一次的先验估计状态 x ^ k − \hat{x}_k^- x^k

2.2.1. 状态方程 f ( x k ) f(x_k) f(xk)在上一次的最优估计状态 x ^ k − 1 \hat{x}_{k-1} x^k1处线性化

在这里插入图片描述

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

在这里插入图片描述

2.3. Extended Kalman Filter

在这里插入图片描述

3. Extended Kalman Filter 之 我的理解与详细解释

既然是卡尔曼滤波,自然就是两个方程:状态方程和观测方程。由于卡尔曼滤波是离散的,所以下面我们先给出IMU的离散状态空间方程和状态观测方程如下:

x k = f ( x k − 1 , w k − 1 ) z k = h ( x k , v k ) \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(xk1,wk1)zk=h(xk,vk)

由于这两个方程都是非线性方程,所以为了使用使用卡尔曼滤波,必须对他们进行线性化。并且由于线性化必须知道线性化工作点,而我们实际知道的都是名义状态值,这里的名义值包括 上一次的状态后验值 x ˇ k − 1 \boldsymbol {\check{x}}_{k-1} xˇk1这一次的状态先验值 x ^ k \boldsymbol {\hat{x}}_{k} x^k。所以对上面两个公式进行线性化也都是在 名义状态 的地方进行线性化,得到如下的公式:

x ^ k = f ( x ^ k − 1 , 0 ) + F k − 1 ( x k − 1 − x ˇ k − 1 ) + W k − 1 w k − 1 z k = h ( x ^ k , 0 ) + H k ( x k − x ^ k ) + V k v k \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^k1,0)+Fk1(xk1xˇk1)+Wk1wk1zk=h(x^k,0)+Hk(xkx^k)+Vkvk

注意

(1) 时刻记住我们线性化的关键目的是什么:是为了得到系数矩阵,从而变成线性系统,可以使用典型的线性系统卡尔曼滤波

(2) 上面的方程线性化出来的两个固定函数值 f ( x ^ k − 1 , 0 ) \boldsymbol f(\boldsymbol {\hat{x}}_{k-1} , \boldsymbol 0) f(x^k1,0) h ( x ^ k , 0 ) \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) h(x^k,0) 对我们使用卡尔曼滤波没有影响,因为我们计算协方差矩阵的时候是使用系数矩阵来计算的。

(3)假设传感器观测到的值是 z m \boldsymbol z_m zm,这里省略掉了时间下标 k k k,然后用下标 m m m表示是 观测的测量值。然后用 z \boldsymbol z z代表预测观测值,也就是我们把IMU预测得到的状态(先验状态) x ^ k \boldsymbol {\hat{x}}_{k} x^k 带入到观测方程中得到的 计算出来的观测值。因为看上面的典型的卡尔曼滤波公式就知道,我们是把IMU 先验状态 带入观测方程中得到一个 计算出来的预测观测值,然后和真正的观测传感器的测量值作差,再乘以卡尔曼增益进行校正。所以这里计算的 预测观测值 表达公式如下(因为我们在计算,噪声不知道是多少,所以简化为0):
z = h ( x ^ k , 0 ) + H k ( x ^ k − x ^ k ) + V k 0 = 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^kx^k)+Vk0=h(x^k,0)

(4)重要:上面的公式中, x k − 1 \boldsymbol {x}_{k-1} xk1 x k \boldsymbol {x}_{k} xk自变量 x ^ k \boldsymbol {\hat x}_k x^k z k \boldsymbol z_{k} zk函数值,所以我们带入不同的自变量值会得到不同的函数值。比如我们实际计算的时候,在预测方程中带入的是 上一次的后验状态值 x ˇ k − 1 \boldsymbol {\check{x}}_{k-1} xˇk1,那么得到的就是 本次的先验状态值 x ^ k = f ( x ^ k − 1 , 0 ) \boldsymbol{\hat{x}}_{k} = \boldsymbol f(\boldsymbol {\hat{x}}_{k-1}, \boldsymbol 0) x^k=f(x^k1,0);我们在观测方程中带入 本次的先验状态值,得到的就是 本次的先验预测观测值 z k = h ( x ^ k , 0 ) \boldsymbol z_{k} = \boldsymbol h(\boldsymbol {\hat{x}}_{k}, \boldsymbol 0) zk=h(x^k,0)

(5)注意:在我们计算卡尔曼滤波的时候,我们只能按照(4)中所说的那样带入 上一次的先验状态到状态方程,然后带入 这一次的先验状态到观测方程。因为在典型的线性卡尔曼滤波中就是这么做的,我们就是要融合状态方程和观测方程。

最后,给出EKF的卡尔曼滤波方程为:

预测公式
带入上一时刻的后验状态到自变量中,即 x k − 1 ← x ˇ k − 1 : x ^ k = f ( x ^ k − 1 , 0 ) + F k − 1 ( x ˇ k − 1 − x ˇ k − 1 ) = f ( x ^ k − 1 , 0 )   P ^ k = F k − 1 P ˇ k − 1 F k − 1 T + 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 带入上一时刻的后验状态到自变量中,即xk1xˇk1:x^k=f(x^k1,0)+Fk1(xˇk1xˇk1)=f(x^k1,0) P^k=Fk1Pˇk1Fk1T+Q

校正公式
带入这一时刻的先验状态到自变量中,即 x k ← x ^ k : z k = h ( x ^ k , 0 ) + H k ( x ^ k − x ^ k ) = h ( x ^ k , 0 ) K k = P ^ k H T H P ^ k H T + R x ˇ k = x ^ k + K k ( z m − h ( x ^ k , 0 ) ) P ˇ k = ( I − K k H ) 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} 带入这一时刻的先验状态到自变量中,即xkx^k:zk=h(x^k,0)+Hk(x^kx^k)=h(x^k,0)Kk=HP^kHT+RP^kHTxˇk=x^k+Kk(zmh(x^k,0))Pˇk=(IKkH)P^k


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业知识管理应该怎么做?

企业知识管理是指企业利用各种信息技术手段,对企业内部的知识进行收集、整理、分析和传递,以提高企业的知识水平和竞争力。企业知识管理涉及到企业内部的各种知识,包括技术知识、专业知识、经验知识、市场知识等。 企业知识管理的方式可以分为…

DETR目标检测算法学习记录

引言 无论是One Stage中的YOLO还是Two-Stage中的Faster-RCNN,其虽然都在目标检测领域有着一席之地,但无一例外都是基于Anchor的模型算法,这就导致其在输出结果时不可避免的进行一些如非极大值抑制等操作来进一步选择最优解,这会带…

uniCloud基础使用

获取openID云函数use strict; exports.main async (event, context) > {//event为客户端上传的参数console.log(event : , event)// jscode2session 微信小程序登录接口,获取openidconst {code} event;// 云函数中如需要请求其他http服务,则使用uni…

Day912.多环境配置隔离 -SpringBoot与K8s云原生微服务实践

多环境配置隔离 Hi,我是阿昌,今天学习记录的是关于多环境配置隔离的内容。 多环境支持,是现在互联网开发研发和交付的主流基本需求。通过规范多环境配置可以规范开发流程,并同时提示项目的开发质量和效率等。 一个公司应该规范…

网络使用情况监控

您的网络是否经常成为网络紧张或带宽瓶颈的牺牲品?瓶颈并不一定意味着带宽不足;它们可能是由占用带宽到严重网络威胁等任何因素造成的。密切监控您的网络并分析带宽使用情况和网络流量对于找到问题的根源非常重要。NetFlow Analyzer是最先进的网络使用情…

Simulink自动化-Matlab脚本自动创建Runnable及mapping

文章目录前言设计Excel模板编写matlab脚本自动添加Function到Simulink模型自动mapping Function与Runnable总结前言 在之前的一篇文章中,介绍了Autosar S/R接口的自动创建及mapping,传送门:Simulink自动化-Matlab脚本自动生成Autosar RTE S/R接口及mapp…

mujoco安装及urdf转xml方法记录

参考 mujoco210及mujoco-py安装 下载适用于Linux或 OSX的 MuJoCo 2.1 版二进制文件 。 将mujoco210的下载的目录解压到~/.mujoco/mujoco210路径下. 注意:如果要为包指定非标准位置,请使用环境变量MUJOCO_PY_MUJOCO_PATH。 验证是否安装成功&#xff08…

springcloud3 fegin服务超时的配置和日志级别的配置2

一 fegin的概述 1.1 fegin的默认超时时间 默认fegin客户端只等待1秒钟,超过1秒钟,直接会返回错误。 1.2 架构图 1.2.1 说明 1.2.2 启动操作 1.先启动9001,9002 eureka 2.启动9003 服务提供者 3.启动9006消费者 1.3 情况验证 1.3.1 正常默认情…

云端IDE:TitanIDE v2.6.0 正式发布

原文作者:行云创新技术总监 邓冰寒 引言 云原生集成开发环境 TitanIDE v2.6.0 正式发布了,一起来看看都有那些全新的体验吧! TitanIDE 是一款云IDE, 也称 CloudIDE,作为数字化时代研发体系不可或缺的一环,和企业建设…

C++网络编程(一)本地socket通信

C网络编程(一) socket通信 前言 本次内容简单描述C网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节。记录本人C网络学习的过程。 网络通信的Socket socket,即“插座”,在网络中译作中文“套接字”,应…

项目管理必备:如何绘制一份优秀的甘特图?

本文一共分为两部分—— 分享60Excel甘特图模板,简单省事儿分享两种甘特图制作教程,高效快捷 第一部分——60甘特图模板 分享一些项目管理甘特图的模板,省事儿!高效!简单! Excel甘特图表模板自取&#xf…

Laya小游戏开发,laya3D美术篇——1——关于laya自带的几个shader的基础运用讲解。

最近三年,基本上做的都是laya小游戏项目。也就是微信小程序,很多业内同行都觉得laya做小游戏不好用,去用了其他平台,甚至还有些做app游戏的,都不来趟laya这个坑。原因有那么以下几点。laya对于unity的辅助开发&#xf…

STM32的USART发送数据时如何使用TXE和TC标志

8人从A出发去D旅游的故事 STM32的USART发送数据时如何使用TXE和TC标志 TXE为1: TDR里的数据全部移到了移位寄存器,且没有新的数据TDR。 TXE为0: TDR里有数据,未空,则TXE0。 TC为1: 从TDR过来的数据全部被移…

一文上手图数据备份恢复工具 NebulaGraph BR

作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳、更快、更易用的备份恢复工具,去年对其进行了比较大的重构。NebulaGraph BR(以下简称 BR)分为社区版和企业版两个版…

Git学习笔记(五)——分支

一、创建与合并分支创建分支:Git创建一个分支很快,因为除了增加一个指针,改改HEAD的指向,工作区的文件都没有任何变化。合并分支:就是直接把master(其中一条分支)指向dev(另一条分支…

python基础条件循环语句

1、编写代码完成一个名片显示,要求使用取消换行和格式化操作符 # 编写代码完成一个名片显示,要求使用取消换行和格式化操作符name 张三 qq 1234567 phone_num 1234567 com_address 北京print(\n 姓名:%s\n qq:%d\n 手机号:%d\n 公司地址:%s\n %(name ,qq ,phone_num, com_…

忆享科技优化入职培训加强人效管理全面迎接新挑战

-优化入职培训-忆享科技加强人效管理入职培训课程 ✦ KPI系统上线 ✦ 砥砺前行前言许多企业随着自身的不断发展,对于各类人才引进需求也越来越迫切,一批批新员工的加入,公司规模逐渐扩大,给公司带来了全新的血液。但在大量新员工加…

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2,所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件,可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…

lesson8-Linux多线程

Linux线程概念 线程在进程内部执行,是OS调度的基本单位OS是可以做到让进程进行资源的细粒度划分的物理内存是以4kb为单位的我们的.exe可执行程序本来就是按照地址空间的方式进行编译的页表映射 - 详细图 理解线程 线程在进程的地址空间内运行, 进程内部具有多个执行流的,而线程…