接触过传感器数据的同学一定不可避免见到一个名字“卡尔曼滤波”。这是何方神圣?请看后面分晓。很多时候看不懂一个算法是因为里面很多概念上的问题你没了解,就直接看细节了当然看不懂。最关键的事就是你得先了解卡尔曼滤波到底有啥用,它的初衷是什么?接下来我就是想讲讲破解卡尔曼滤波的一些概念上的认知障碍这个事。
破解概念上的认知枷锁:卡尔曼滤波做的事
卡尔曼滤波做的事就是:举个例子,已知上个时刻飞机的位置,知道现在这个时刻收到的雷达测量的飞机的位置。用前面两个数据来估计此时飞机的位置。精简的说就是知道上个时刻状态,又知道测量数据,融合这两个数据来求当前状态。
你一定会问现在知道当前时刻的测量数据那么我认为当前状态就是测量数据不就好了么?换句话说:“你一定会觉得雷达测量到的飞机位置不就是当前飞机的位置嘛?为何要用卡尔曼滤波来估计飞机当前的位置?”。
答:现在这个时刻收到的雷达信号测量的飞机的位置还真不一定是飞机当前的真实位置。首先雷达信号测量有误差。其次你想想我现在收到雷达信号,那是之前发射过去然后返回的信号。这个过程是不是要时间?这段时间飞机说不定以超2倍音速飞行,说不定直接坠机,这些都有可能**。也就是说即使收到测量数据但是还是不确飞机位置在哪**。于是我得需要根据前一个时刻的位置估计出当前时刻的飞机位置 结合 测量数据 综合考虑来 估计当前飞机位置。这就是卡尔曼滤波的作用。
那么你一定会问根据前一个时刻估计的飞机位置怎么就可以估计现在这个时刻的飞机位置了?
答:卡尔曼认为所有的状态变化(位置变化)都是线性的。什么叫做线性?上个时刻位置是0.3,速度是0.2。那么我估计下个时刻的位置就是0.5。这就叫做线性。
接下来你一定会问那并不是所有的状态变化都是线性的怎么办?你像风速变化它就不是线性的。
答:恭喜你发明了新的算法。事实上别人已经为这个算法命名了叫做扩展卡尔曼滤波。现在我们要学习的是卡尔曼滤波。你只需要记住卡尔曼滤波就是认为所有变化都是线性的。
那么现在我知道了怎么用上个时刻飞机的位置估计当前时刻的飞机位置,也知道了还得借助当前时刻收到的测量数据来综合考虑来估计当前飞机的位置。那么怎么综合考虑呢?这就涉及到一个比例。到底这两个数据占比多少?这就是卡尔曼滤波的核心精髓。卡尔曼滤波算法要动态的调这个比例。(有种中庸之道的调调,既不只信测量数据,也不只信上个时刻的位置所估算的当前时刻位置。)
滤波算法的思路发展?
如果不理解滤波思路那么今天学会了一个卡尔曼滤波明天还有一个通尔曼滤波要你学。如果学会这些滤波算法的思路,把他们联系在一起然后记忆那就简单多了。滤波算法本质上就是利用多个数据来融合估计真实状态。下面举两个从浅到深的例子。
如何结合“飞机的速度和雷达测量的飞机的位置 ”来估计飞机在 t 2 t_2 t2时刻的位置?
下面有个一个飞机只会水平飞行。我们已知上个时刻飞机的位置 x 1 x_1 x1和速度 v 1 v_1 v1.而且雷达可以测量到 t 2 t_2 t2此时飞机的位置 x 2 ∗ x_2^* x2∗。那么我们估计飞机的位置那就有两种方法:“一是认为飞机是匀速( v 2 = v 1 v_2=v_1 v2=v1)直线运动得到现在飞机位置为 x 1 + v 2 ( t 2 − t 1 ) x_1+v_2(t_2-t_1) x1+v2(t2−t1),另一种是认为飞机位置就是测量值 x 2 ∗ x_2^* x2∗”。如果按第一种那么万一飞机不是匀速走呢?如果按第二种万一雷达很不准呢?我们得采取一种折中的方法。
我们认为飞机在时刻 t 2 t_2 t2的位置为 x 2 r e a l = ( x 1 + v 2 ( t 2 − t 1 ) ) + α [ x 2 ∗ − ( x 1 + v 2 ( t 2 − t 1 ) ) ] x_2^{real}=(x_1+v_2(t_2-t_1))+\alpha [x_2^* - (x_1+v_2(t_2-t_1))] x2real=(x1+v2(t2−t1))+α[x2∗−(x1+v2(t2−t1))]。这个 α \alpha α需要我们自己设置。如果我们相信雷达不准那就 α \alpha α赋值很低比如为0.1.如果我们相信雷达很准那么就设置 α \alpha α为很接近1的值比如0.9。你会发现 α \alpha α越接近0,那么所估计的位置越是接近认为飞机匀速走的那个思路。越接近1那么所估计的位置越接近雷达测量值(等于1就是认为飞机在时刻 t 2 t_2 t2的位置就是雷达测量值)。
但是飞机的速度怎么估计啊?因为飞机不一定是匀速走。我们得根据
现在我想估计飞机的速度。
速度估计的方式有两种:
- 假设飞机是匀速运动。也就是说 t 1 t_1 t1到 t 2 t_2 t2这段时间内飞机速度等于在 t 1 t_1 t1时刻估计出的飞机速度 v 1 v_1 v1。即 v 2 = v 1 v_2=v1 v2=v1
- 由于雷达也收到了一个测量数据,它测量到雷达距离飞机位置是 x 2 ∗ x_2^* x2∗。也就是说在雷达看来从 t 1 t_1 t1到 t 2 t_2 t2这段时间内飞机走过了 x 2 ∗ − x 1 x_2^*-x_1 x2∗−x1这么远的距离。所以根据雷达的判断,我们可以估计出飞机的一个速度 v 2 ∗ = x 2 m e a s u r e − x 1 r e a l t 2 − t 1 v_2^*=\frac {x_2^{measure}-x_1^{real}}{t_2-t_1} v2∗=t2−t1x2measure−x1real。
这两种速度很可能不同。这有两个原因:“一是飞机并不是匀速运动,二是雷达根本就测量的距离不准”。到底是哪个对呢?
真实速度需要综合考虑这两个数值,根据上一个例子总结的滤波器模式第N次算出的估计值=上次的估计值+ 因子a ×(测量值-上次估计值)
。我们知道真实的速度肯定可以这么表达 v 2 r e a l = v 1 + β × ( v 2 ∗ − v 1 r e a l ) v_2^{real}=v_1+\beta \times (v_2^*-v_1^{real}) v2real=v1+β×(v2∗−v1real)。至于这个 β \beta β到底取多少这是我们自己赋值。比如我们觉得测量的值是更准确的,那 β \beta