卡尔曼滤波详解(1)

目录

1. 核心思想

2. 五个公式的解读

2.1 预测部分

2.2 更新部分

3. 公式的实际应用

4. 调参方法


1. 核心思想

首先,卡尔曼滤波器可以用来估计系统的状态,这个状态是时间序列上的利用上一时刻的状态可以预测当前时刻的状态,利用当前时刻的观测可以更新和修正当前时刻的预测。这么说可能有点绕,看下图。

绿色的x表示系统的状态,y表示对系统状态的观测,蓝色的x表示修正后的状态。卡尔曼滤波的核心思想,就是用利用蓝色\hat{x_{1}}进行预测,得到下一时刻绿色的x_{2}。在利用下一时刻的观测y_{2}和预测得到的x2得到下一时刻修正后的状态,即蓝色的\hat{x_{2}}

由上面的过程可以发现,卡尔曼滤波由一个明显的特点,即当前时刻的状态,只和上一时刻的状态有关,这叫做马尔可夫性。对于实际应用来说,内存中只需要存储上一时刻的状态,占用内存小,速度快,对于实时问题有很好的响应

2. 五个公式的解读

下面来直接解读五个公式

2.1 预测部分

首先是预测部分,预测就是根据当前上一时刻的融合状态,推测当前时刻的状态,而这个状态不能完全代表当前时刻的最终状态,所以看到预测部分的两个公式都是带了“-”号的。

\hat{x_{t}}:表示t时刻系统的状态

F:表示状态转移矩阵,即如何从x_{t-1}变换到x_{t},通常和理论公式有关。

u: t 时刻外界对系统的作用 (现在不理解没关系,实际应用中会具象化)

B:控制矩阵,将外界的作用转化为对状态的影响 

P: 系统的不确定度,这个非常的重要,以协方差矩阵的形式展现,也可以表征状态量之间的关系,随着卡尔曼过程的迭代,这个P应该逐渐减小。

Q:预测过程增加进系统的不确定度,可以视作从上一时刻得到当前时刻状态量的可靠程度,也以协方差的形式呈现,有时也将外部的影响放入Q中一起考虑。

对于预测部分,第一个公式也有在最后加上一个噪声w_{t}的,如果有些噪声可以被表示清楚,写进公式可以增加预测结果的可信程度,Q也就随之减小(我个人的理解)。

第二个公式关于系统不确定度P,一定要认识到其实以协方差矩阵的形式展现的,能够表征系统各状态量之间的关系。同时最重要的是P是表征整个系统的不确定度的,所以随着迭代的进行,P也是要更新的,这就是有第二个公式的原因。而这个公式的来源就是将上一时刻的状态预测为当前时刻,用协方差的数学特性也变换到当前时刻,再加上这么变换的误差噪声Q。

cov(x_{t-1}) = P_{t-1}

cov(x_{t}) = cov(Fx_{t-1}) = FP_{t-1}F^{T}

2.2 更新部分

更新部分的3个公式,卡尔曼增益K是一个过程量,最终会得到修正后的状态量x及系统的不确定度P。这其中

H:是变换矩阵,表示从观测值到状态量之间的关系,因为有些状态量是无法直接观测的

Z:是观测值

R:  是观测的噪声,也是以协方差的形式表示的

K:卡尔曼增益,这个增益其实就是为了表达简便,认为定义的一个公式。

更新部分的三个公式来源,实际上是由两个正态分布的公式相乘的结果得到的。根据预测部分的结果,我们得到了预测的当前时刻的状态量,这个状态量其实服从高斯分布。同时,在当前时刻,我们有当前时刻的观测量,这个量也服从高斯分布。更新部分的主要操作,就是将这两个高斯分布的量结合,得到一个方差更小的高斯分布。图示如下(这个图是来自两个高斯分布乘积的理论推导_两个高斯分布相乘-CSDN博客

讲两个高斯分布如何融合起来,讲的很好)

而这三个公式,实际上就是两个高斯分布相乘得到新高斯分布的公式套用:

\mu = \mu _{0} + \frac{\sigma _{0}^{2}(\mu _{1}-\mu _{0})}{\sigma _{0}^{2}+\sigma _{1}^{2}}

