Dirty hands
在一整套卡尔曼滤波理论和公式学完之后,你终于觉得大功告成,开始设计第一个卡尔曼滤波器。
但是好像还是有什么地方不对劲:
你>:。。。等会。。。卡尔曼博士,你这公式好像没给全啊
卡尔曼博士>:哪里没给全?
你>:这预测方程和更新方程里都假设叠加了一个随机变量Q和R,它们的期望和方差具体值都不知道啊。方差都不知道,这公式让我怎么算呢?
卡尔曼博士>:我是个数学家,你这问的都不是个数学问题,跟我有关系吗?!
你>:。。。???!!!
得,又回到原点,学了一大堆公式,怎么还是没用呢?的确,要设计出一个能好用的卡尔曼滤波器,现在才刚刚开始;而现在最重要的任务,就是要确定Q和R的值,这样公式才能计算起来。然而对于任何一种随机自然现象,比如刮风下雨,地震海啸,数学家在推导公式过程中可以简单地用一个高斯分布来假设,但分布的具体参数值怎么找出来?所以数学家这个工作有时候还是挺让人羡慕的,至少挖坑不用填。而工程师这职业就有点作孽,总得有人填上吧!以后如果碰上一个“见坑就想填”的工程师那真算是福星高照,这简直就称得上是剑胆琴心呐。
从1961年NASA正式决定在登月舱中采用卡尔曼滤波理论开始,到1969年阿波罗登月成功之前,数千名工程师工作了近8年时间。
所以如果想要实现一个能真正工作的卡尔曼滤波器,那么就做好"Get your hands dirty"的决心吧!
调参的方法
调参这个事其实大家多少都有点经验。比如控制领域非常普及的PID系统,在系统设计完成之后要进行仔细的参数调节。这种参数调节实际上是一个根据经验不断试错的过程,最后试出一组最合适的参数出来。这是一种手工的过程,所以效率实在算不上高。
卡尔曼滤波器的参数有其自己的特点。相比PID系统,线性系统的卡尔曼滤波器数学模型比较完整,参数一般都有比较明确的物理意义,参数调整的时候其实是一些规律可循的。
手工调参
对于模型简单一些的系统来说,还是有不少人习惯手工调参,比如:
1. 限制P的值,防止P趋近于0
2. 适当增加Q的值,这样P的值也相应增加
3. 给P乘以一个适当的因子,这样确保K值在一个恰当的范围里
这样通过反复迭代,当迭代出来的参数值逐步收敛于一个稳定值时,就认为获得了一组可用的参数。
离线学习
如果系统模型比较复杂,或者精度要求高,可以使用离线学习的方式,这就要用到Kalman smoother。Smoother可以看作是Kalman滤波的一个特别情况:一般的Kalman filter是利用过去和现在的测量数据来估计将来的状态,而Smoother是在已经获得所有(包括未来)测量数据的情况下,估计过去时间下的系统状态。
Smoother的概念倒也不难理解,不容易弄清楚的是Smoother到底有什么用?尤其是为啥要起个名字叫Smoother?
Smoother主要用于不需要实时处理的情况。有一个基本的事实是:当我们估计状态时,如果有用的信息越多,那显然估计的准确度就越高。过去和现在的数据,能提供的信息量当然是不如包括将来数据在内的所有数据提供的信息量大。所以Smoother在理论上,能够提供比Kalman filter精度更高的估计。估计出来的状态曲线噪声更小,更平滑,因此被称为Smoother也算是切题。
但Smoother因为要等待所有数据都采集完毕才能进行处理,所以付出的代价是失去了Kalman滤波的实时性。不过这样用作离线参数学习的工具倒是没有问题。在这种应用中,通常是对已经建立好卡尔曼模型的目标系统先做大量的测量,把测量数据都记录下来,利用这个测量数据集估计出过去的一系列系统状态值。这个状态值序列的精度是比较高的。然后利用这个状态值序列估计出一个新的参数,以这个新参数代入Smoother模型再次估计出一组系统状态值,如此迭代一直到参数值收敛为止。
自适应滤波
自适应滤波基本思路是引入一个随时间变化的加权因子,在每个更新迭代步骤时对Q和R等参数进行加权更新。当参数趋于稳定收敛时,也就得到了一组优化的参数。这是一种自动化的调参方法。