简单来说,卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法)”。
对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。
他的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。
近来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。
卡尔曼滤波器的介绍:
假设我们要研究的对象是一个房间的温度。
根据你的经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。
假设你对你的经验不是100%的相信,可能会有上下偏差几度。
我们把这些偏差看成是高斯白噪声(white Gaussian Noise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分布(Gaussian distribution)。
另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。
我们也把这些偏差看成是高斯白噪声。
好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值)和温度计的值(测量值)。
下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。
假如我们要估算k时刻的实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)。然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。
由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的协方差(covariance)来判断。因为Kg=5^2\/(5^2+4^2),所以Kg=0.61,我们可以估算出k时刻的实际温度值是:23+0.61*(25-23)=24.22度。可以看出,因为温度计的协方差(covariance)比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。
现在我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。
对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.22度)的偏差。
算法如下:((1-Kg)*5^2)^0.5=3.12。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的3.12就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。
就是这样,卡尔曼滤波器就不断的把协方差(covariance)递归,从而估算出最优的温度值。
他运行的很快,而且它只保留了上一时刻的协方差(covariance)。
上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!
在航天领域,卡尔曼滤波是一种殿堂级的理论,应用的到处都是!
好吧,假设你在去一个风景区旅游的时候,种下了一棵果树,但显然从果树幼苗到果实不是一天两天能完成的啊,需要慢慢长高。而你又不可能经常去看,但又想知道果树的高度,那怎么办?
所以要解决的问题是:如何正确估计一棵果树的高度?
我们把想要知道的果树高度叫做待估的状态变量。我们想一年知道一次,这就叫做步长。
你需要知道种下果树的时候大概高度啊,于是你想了想,大概1米吧,但我也不确定,有可能90公分也有可能110公分。于是这个1米,叫做你的初始状态估计,这个10公分的不确定性,叫做状态估计的误差协方差矩阵,后续它会随着你的下一步估计而变化。
怎么办呢?
你在网上查了查,这种果树差不多每年都比前一年生长10%的高度(纯假设而已哈),这个生长的规律\/模型就叫做状态转移矩阵。于是根据模型,假如2017年有1米,2018年就大概有1.1米。
但显然这个模型不适用于任意一棵果树和你种植当地的实际日照风土情况,而且你明明知道果树不可能无限增长。所以咱们的模型不可能是100%准确的,我们用一个叫做过程噪声的东西来衡量它。可以理解为模型递推下去的不准确度。比如假设这个估计模型误差在0.3米,这叫做白噪声。过程噪声越小就意味着你相信生长模型很准确,越大就表示模型越垃圾。
但尽管如此还是不靠谱啊,闭门猜果树高度肯定不可能一直准,这个时候我们需要找一下本地的朋友们定期去看一眼。由于是拜托他们帮忙,也不想真要求他们爬上去拿尺子量,大概给个数就行,这个朋友帮忙看到的高度就是我们的测量值。
假设有朋友A和b,朋友A很认真,每次都拿尺子大概比一比,告诉你都用大概多少分米来说,比如大概1米8到1米9吧;而朋友b不认真,只瞄一眼说大概1.5-2米吧。但是A有一个坏处,比较懒,两年才给你发个短信;b比较勤快,每年就有。这个2年或者1年就叫做测量更新频率。我们需要他们尽可能提供数据,所以两个都要采纳。而且这两个测量一个来自尺子一个来自视力,不同的测量类型我们都能同时使用,太好了!
你明显觉得A比b要靠谱一些,于是认为A的精度在分米级,b的精度在半米级,这个分米和半米叫做他俩的测量噪声。基于这个测量噪声你可以建立一个测量噪声矩阵,衡量在参考时对A和b观测值的权重。
那么你现在明白了,既需要果树生长模型,这样即便A和b不给我数据,我也大概能估计出明年这个树的高度。但也不能只依靠模型,比如果树进入成熟期慢慢就不长了,我们也需要A和b的观测值去校正估计,那么就需要把他们融合在一起。
于是,从模型这里,有一个衡量初始估计是否准确的矩阵叫做状态估计协方差矩阵,有一个衡量生长模型准确度的过程噪声矩阵;从观测那里有一个衡量观测是否准确的矩阵叫做观测噪声协方差矩阵。
我们把它和模型融合在一起,就变成了一个叫做增益矩阵的东西。糊涂了?别着急,其实增益矩阵就是一件事情:我到底是应该相信我推的模型多,还是应该相信来自A和b的测量多呢?
于是通过增益矩阵和这一系列矩阵,你建立了一套系统:当模型比较准确时,我相信模型多一点,当它不准时我相信实际测量多一些。而且还有一个优势,测量帮助我校正模型准确度;当A和b突然不给我测量时,我也能通过已经建立好的这套体系估计在下一个步长(明年)果树的高度。
卡尔曼滤波就这样建立起来了。
最理想的情况是怎样?
最准确的果树初始高度估计,=较小的状态估计误差
最准确的果树生长状态模型,=较小的过程噪声
最准确的果树测量值,=较小的测量噪声,而且测量类型越多越好(尺子和视力)
卡尔曼博士在1960年去了NASA访问,把这套理论首次提出,震惊了NASA,于是很快采用。美国的标志性阿波罗登月任务,就是使用这套崭新的估计理论,登上月球的!