\sigma^{2} = \sigma_{0}^{2} - \frac{ \sigma_{0}^{4}}{ \sigma_{0}^{2} + \sigma_{1}^{2}}

简化一下表达,定义K为:

K = \frac{ \sigma_{0}^{2}}{ \sigma_{0}^{2} + \sigma_{1}^{2}}

则公式可以写为:

\mu = \mu _{0} + K(\mu _{1}-\mu _{0})

\sigma^{2} = \sigma_{0}^{2} - K\sigma_{0}^{2}

再对应到上面的更新部分的三个公式,是不是如出一辙。

3. 公式的实际应用

现在我们假设一个物体匀加速直线运动,状态量X是[x, y, vx, vy],由于是匀加速直线运动,我们很容易得到前一时刻各个状态量和当前时刻各个状态量之间的关系,y方向以此类推。

x_{t} = x_{t-1} + vx_{t-1} + 1/2a_{x}t^{2}

vx_{t} = vx_{t-1} + a_{x}t

写成矩阵的形式为:

\begin{bmatrix} x\\ y\\ vx\\ vy \end{bmatrix}=\begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0& 1& 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x_{t-1}\\ y_{t-1}\\ vx_{t-1}\\ vy_{t-1} \end{bmatrix} + \begin{bmatrix} 1/2\Delta t^{2}\\ 1/2\Delta t^{2}\\ \Delta t\\ \Delta t \end{bmatrix}a

x       =         F                              x           +          B           u

可以对照预测部分的公式看下实际对应的矩阵是什么

现在我们假设观测用的传感器是激光雷达,从激光雷达中能直接读到距离,即x,y,无法直接读到速度。我们可以设置初始的系统不确定度为

P_{0} =\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 \\ 0 & 0 & 100 & 0 \\ 0 & 0 & 0 & 100 \end{bmatrix}

这里因为无法直接得到速度,所以速度项的不确定度要高,而位置项的不确定度低。u自胡总随着迭代过程的进行,整个系统的不确定度会降低。当然这里的初值设定还可以继续深入讨论。

再看,由于观测值是2维的,状态量是4维,所以需要变换矩阵H将状态量变化为2维,则

H = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1&0 & 0 \end{bmatrix}

以上的过程,在给定Q和R之后,就可以进行迭代计算了。

4. 调参方法

由上面的应用实例可以看出,整个过程可以调整的参数,有初始的系统不确定度P,过程噪声Q,测量噪声R。而参数调整关心的几个问题是,收敛的速度,结果的准确程度或者平滑程度(更相信观测还是预测)。有几个比较定性的结论:

Q越大,表示更不相信预测,结果波动会较大,滤波效果差。

R越大,表示更不相信观测,结果会越平滑,滤波效果好,卡尔曼滤波输出收敛的越慢。

