1. 什么是卡尔曼滤波
百度百科定义
:卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可以看作是滤波过程。
有简单一点的话术来总结:
卡尔曼滤波是一种系统状态最优估计的方法。
2. SLAM的状态估计
在后端优化中,我们可以根据所考虑时刻(帧数)信息的多少来进行分类:
- k时刻的状态和前面所有时刻的信息有关,甚至用未来的信息来更新,这样的处理方式称为“
批量的(Batch)
”。这种处理方式常用非线性优化方法。 - k时刻的状态只和k-1时刻的状态有关,即马尔科夫性,并且是一阶马尔科夫性。这种处理方式称为滤波器方法(卡尔曼滤波器)。
3. 卡尔曼滤波器的推导
根本思路
:记住卡尔曼滤波器是对系统状态进行最优估计的方法,且利用的是线性系统状态方程。
第一步
:状态估计:
根据运动方程的状态方程(式9.3),我们用贝叶斯法则利用0到k中的数据来估计k时刻状态分布 左边即k时刻的状态分布(后验分布,它根据了观测数据来求状态,是知果求因)。右边第一项是似然(知因求果),第二项是先验(历史求因): 我们卡尔曼滤波器,求的就是这个式子,我们希望估计k时刻的后验分布,那么只要求得k时刻的似然和先验即可,整个推导过程牢记这个式子,以免在推导的过程中迷失了自己。(甚至可以粗暴的认为,卡尔曼滤波器就是一个矩阵,k-1时刻的后验为x,通过Ax=b我们就求得的k时刻的后验分布。)
然后,我们将先验以时刻为条件概率展开:
然后我们再假设马尔科夫性,简化这个式子,会得到一个抽象关系式: 这两步想说明的是,我们实际在做的是“如何把k-1时刻的状态分布推导至k时刻”,即我们用k-1时刻的后验分布,计算k时刻的先验,最后求得k时刻的后验(状态分布)。我们只要维护一个状态量(后验),对它不断迭代和更新即可。后面的证明不会用到这两步,我们假设k-1时刻的后验已知,后验分布均值为,后验分布协方差为
第二步
:线性高斯系统
我们知道卡尔曼滤波器利用的是线性系统状态方程,所以我们要假设运动方程和观测方程可以用线性方程描述: 这里的噪声服从零矩阵高斯分布 实际上,运动方程这里隐藏的信息是:k时刻的先验=k-1时刻的后验的线性映射
第三步
:预测
预测,意思是如何从上一个时刻的状态(即后验,假设已知),根据输入信息(有噪声,服从高斯分布)推断当前时刻的状态分布(先验)。然后根据线性方程即运动方程和附录A.3(高斯系统复合即加、乘之后的均值和协方差的变化情况),可以将k时刻的先验分布求出来: 我们记预测的两个式子为预测:(k时刻的先验=线性k-1时刻的后验)
第四步
:卡尔曼增益和后验分布的推导
- 我们知道了先验分布怎么求,接下来求似然。根据观测方程和附录A.3(高斯系统复合的性质)求出似然的均值和协方差:
至于这里为什么协方差不是附录4.3中的形式即,这个问题,博客zkk9527给出了解释。而我的理解是,我在回顾整个推导过程,(既不是后验也不是先验)的作用是作为一个参考量,比较与相关的一次项系数和二次项系数来求得预测和卡尔曼增益。它不存在于我们最后的卡尔曼滤波器5个公式中,所以这里的是一个定值,如果是定值则没有协方差之说,而均值就等于它本身。- 现在有了先验和似然,我们将两项乘起来便得到k时刻的后验:
- 我们已经知道等式两侧都是高斯分布,所以只需要比较指数部分,不需要比较高斯分布前面的因子部分(我的理解是,回顾书上P236式9.5中的贝叶斯公式,分母evidence即中的被省略掉了,等式用了正比于符号表示。而后推导出两边高斯分布的均值和协方差后,又把正比于符号用等号代替,增加了一个比例系数,那么严格来说这里的,就是前面的evidence的倒数,即使知道了这个,书上的推导还是假设了两边的因子相等,不知道为什么),所以我们把指数部分展开:
SLAM.pdf
至此,我们已经推导了卡尔曼滤波器的整个过程。再来总结一下,卡尔曼滤波器推导后有5个公式(2个预测即先验的均值和协方差,1个卡尔曼增益,后验分布的均值和协方差):
- 预测:
- ![](https://cdn.nlark.com/yuque/__latex/a58089bbb8050bdf13d65ba19a2c5cfa.svg#card=math&code=%5Ccheck%7Bx%7D_k%3DA_k%5Chat%7Bx%7D_%7Bk-1%7D%2C%20%5C%20%5C%20%5Ccheck%7BP%7D_k%3DA_k%5Chat%7BP%7D_%7Bk-1%7DA%5E%5Ctop_k%20%2B%20R&id=drzd3)
- 更新
- 卡尔曼增益:
- 后验:
- 卡尔曼增益:
如何更好的记忆呢?
k时刻的先验和k-1时刻的后验成线性映射;k后验的均值等于先验均值加上一个卡尔曼增益和观测误差的乘积。
简化的步骤:
- 状态估计:由贝叶斯定理得到状态估计的后验正比于似然×先验
- 线性系统:运动方程和观测方程的线性方程列写
- 预测:进行贝叶斯方程的先验推导,利用运动线性方程和高斯方程加乘性质
- 卡尔曼增益推导:
- 利用观测方程的高斯分布性质求似然。
- 后验=似然×先验
- 比较等式两边指数部分,得到卡尔曼增益K的定义(最后的K用SMW进行相等)
- 更新:利用后验的等式和卡尔曼增益,推出后验的均值和协方差式子
4. 扩展卡尔曼滤波
我们知道,卡尔曼滤波利用的是线性系统方程,而SLAM中的运动方程和观测方程通常是非线性的,特别是加入了相机内参模型和李代数表示的位姿,更不可能是一个线性系统。一个高斯分布,经过非线性变换后,往往不再是高斯分布。
所以我们需要将卡尔曼滤波器的结果拓展到非线性系统中。处理方法是:在某个点附近考虑运动方程及观测方程的一阶泰勒展开,只保留一阶项,即线性的部分。然后按照线性系统进行推导。总的来说,就是把非线性近似到线性,再利用相似的推导推导出扩展卡尔曼滤波。
流程:
- 非线性到线性:将运动方程(xk-1)和观测方程(xk)一阶泰勒展开
- 状态估计:即后验的贝叶斯方程,后验=n似然×先验
- 线性系统:第一步已经给出
- 预测:利用线性运动方程和xk-1时刻的后验和高斯复合法则,求出k时刻的先验
- 卡尔曼增益的推导:计算出似然,得到贝叶斯方程两边的结果。比较指数部分,定义卡尔曼增益
- 更新:得到后验关于先验的映射关系