卡尔曼原理解析及详细推导过程(工科使用角度)

引言

前几天完成作业需要用卡尔曼,于是系统的学习了一下,但是图书和论文资料都是直接从数学原理开始讲起,直接上状态方程和推导,很多推导过程还省略了,让人看的实在是云里雾里。
我认为这种讲述顺序是完全错误的,起码对于供工科人来说是有问题的。对工科人来讲,卡尔曼滤波本质上是一个工具,学习一个工具的正确顺序应该是先知道我遇到了什么问题,需要什么样的工具来解决这个问题,最后明白这个工具是怎么来的。
除了少数几个站在顶峰的工科大佬可以自己造工具以外,绝大部分工科人学习工具使用都应该是这个顺序。
在这一点上反倒是很多科普视频讲的更加详细。
接下来我的讲述是结合我自己的学习体会和b站的一个学习视频,我推荐所有想学卡尔曼滤波的人去看这个视频,链接如下:
卡尔曼滤波学习视频
假如你是第一次知道卡尔曼滤波这个名字,那我推荐你从这里开始看;如果你已经知道卡尔曼滤波是干什么的,是想深入了解一下推导过程,可以直接进入第三部分,我认为我的推导过程已经写得非常详细,只要有本科数学知识就能看懂;假如这些你已经都了解了,那你可以看看第四部分,那是我对卡尔曼滤波的理解,欢迎交流。
好,接下来我们正式开始。

一、遇到的问题

举一个引入卡尔曼滤波的常见例子,让我们思考一个问题,假如要定位一辆运动中的车,我们应该如何建立数学模型呢?
最简单的当然是建立一个匀速运动模型,

x=x0 +vt
在这里插入图片描述

也就是说,按照这个模型,如果我们的速度保持恒定为1m/s,如果我们在t=0时刻的位移x0=0,那么我们就有百分之一百的把握说当t=1s时,车辆一定在x=1m处,而且给定任何一个时刻我都可以计算出车俩的位置。这样看来我们好像已经解决了车辆定位的问题,因为我们可以知道车辆在任意时刻的位置,可情况真的有这么简单吗?

来看一下这个模型会出现什么问题,
我们假定了车辆运动速度是恒定的,根据牛顿运动定律我们知道,想要保持速度恒定,物体受力一定要是恒定,那现实中受力可以恒定吗?
很可惜,实际情况中这是不可能的,即使发动机输出的力可以保持恒定,但是外力的情况太过复杂,比如风力,尤其在大风情况下,风速,风向每时每刻都在变化,导致合力变化,进而使加速度变化,速度就不可能保持恒定。
实际情况就可能是这样的,反正不会如你所愿。
在这里插入图片描述

这时一定会有人提出疑问,那我建一个变加速模型,检测车辆受到的合力,算出每时每刻的加速度不就行了吗。
但很可惜,这也不行,因为第一没有办法检测车辆每个位置受到的力的情况,第二是即使检测到,需要建立的模型就会太过复杂,计算量太大,失去了实际应用价值。
受力太过复杂
还会有人说,不就是点风嘛,能有多大的误差呢。针对这个问题,即使不谈台风那些极端天气,最为重要的是这个误差是不会消失的,会永远存在于你的数据中,经过长时间的累计,误差就会变得不可忽略。
实际应用的模型都会做一定的近似,对一些次要条件进行取舍,这就产生了需要卡尔曼滤波的第一个原因——没有完美的模型,需要对模型误差(也称模型噪声)进行处理。

这时又有人想到,用模型计算实际上是闭着眼睛猜车在哪里,那我直接拿一个装置检测车辆位置,比如地上放一些传感器,车辆经过就会亮灯,这不就知道车辆位置了吗,哪里亮灯车就在哪里。
但这样的问题是第一个是需要大量传感器,成本太高,第二是如果你去的地方没有传感器,那你的车辆就失踪了。
那要是使用卫星,雷达一类的东西进行扫描呢,可以覆盖很大的范围。很可惜还是不行。雷达之类的原理是靠电磁波的,而大气中存在大量的电磁波,这些杂波都会对观测产生影响,即使滤波也无法完美剔除。这就产生了需要卡尔曼滤波的第二个原因——观测亦有误差(也称观测噪声),也需要处理。

