找遍全网,个人认为这篇讲的最好。
参考:https://blog.csdn.net/young_gy/article/details/78177291
http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies(详细计算实例)
卡尔曼滤波是一种在不确定状况下组合多源信息得到所需状态最优估计的一种方法。本文将简要介绍卡尔曼滤波的原理及推导。
![](https://i-blog.csdnimg.cn/blog_migrate/d524340d87fb8a88e08259c995801bda.jpeg)
什么是卡尔曼滤波
首先定义问题:对于某一系统,知道当前状态XtX_t,存在以下两个问题:
- 经过时间
![](https://i-blog.csdnimg.cn/blog_migrate/406077ef36cccfbd17b270e2fdaa6d65.png)
后,下个状态
![](https://i-blog.csdnimg.cn/blog_migrate/3cd030ca610dcb87d2be98410b19e172.png)
如何求出?
- 假定已求出
![](https://i-blog.csdnimg.cn/blog_migrate/3cd030ca610dcb87d2be98410b19e172.png)
,在t+1t+1时刻收到传感器的非直接信息
![](https://i-blog.csdnimg.cn/blog_migrate/70e147a0f5321c9de6ce6856d7d75829.png)
,如何对状态
![](https://i-blog.csdnimg.cn/blog_migrate/c232889a2ffc4621b035542dd09d911e.png)
进行更正?
这两个问题正是卡尔曼滤波要解决的问题,形式化两个问题如下:
- 预测未来
- 修正当下
下面,将以机器人导航为例,从预测未来和修正当下两个角度介绍卡尔曼滤波器。
卡尔曼滤波的原理
问题场景如下:一个机器人,我们想知道它实时的状态
![](https://i-blog.csdnimg.cn/blog_migrate/c2b7062695d78068dbe9513613e81933.png)
,同时也想做到预测未来和修正当下这两件事。
其状态xx表示为一维大小为2的向量,元素分别表示位置信息与速度信息:
![](https://i-blog.csdnimg.cn/blog_migrate/c8c907434f207554ed07b1e60bcc6078.png)
可是状态xx不一定是精准的,其不确定性用协方差表示:
![](https://i-blog.csdnimg.cn/blog_migrate/0dbf1bda9c555c42414c2e80ec07fdf5.png)
预测未来
只考虑自身状态
只考虑自身状态的情况下,根据物理公式,可得:
![](https://i-blog.csdnimg.cn/blog_migrate/7397167a25a46d73b40f7e4032edd69b.png)
用矩阵表示如下:
![](https://i-blog.csdnimg.cn/blog_migrate/4162d9fb32f3a5adeb9ca9f95b0ca001.png)
在状态变化的过程中引入了新的不确定性,根据协方差的乘积公式可得:
![](https://i-blog.csdnimg.cn/blog_migrate/6ba3171138ab78c4df0b60f14316d91b.png)
考虑外部状态
外部状态,这里以加速度为例,引入变量
![](https://i-blog.csdnimg.cn/blog_migrate/da854c89d680019e3a09e3a341610656.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ea0fbf72bf96e7facd68cb2247d3ebe.png)
同时,环境仍然存在我们无法刻画的误差,以
![](https://i-blog.csdnimg.cn/blog_migrate/e17768408eb2c7c696d71ec314ca84ff.png)
表示,最终的预测公式如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1e84d68c7a629ab7c6634a0e8cd7f60e.png)
从上述式子可见:
- 新的最优估计是之前最优估计之前最优估计}}的预测加上已知的外界影响已知的外界影响}}的修正。
- 新的不确定度是预测的不确定度加上环境的不确定度。
修正当下
我们已得到
![](https://i-blog.csdnimg.cn/blog_migrate/17df18e0e40fa2e69040e5de07e49b22.png)
,下面要通过观测到的测量值
![](https://i-blog.csdnimg.cn/blog_migrate/150db6cf09bb12339dd7ea26a2827863.png)
对
![](https://i-blog.csdnimg.cn/blog_migrate/7b71b5cedb62db4199a5bdfc1f3fd406.png)
进行更新。
因为
![](https://i-blog.csdnimg.cn/blog_migrate/2c661f4d9bc29478851418247bf114dd.png)
和
![](https://i-blog.csdnimg.cn/blog_migrate/ca1492688c3d5f21b7a44f9dbcece357.png)
的数据尺度不一定相同,例如
![](https://i-blog.csdnimg.cn/blog_migrate/1de3e42f9fac3d1ca4c6f53d850202d7.png)
包含了笛卡尔的坐标信息,使用radar得到的
![](https://i-blog.csdnimg.cn/blog_migrate/915499991b35d1db87f7a79f49b5147e.png)
则包含极坐标信息。所以首先应该把两者放在相同的尺度下去比较,尺度转换使用Hk\mathbf{H}_k将预测信息转化为测量信息的尺度。
![](https://i-blog.csdnimg.cn/blog_migrate/b29af12f8c932f4487c27a620b7e8360.png)
这样一来,便得到测量尺度上的两个分布:
- 测量值的分布
![](https://i-blog.csdnimg.cn/blog_migrate/1a53b2d27fe91b0c2ce97ab9deec9365.png)
- 预测值变换后的分布
![](https://i-blog.csdnimg.cn/blog_migrate/1b7e7a848f48d58848cf7a17db2385f6.png)
下面一个问题就是如何用这个两个分布组成新的分布。
![](https://i-blog.csdnimg.cn/blog_migrate/aefa25e44d89f4063104df7978252d82.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad4daff9ec5f78d9cf2169257f9501e7.png)
简单的一维情况如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d79da58c4e9f0e09944abfb940837144.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5f0534701c14a38a86da7ca1e126e4d6.png)
总结
预测未来
![](https://i-blog.csdnimg.cn/blog_migrate/7989937892dcf61a52ecacae34172d4b.png)
修正当下
![](https://i-blog.csdnimg.cn/blog_migrate/08467edfb670dc1d16f1fe62cbfd8d1a.png)
卡尔曼滤波需要内存少,计算速度快,适合实时性情况与嵌入式设备的需要。