卡尔曼滤波详细推导

简介: 卡尔曼滤波详细推导

前言

虽然卡尔曼滤波作为一种经典的算法在多源数据融合、slam后端优化等很多方面都取得了较好的应用,但是我们经常都会有一个疑问,卡尔曼滤波到底是什么呢?

简要的说:“卡尔曼滤波是一种优化估算算法”


卡尔曼滤波可以适用于线性高斯系统,如果我们考虑非线性系统则可以考虑扩展卡尔曼滤波


其可以解决两个问题:


状态如何在无法被直接测量的情况下,进行估算系统的状态。

如何在数据源存在噪声的情况下,通过卡尔曼滤波估计系统的状态。(比如说惯导、轮式里程计、GNSS三种传感器数据均存在误差,且频率不一,如何融合三种数据源进行精确的估计汽车的位置)

我们先来看一个简单的例子:

一辆行驶在路上的小车,其状态包括位置、速度两个信息,用 x表示小车的状态,其中 p表示位置, v表示速度。则可以写成下述形式:

                                       image.png

假设式中的位置变量 p 与 速度变量 v,都为随机变量且符合正态分布,则进而可以通过均值 描述可能的估计 和 对应的方差 衡量变量的不确定性。

匀速行驶

在一个比较理想的状态下,我们假设小车在路上匀速行驶,则可以对小车行驶由 t − 1时刻到 t时刻之间的过程描述成下式中的数学模型:

                                    image.png

针对 t时刻与 t − 1 时刻的状态的估计量,image.png

写成矩阵形式如下:

                                 image.png


令上式中:

                                  image.png


则可以写成:

                                     image.png

称上式中的 F t 为预测矩阵,其描述了从上一时刻状态估计到下一时刻状态估计之间的关系。


但是,上述例子中的位置变量 p与 速度变量 v都不是确定的,两者之间的关系也不是确定的,但是二者之间却有一定的相关性,我们通过协方差矩阵 P 描述两者之间的相关程度:


(注意这里的协方差矩阵 P与位置变量 p符号之间的区别)

                               image.png


同时,考虑到两者之间的预测矩阵F_{t},则给定上一时刻的协方差矩阵 P t − 1,则下一时刻的协方差矩阵 P t1,则下一时刻的协方差矩阵 P t 可以写成:

                                    image.png

非匀速行驶

上述的例子种过于理想,实际情况中小车不可能都是在匀速行驶。因此,我们考虑加入一个加速度 a,即小车的行驶速度会随着时间而发生改变。

重新定义小车的状态量如下所示:

                               image.png

令 u ^ t作为加速度 a在 t时刻的估计(又称之为输入)。

则上式又可以写为:

                               image.png

整理image.png得:

                              image.png

同时,使用 Q t

表示引入的输入变量 u t的方差,则对两者之间协方差的影响又可以写成如下形式:

                                         image.png

总结一下,引入新的输入之后,对估计 x ^ t和不确定性 P t都产生了影响。

卡尔曼滤波公式推导

到此为止,我们对上述的一个小车行驶过程进行了很好的数学建模,但是我们还没有进行一个较好的公式推导。

下面我们就进行这个推导的过程:

上述推导过程我们得到了关于小车在 t时刻预测值 x ^ t

满足一个高斯分布 N p ( μ p , σ p )

同时,基于小车携带的传感器又可以获得一个状态的观测值,这个观测值也会受到环境和传感器自身的影响产生众多噪声,我们仍假设观测值服从一个高斯分布,记为: N o b ( μ o b , σ o b )


因此,对于当前时刻 t t t,我们有了两组参考值,一组是预测值 x ^ t,一组是测量值 x t。那么那组值是正确的呢?怎么样才能得到最终较好的结果呢?

卡尔曼滤波器做的一个工作就是把预测值的高斯分布 N p ( μ p , σ p ) 与测量值的高斯分布 N o b ( μ o b , σ o b ) 进行相乘,得到一个新的分布。(注:这两个高斯分布的乘积不再是一个正态分布,因为其概率密度求和之后不为1)


这个新的分布会正比于一个高斯分布,因此,我们可以通过指数相等来进行计算,即我们可以得到如下关系:

                image.png

上式中, μ p σp

分别为预测的均值和方差, μ o b, σ o b 分别为观测的均值和方差。而 μ c o m b, σ c o m b分别为融合之后的分布所对应均值和方差,且 为一个常数(即正比于一个高斯分布)。

我们把上式展开

image.png

为了使得上式的关系成立,需满足一个必要条件为左右两侧 x的二次项系数与一次项系数均相等。则由此可以得到下述关系:

                                   image.png


首先,对于第一个式子,可以变换为下述形式:

                               image.png

同时,代入并变换第二个式子(右侧):

                            image.png


同时去除分母,得:

                                      image.png


则:

                                        image.png


令:

                                                        image.png


称 K为卡尔曼增益,则我们可以把变量 μ c o m b与变量 σ c o m b 2通过 K表示为:

                           image.png

对应于矩阵形式,则可以写为:

                              image.png