卡尔曼增益的收敛值为 Q/(Q+R),比如其值为0.5,那么卡尔曼增益会向0.5收敛(比如预测的位置为10m,观测的位置为15m,则修正后的优化位置为:10+0.5*(15-10)=12.5m。增益就是观测和预测差值的加权,增益越大,越相信观测值。

P0/(Q+R)反映收敛的快慢程度,该值设定越小,收敛越快,该值越大,收敛越慢。

后来还看到了一些有趣的调参方法,比如:

自适应滤波,在Q和R的基础上,加入随时间变化的因子。

离线学习,一般的卡尔曼滤波是利用过去和现在的测量数据来估计将来的状态。也可以将时间序列上的数据全部采集,即已经获得所有(包括未来)测量数据的情况下,估计过去时间下的系统状态。

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

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

相关文章

Solidworks:平面工程图练习

把草图变成工程图,遇到第一个问题是线宽需要用鼠标选中后再设置线宽和颜色。我觉得应该有一个自动设置现款的功能,不知道有没有,我找了半天也没找到。 另一个问题是,作业代号字体上下颠倒了,不知道这是啥意思。 第三个…

ns3.38安装过程

一、Ubuntu22.04安装 ​ 1.下载镜像文件 [ubuntu22.04.1-desktop-amd64.iso] 下载地址 2.安装虚拟机 参考过程:http://t.csdnimg.cn/wkZ7O 二、ns3安装 安装过程参考该贴:http://t.csdnimg.cn/Mdhdk 1.安装依赖库 必装的库 sudo apt install g…

《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

文章目录 5.1 交互式暂存5.1.1 基础知识讲解5.1.2 重点案例:为 Python 项目分阶段提交5.1.3 拓展案例 1:细粒度控制更改5.1.4 拓展案例 2:处理遗漏的更改 5.2 使用 Rebase 优化提交历史5.2.1 基础知识讲解5.2.2 重点案例:整理 Pyt…

161基于matlab的快速谱峭度方法

基于matlab的快速谱峭度方法,选择信号峭度最大的频段进行滤波,对滤波好信号进行包络谱分析。输出快速谱峭度及包络谱结果。程序已调通,可直接运行。 161 信号处理 快速谱峭度 包络谱分析 (xiaohongshu.com)

一、部署Oracle

部署Oracle 一、Docker部署1.Oracle11g1.1 测试环境1.1.1 拉取镜像1.1.2 启动容器1.1.3 配置容器环境变量1.1.4 修改sys、system用户密码1.1.5 创建表空间1.1.6 创建用户并授权1.1.5 使用DBeaver测试连接 二、安装包部署 一、Docker部署 1.Oracle11g 1.1 测试环境 当前只能用…

3.4-媒资管理之视频处理+xx-job分布式任务

文章目录 媒资管理6 视频处理6.1 需求6.1.1 总体需求6.7.3 FFmpeg 的基本使用6.7.4 视频处理工具类 6.2 分布式任务处理6.2.1 什么是分布式任务调度6.2.2 XXL-JOB介绍6.2.3 搭建XXL-JOB6.2.3.1 调度中心6.2.3.2 执行器6.2.3.3 执行任务 6.2.4 分片广播 6.3 技术方案6.3.1 作业分…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

[CUDA 学习笔记] Reduce 算子优化

Reduce 算子优化 注: 本文主要是对文章 【BBuf的CUDA笔记】三,reduce优化入门学习笔记 - 知乎 的学习整理 Reduce 又称之为归约, 即根据数组中的每个元素得到一个输出值, 常见的包括求和(sum)、取最大值(max)、取最小值(min)等. 前言 本文同样按照英伟达官方 PP…

unity2017 遇到visual studio 2017(社区版) 30日试用期到了

安装unity2017 遇到visual studio 2017 30日试用期到了,网上百度搜了好多方法都没有成功。 最后用了这个方法: 1)启动vs2017,在弹出要登录的窗口之前,迅速的点击工具-》选项-》账户,勾选在添加账户或对账户重新进行身…

svg基础(九)滤镜-feMorphology(形态学)

feMorphology:形态学滤镜 用来侵蚀或扩张输入的图像。它在增肥或瘦身效果方面特别有用。适合用来创建轮廓和边界。 1 用法 <feMorphology operator"" radius""/>2 属性 inoperator -dilate膨胀,erode侵蚀radius- 3 示例 <svg width"50…

Linux第52步_移植ST公司的linux内核第4步_关闭内核模块验证和log信息时间戳_编译_并通过tftp下载测试

1、采用程序配置关闭“内核模块验证” 默认配置文件“stm32mp1_atk_defconfig”路径为“arch/arm/configs”; 使用VSCode打开默认配置文件“stm32mp1_atk_defconfg”&#xff0c;然后将下面的4条语句屏蔽掉&#xff0c;如下&#xff1a; CONFIG_MODULE_SIGy CONFIG_MODULE_…

LeetCode:69.x的平方根

嗨嗨嗨&#xff0c;二分又来了&#xff0c;淦它&#xff0c; 这个题官解是&#xff0c;C函数法&#xff0c;二分&#xff0c;和牛顿迭代法&#xff08;暂且搁置&#xff09;&#xff0c; 当然还有暴力&#xff08;不必讨论&#xff0c;就从0开始一个一个试&#xff09;&#…