一、什么是卡尔曼滤波

简单来说,卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优递归数据处理算法)”。

在自然界中往往存在各种不确定性,不管是传感器测量的数据还是系统模型计算得到的数据,往往不是物体真实的值,存在各种各样的干扰,卡尔曼滤波就是从有干扰的数据中获取最优(最接近真实)的数据。

二、卡尔曼滤波基础

先来看一个简单的例子,我们用一把尺子来测一个硬币的直径,如图1:

javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法


我们测量多组硬币的直径,用javascript卡尔曼滤波 详解卡尔曼滤波_算法_02表示,javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_03表示第n次测量的结果,此时我们怎么获得硬币比较接近真实值的直径,在现实中我们测量是有误差的,这个误差可能来自测量器具本身或者其他干扰,并且这个误差一般是服从正态分布,很显然我们可以通过求平均来减小误差,从而得到更加逼近真实值的结果,即javascript卡尔曼滤波 详解卡尔曼滤波_传感器_04

javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_03提出来,即javascript卡尔曼滤波 详解卡尔曼滤波_传感器_06

其中,javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_07是我们计算的平均值,我们用此值估计硬币的直径,也可以将此值称为估计值,所以公式也可以表达如下:

当前的估计值=上一次的估计值+系数*(当前测量值-上次估计值)

我们分析一下公式,当k变大时,即测量次数变多时,javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_07会随着k的增大而越发逼近javascript卡尔曼滤波 详解卡尔曼滤波_算法_09,也就是说,随着测量次数增加,测量结果将不再重要;当k很小时(k是测量次数,所以k>1),测量值对javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_07的影响很大。我们令javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_11

javascript卡尔曼滤波 详解卡尔曼滤波_算法_12

我们往往把这个javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_13称为卡尔曼增益,这时大家可能有疑惑,这不就是一个求平均的递归形式嘛,算什么卡尔曼滤波,你这就是标题党。大家稍安勿躁,我们接着往下看

还是刚刚求硬币直径的问题,在上一个例子中,我们使用一把尺子来测硬币直径,我觉得一把尺子测得不准,这回我拿两把尺子,第一把尺子测得硬币直径z1=30mm,第二把尺子测得硬币直径z2=32mm,假定这两把尺子测得都有误差,且误差服从正态分布,第一把尺子的标准差为javascript卡尔曼滤波 详解卡尔曼滤波_传感器_14,第二把尺子标准差为javascript卡尔曼滤波 详解卡尔曼滤波_传感器_15,此时我们怎么得到比较准确的硬币直径?两尺子测量值的正态分布图如下

javascript卡尔曼滤波 详解卡尔曼滤波_传感器_16


我们此时为了得到更准确的硬币直径,参考上一个例子求平均的公式,可以得到javascript卡尔曼滤波 详解卡尔曼滤波_传感器_17javascript卡尔曼滤波 详解卡尔曼滤波_javascript卡尔曼滤波_18时,javascript卡尔曼滤波 详解卡尔曼滤波_javascript卡尔曼滤波_19,当javascript卡尔曼滤波 详解卡尔曼滤波_算法_20时,javascript卡尔曼滤波 详解卡尔曼滤波_传感器_21,选择合适的javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_13可以得到更逼近真实值的值,这个问题由此转变为求优的问题。为了使估计值javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_23更接近真实值,那么javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_23的标准差javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_25必须最小,才能得到更准确的值。javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_23的方差可以表示为javascript卡尔曼滤波 详解卡尔曼滤波_算法_27又因为javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_28javascript卡尔曼滤波 详解卡尔曼滤波_javascript卡尔曼滤波_29相互独立,所以上式javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_30相当于求二次函数最小值,我们可以解出此时javascript卡尔曼滤波 详解卡尔曼滤波_传感器_31javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_32javascript卡尔曼滤波 详解卡尔曼滤波_算法_33,此时我们可以看到标准差只有javascript卡尔曼滤波 详解卡尔曼滤波_算法_34,小于javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_35javascript卡尔曼滤波 详解卡尔曼滤波_javascript卡尔曼滤波_36,说明此时估计值的可信度是高于两个传感器的测量值,即估计值javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波算法_23更接近真实值,通过这种算法,我们从两个具有不同误差的传感器中获得了更加准确的值,这就是所谓的数据融合(Data Fusion),将估计值曲线用matlab画出(中间黄色的曲线)

javascript卡尔曼滤波 详解卡尔曼滤波_卡尔曼滤波_38


记住这个思想,接下来要开始我们的重头戏了,卡尔曼滤波五大公式的推导。