将通过模型计算得到的结果称为模型输出,观测器得到的结果称为观测输出,这两个输出都是具有实际物理意义并且包含一定真值信息,现在需要一个工具将这两个信息中的真值信息提取出来,而这个工具就是卡尔曼滤波。

二、卡尔曼滤波器的设计思路

2.1设计思路

首先介绍一个例子来直观理解卡尔曼滤波器的想法。这个例子完全来自我上面推荐的B站视频,大家也可以直接去看视频。
假设我们想要测量一个物体的重量,手里有两个秤,一个A秤准一点,测量标准差为2g,另一个B秤误差大一点,测量标准差为4g。(标准差的概念大家知道吧,如果确实不知道可以写在评论区,我再补充)
对一个物体质量测量的结果为A秤30g,B秤32g,是直接选择标准差为2g的30g数据呢,还是可以通过一些运算将这两个数据融合得到更准确的数据呢?其实后者是更好地,下面通过数学推导来感受一下,放心,推导很简单。
在这里插入图片描述
如果有人不明白为什么方差越小结果就越准确可以留言,我再解释。

这个过程叫做数据融合,将两个都不怎么准确的数据通过一定的方式结合,得到一个更准确的结果·
仔细想想,两个不怎么准确的数据得到一个更准确的数据,这和上面汽车定位的问题不是很像吗?可不可以借鉴一下呢?而这就是卡尔曼滤波的雏形。
细心的读者会发现在计算真值的时候设了一个参数K,这个K就是卡尔曼滤波中最核心的东西——卡尔曼增益。最后的数学推导就是为了求出卡尔曼增益。

2.2递推过程

接下来再举一个例子来说明卡尔曼滤波需要的递推过程。
上面的测量例子是两个秤各秤一次,那要是一个秤测量多次该怎么办呢?
最简单的思路是初中就学过的多次测量取平均。但是多次测量怎么和递推有关系呢?还是用推导过程说明一下。
在这里插入图片描述
这样做到的好处就是不要将所有的测量数据都保存下来,当得到第(n+1)个测量数据时,只需要将通过前n个数据得到的结果和第(n+1)个数据融合。

三、卡尔曼滤波推导

在对卡尔曼滤波有一个直观理解以后,两个秤的情况搞定了,一个秤测量多次的情况也搞定了,现在就差把两种情况结合起来,也就是卡尔曼滤波的最终形态。
我们还是避无可避的来到了最难的地方——数学推导。但不用担心,上面推荐的视频里的推导过程是我见过最详细的,只要知道状态空间,知道导数,知道求最小值要让导数为0,知道矩阵,知道矩阵的乘法、转置和求逆,知道随机变量的期望和方差,就足够看懂推导过程了。需要用到的数学公式,性质我会在推导的过程中用紫色记号进行补充。好了,让我们一起啃下这块硬骨头吧。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
卡尔曼滤波五大公式我们已经得到了最核心的一个,别着急,不用怕,不要被还有四个公式吓倒,最重要也是最难的部分已经结束了,让我们一起走完最后一点点路吧,一起征服卡尔曼滤波。