至此,我们就简要的说明了卡尔曼滤波中的均值、方差以及卡尔曼增益用于更新前两者的推导过程。

黄金五条公式总结

可以看出卡尔曼滤波整体包括两个部分:1)预测 2)更新

预测部分包括:

                             image.png

式中, x ^ t 为 t时刻的状态量预测值,通过上一时刻 t − 1计算的最优状态估计以及输入 u t进行计算。

σ ^ t 2为状态估计的不确定性,通过上一时刻的不确定性 σ ~ t − 1 2,预测矩阵 F t以及输入 u t的不确定性 Q t进行计算。


更新部分包括:

                                 image.png

上式中, K为卡尔曼增益,通过 t t t时刻的状态估计预测量的不确定性 σ ^ t 2与 t时刻观测值的不确定性进行计算。

x ~ t 为 t时刻结合预测和观测计算出的最优状态估计(即我们想要计算的状态量),通过 t t t时刻的预测值 x ^ t与观测值 x o b − t,以及卡尔曼增益 K进行计算。

σ ~ t 2

为在 t t t时刻结合预测和观测两方面进行计算的不确定性,通过预测的不确定性 σ ^ t 2 与卡尔曼增益 K进行计算。


上述五个公式即为“黄金五条”公式。

卡尔曼增益K值的讨论

最后我们再进行一些讨论,更加深入的去了解卡尔曼滤波的内在关系。

我们来假设两个极端情况:

1)如果存在一个情况,观测量特别精确,几乎不存在误差,其方差 σ o b − t 2 的值可以取0。此时,卡尔曼增益 K的值为1。则更新部分的最优估计和不确定性变为:

                                 image.png

即观测值作为了最优估计,且其不确定性为0。

2)针对另外一个情况,我们构建的小车行驶的数学模型毫无误差,预测量特别精确,几乎不存在误差,其方差 σ ^ 2 的值可以取0。此时,卡尔曼增益 K的值为0。则更新部分的最优估计和不确定性变为:

                                    image.png

即以预测值作为最优的估计。


因此,我们得到了一个重要的结论:


卡尔曼增益 K的值,决定了测量值和预测值对计算 t时刻状态量 x ~ t的影响程度。

这个知乎大佬放了matlab官方的学习视频,很不错,通俗易懂,感兴趣的可以去看一下:如何通俗并尽可能详细地解释卡尔曼滤波?

码字不易,若有转载还请注明出处!

目录
相关文章
|
Ubuntu C++
Ubuntu20.04(LTS)换源(阿里、清华)以及sources.list分享
自用好使,谨慎操作 鄙人在安装完Ubuntu之后,安装Code::blocks的时候,在此之前需要安装C/C++编译环境build-essential,在安装的时候报出有关软件包依赖性的关系问题,经过一波研究发现,有的大佬通过安装aptitude来解决问题,因为aptitude可以很好地解决依赖关系 但是在安装aptitude的时候,还是出现了依赖关系,莫得办法 安装aptitude的命令
6832 0
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
1516 0
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
|
数据可视化 Java 大数据
Java 大视界 -- 基于 Java 的大数据可视化在城市规划决策支持中的交互设计与应用案例(164)
本文围绕基于 Java 的大数据可视化在城市规划决策支持中的应用展开,分析决策支持现状与挑战,阐述技术应用方法,结合实际案例和代码,提供实操性强的技术方案。
|
PHP 计算机视觉
罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化
罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化
887 0
|
定位技术 API C#
.NET开源、功能强大、跨平台的图表库
.NET开源、功能强大、跨平台的图表库
337 8
|
算法 数据可视化 计算机视觉
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
1942 0
论文阅读笔记 | 目标检测算法——Generalized Focal Lossv1,v2
|
机器学习/深度学习 算法 C语言
5.2.1 Backbone(特征提取) 5.2.2 Neck(多尺度检测)
这篇文章介绍了YOLOv3目标检测模型中的Backbone(特征提取)部分,详细阐述了使用Darknet53作为骨干网络来提取图像特征的方法,并通过代码示例展示了如何实现Darknet53网络结构以及如何查看不同层级输出特征图的形状,同时还讨论了Neck(多尺度检测)的概念,解释了如何通过特征图的尺寸放大和融合来实现对不同尺寸目标的检测。
|
Linux 数据处理 数据安全/隐私保护
Linux中的groups命令:管理用户组信息的利器
`groups`命令在Linux中用于显示用户所属的用户组,帮助管理员进行权限管理。它读取`/etc/group`和`/etc/passwd`文件获取信息,特点是简单直观,支持多用户组。命令参数如`-a`显示主组,`-g`显示主组ID,`-n`以数字形式显示,`-r`显示实际组。在实际应用中,结合其他命令可进行权限分析和定制输出。注意权限问题及用户组可能随系统变化。
|
算法 Java C#
分享一个在Keil开发环境中配置代码格式化工具Astyle(美化代码风格)
分享一个在Keil开发环境中配置代码格式化工具Astyle(美化代码风格)
2722 1
四元数的定义与性质
四元数的定义与性质
808 0
四元数的定义与性质