前言
本文是观看DR_CAN老师的视频后,简单总结了一下的笔记,并根据思路写了示例代码;这里主要讲卡尔曼滤波器与递归算法。
视频地址:https://www.bilibili.com/video/BV1ez4y1X7eR
一、卡尔曼滤波器
卡尔曼滤波器,Kalmen Filter;可理解为是一种算法:最优化 递归 数字处理 算法。它更像一种观测器,而不是一般意义的滤波器。卡尔曼滤波器应用非常广泛,主要是因为很多事物存在不确定性,不确定性体现在三个方面:
- 不存在完美的数学模型;
- 系统存在扰动,或很难建模;
- 测量传感器存在误差。
二、引言案例 测量硬币尺寸
不同的人员,测量同一个硬币,测量结果用
表示,其中k是表示第k次测量;这里产生误差或不确定地方有:尺子本身的误差、不同人员测试的。第一次测量结果,
= 50.1mm;第二次测量结果,= 50.4mm;
第三次测量结果,= 50.2mm;
如果让我们“估计真实数据”,自然会想到取三次结果的平均值。估计值
,用平均值表示:
注释:红色部分是k-1次的平均值,
重新整理后得到:
,其代表的含义是:本次的估计值 = 上一次的估计值 + 系数*(本次测量值 - 上一次的估计值)
观察一下k变化的影响,k是测量的次数:
当k很大时,趋于0,这时估计值,即:测试的次数很多后,本次的估计值,和上一次的估计值很接近了。
当k很小时,趋于1,这时估计值 ,即:测试的次数很少后,本次的估计值,取本次测量值更准确一些。
三、卡尔曼公式
综上所得,卡尔曼公式如下,含义也简单解释一下:
本次的估计值 = 上一次的估计值 + 系数*(本次测量值 - 上一次的估计值)
其中
,Kalman Gain,表示卡尔曼增益/因素通过公式可以看出来,本次的估计值
,与上一次的估计值 有关。然后上一次的估计值,由与上上次的估计值有关;这是一种递归的思想。这也是卡尔曼滤波器的优势,它不需要追溯很久以上的数据,只需拿上一次的数据就可以了。
四、卡尔曼增益 Kalman Gain
如何计算这个卡尔曼增益,这里给出一个公式,后面有机会再详细解释和推导。在此之前,首先介绍两个概念:
估计误差,其中e是指error,误差的意思。EST是指Estimate,估计的意思。
测量误差,MEA是指Measure,测量的意思。真实值和测量值之间的误差。
卡尔曼增益公式如下:(小k是指计算次数;k-1是k的上一次。)
卡尔曼增益 = 上一次的估计误差 除以 (上一次的估计误差 + 本次的测量误差)
五、更新估计误差
估计误差在每次计算中,需要更新的,具体的公式如下:
公式含义:本次的估计误差 = (1 - 卡尔曼增益)* 上一次的估计误差
六、卡尔曼计算流程
首先计算卡尔曼增益
,然后计算本次的估计值 ,最后更新估计误差。第一步:卡尔曼增益 = 上一次的估计误差 除以 (上一次的估计误差 + 本次的测量误差)
第二步:本次的估计值 = 上一次的估计值 + 系数*(本次测量值 - 上一次的估计值)
第三步:本次的估计误差 = (1 - 卡尔曼增益)* 上一次的估计误差
七、实例应用卡尔曼算法
前面讲了这么多理论的,可能不是太清晰,下面用测量硬币的例子,观察一下卡尔曼滤波的魅力。
硬币实际长度:50mm
用尺子手动测量误差是:3mm (即:测出来的结果范围在47mm——53mm之间)
假设模型M能估计硬币的长度
首先让模型M估计一个结果,比如:认为硬币只有40mm;估计误差可能是5mm。
按照卡尔曼算法流程,首先计算卡尔曼增益,然后计算本次的估计值,最后更新估计误差
。 即:画一个表格,观察预测值,和手动测量值变化:
k | 测量值 | 测量误差 | 卡尔曼增益 | 估计值 | 估计误差 |
0 | 40 | 5 | |||
1 | 52 | 3 | 0.625 | 47.7 | 1.875 |
2 | 51 | 3 | 0.385 | 48.847 | 1.153 |
3 | 47 | 3 | 0.278 | 48.334 | 0.832 |
4 | 52 | 3 | 0.217 | 49.13 | 0.651 |
5 | 49 | 3 | 0.178 | 49.10 | 0.535 |
能看虽然手动测量不稳定,存在3mm的误差,但经过卡尔曼滤波后,输出的估计逐渐趋于真实值50,而且也比较稳定。
k =1;第一次手动测量为52mm
k =2;第二次手动测量为51mm
后面的可以自己推算一下。
八、卡尔曼滤波-递归算法 Python版
根据 卡尔曼滤波的流程,用Python写了一个代码,对应上面测量硬币的案例:
代码效果:
本文只提供参考和学习,谢谢。