通过卡尔曼增益计算式和后验估计计算式,我们就可以由任意k时刻的先验状态值和测量值计算得出更准确的状态估计值,也就是后验估计值,但我们还缺少一点东西,不同时刻的协方差矩阵是怎么来的呢?接下来就要解决这个问题。
在这里插入图片描述
好了,到此,卡尔曼滤波的五大公式我们就都已经得到了。
你一定会惊讶,什么,这不是刚得到三个公式吗?怎么就5个了呢,
告诉你个好消息,其余的两个公式在推导卡尔曼增益的时候就已经得到了,只是我们没有特别说明而已,下面我们来总结一下所有公式。
在这里插入图片描述
好了好了,我们总算是得到了全部的卡尔曼滤波公式,那我们终于可以开始使用卡尔曼滤波了吗?
其实还差最后一点点,真的是最后的一点点,而且完全不需要数学推导了。
既然我们是递推公式,每一个时刻都要用到上一个时刻的值,那一直往前递推,递推的起点应该是多少呢?
非常开心的告诉大家,这个值是可以任意取的,只要别过分离谱就可以。因为卡尔曼滤波本身就是为了滤除噪声,减小误差而出现,所以你初始值不准,有偏差,无非就是误差大一点而已,随着时间的推移,测量数据的增多,初始误差会逐渐消失不见。

终于,终于,我们终于是把卡尔曼滤波完完全全的说完了,下面是卡尔曼滤波的使用流程图。

在这里插入图片描述

四、总结

搞定,这就是完完整整的卡尔曼滤波了,让我们总结一下卡尔曼滤波到底是干了点什么事。
假如还用车辆定位举例子,卡尔曼滤波说穿了就干了这么件事,
在这里插入图片描述
在k时刻的时候,小车位于x0位置,
而到了k+1时刻,我通过模型计算认为小车现在在红色车x1位置,注意,这只是我认为车应该在这里。
实际上由于模型误差,也就是过程噪声的存在,小车实际上在紫色车x2位置。注意,现在是实际的,小车实实在在的,就在这个位置。
然后我要通过一个传感器得到小车现在的位置,由于测量误差,也就是测量噪声的存在,传感器认为小车在蓝色车x3位置,注意,这是传感器认为车在这里,实际上车也不在这里。
红紫蓝三个颜色中只有紫色是正确的,但因为两种噪声的存在我却没有办法得到它,只能得到红蓝两个错误的位置,卡尔曼滤波就是通过这两个错误的位置来估计真实的紫色车到底在哪里。
然后通过那五大公式计算得到棕色车x4的位置
在这里插入图片描述

虽然棕色车还是无法百分百的准确,但是比红色车和蓝色车更加准确。
假如过程噪声更小,我就会更愿意相信模型计算结果,棕色车就会更贴近红色车位置
假如测量噪声较小,我就会更愿意相信测量结果,棕色车就会更加贴近蓝色车位置

之后就会把棕色车作为此刻的真实位置进行迭代,棕色车就会变成黑色车,作为下一时刻的迭代初值,重新计算红色车位置,获得观测蓝色车位置,计算棕色车位置,如此开始循环。
这就是卡尔曼滤波的本质和计算过程。

后记

说实话,如果你仔细认真看完全部的推导过程,除了惊叹于前人的智慧以外,单纯的推导过程其实并没有多么难以理解的地方,只是高数线代概率论的知识,有本科的数学知识就足够了,最多其他专业的学生要多学习一下状态空间表达式的知识,这部分在现代控制理论会学到。
核心的推导过程真的没有多难,但为什么在看书的时候很多推导过程都是云里雾里,完全如同天书一般,用了很多我在本科从未见过的数学符号。而且很多地方都有大量的省略,对初学者非常不友好。所以我在看到那个视频的时候兴奋之情溢于言表,这才是好的推导过程啊,决定自己跟着写一遍,也为后人铺路。
其次就是讲述知识的顺序,像我在开始说的,一上来就是大量的数学推导,没有直观感性的理解,如何能明白抽象理性的推导呢。我理解学术应该严谨,但我真的很痛恨这种行为。
当年明月曾在《明朝那些事儿》中说历史其实可以很有趣,我同样认为科学也完全可以很有趣。当然,严谨和有趣并存的科学确实很难做到,我也无法改变科学文章行文风格。所以我只能在博客里尽量做到这一点,希望后人能有所改变吧。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值