推荐开源项目:简单的SLAM与机器人教程与编程实践-github
牛逼的算法往往都是来源于一个很简单的思想所演化而来,如果你不了解这个思想和演化过程那就谈不上了解那个牛逼的算法——@Ai酱
直观理解
首先卡尔曼滤波要解决的问题是什么?我以机器人估计自己离障碍物距离为例
答:首先机器人已知“上个时刻机器人离障碍物距离”,“传感器测量的机器人离障碍物的距离(我们称它为观测值,比如雷达直接测量机器人离障碍物距离7m)”和“自己当前时刻的速度”这三个数据。而根据“上个时刻机器人离障碍物距离”和“自己当前时刻的速度”可以估算出当前机器人离障碍物的距离(我们称它为估计值)。比如:上一秒离障碍物10m,速度是4m/s,那么现在这秒估计就离障碍物距离是6m。那么问题来了,机器人离障碍物的距离现在既有个观测值7m,又有个估计值6m。到底相信哪个?单纯相信观测值万一那传感器坏了呢?单纯相信估计值那么万一上个时刻的距离估计值或者速度不准呢?所以,我们要根据观测值和估计值的准确度来得到最终机器人离障碍物的距离估计值。准确度高的就最终结果比重高,准确度低就占比低。如果雷达测量的那个7m准确度是90%,根据速度估计出的那个6m准确度是80%,那么最终的距离估计结果就是 r e s u l t = ( 1 − 0.9 0.8 + 0.9 ) ∗ 6 + 0.9 0.8 + 0.9 ∗ 7 = 6.52 result=(1-\frac{0.9}{0.8+0.9})*6 + \frac{0.9}{0.8+0.9}*7=6.52 result=(1−0.8+0.90.9)∗6+0.8+0.90.9∗7=6.52米.
事实上 0.9 0.8 + 0.9 \frac{0.9}{0.8+0.9} 0.8+0.90.9这个就是所谓的卡尔曼增益。
直观理解讲完了,以上。
但是上面的90%与80%这两个准确度是怎么计算的?卡尔曼这个人到底是怎么发明卡尔曼滤波算法的?卡尔曼发明算法的思路历程是什么?卡尔曼滤波算法到底与贝叶斯滤波算法有什么联系?我想这些肯定是你脑海中挥之不去的阴影,仅仅从直观理解无法解答这些问题。
卡尔曼滤波(Kalman filter)算法与贝叶斯滤波(bayes filter)算法之间的联系是什么?
答:贝叶斯滤波是一种思想,它告诉了我们怎么在知道观测值与控制命令这两种值的可信度时如何计算最终估计出的值的可信度。但是贝叶斯滤波并没有告诉我们怎么计算观测值的可信度,怎么对控制模型(发出控制命令后机器人是按照怎样的模型执行)进行建模。而卡尔曼滤波算法就是对贝叶斯滤波算法的一个具体实现。卡尔曼滤波认为观测值可信度模型是一个正态分布,控制模型是一个正态分布。
所以卡尔曼滤波算法是源自于对贝叶斯滤波算法的进一步演化,我希望在学本文前你能对贝叶斯滤波有了解。如果你还不清楚贝叶斯滤波怎么做的?可以看看这篇文章【易懂教程】我是如何十分钟理解与推导贝叶斯滤波(Bayes Filter)算法?
回顾一下贝叶斯滤波算法:
在贝叶斯滤波中我们知道了: P ( x t ∣ z t , u t , x t − 1 ) = η P ( z t ∣ x t ) P ( x t ∣ u t , x t − 1 ) P(x_t|z_t,u_t,x_{t-1})=\eta P(z_t|x_t)P(x_t|u_t,x_{t-1}) P(xt∣zt,ut,xt−1)=ηP(zt∣xt)P(xt∣ut,xt−1)。
其中 P ( x t ∣ z t , u t , x t − 1 ) P(x_t|z_t,u_t,x_{t-1}) P(xt∣zt,ut,xt−1)是在已知融合观测值 z t z_t zt和控制命令 u t u_t ut以及上个状态 x t − 1 x_{t-1} xt−1的情况下当前状态为 x t x_t xt的概率, P ( z t ∣ x t ) P(z_t|x_t) P(zt∣xt)是需要我们设计的观测模型(在当前状态为 x t x_t xt的情况下观测值是 z t z_t zt的概率), P ( x t ∣ u t , x t − 1 ) P(x_t|u_t,x_{t-1}) P(xt∣ut,xt−1)这个是需要我们设计的控制模型(在上个状态是 x t − 1 x_{t-1} xt−1并且控制命令是 u t u_t ut的情况下当前状态是 x t x_t xt的概率)。
为何贝叶斯滤波算法要求一个概率值?
我们求 P ( x t ∣ z t , u t , x t − 1 ) P(x_t|z_t,u_t,x_{t-1}) P(xt∣zt,ut,xt−1)它的作用就是看当前状态是 x t x_t xt的概率有多大,选择概率最大的那个状态取值作为状态。(比如当前机器人离障碍物10m的概率是80%,离障碍物距离为10.3m的概率是89%,我当然认为机器人离障碍物距离是10.3m)。当然一般不是只求一个值而是求一个概率分布。什么是概率分布?就是很多个数和它们出现的概率就组成了概率分布。也就是说不止一个数的概率而是很多个数的概率。
卡尔曼滤波对贝叶斯滤波做了什么?
而前面我们也提到了卡尔曼滤波就是贝叶斯滤波这个算法的实现方式之一。所以卡尔曼滤波算法也自然设计了自己对观测模型和控制模型的一个实现。卡尔曼滤波算法做的唯一的工作就是设计了 P ( z t ∣ x t ) P(z_t|x_t) P(zt∣xt)和 P ( x t ∣ u t , x t − 1 ) P(x_t|u_t,x_{t-1}) P(xt∣ut,xt−1)这两个东西的计算模型(所以只要你设计了一种具体的模型假设那么你也发明了一种算法~)。什么叫做模型假设?就是套一个函数上去,比如假设线性模型那就套一个直线上去,假设是正态分布就把正态分布函数套上去。所谓的卡尔曼增益之类的东西只不过是用卡尔曼滤波算法所假设的控制模型与观测模型套到 P ( x t ∣ z t , u t , x t − 1 ) = η P ( z t ∣ x t ) P ( x t ∣ u t , x t − 1 ) P(x_t|z_t,u_t,x_{t-1})=\eta P(z_t|x_t)P(x_t|u_t,x_{t-1}) P(xt∣zt,ut,xt−1)=ηP(zt∣xt)P(xt∣ut,xt−1)这个公式经过各种化简演化后得到的结果。
卡尔曼滤波是如何实现贝叶斯滤波的?
我以机器人状态估计为例。
卡尔曼滤波对机器人的观测与控制做出的假设
-
首先它认为机器人的状态是线性变化的。什么叫做机器人的状态是线性变化的?假设第 x t x_t xt时刻我们机器人的状态是指机器人离目标点的距离 x t x_t xt,(事实上机器人的状态可以指很多东西比如机器人的姿态,速度等等)。那么现在机器人状态是线性变化的这句话的意思是指机器人是匀速直线运动。即机器人离目标点的距离可以这么表示: x t = a t x t − 1 + u t + w t x_t=a_tx_{t-1}+u_t+w_t xt=atxt−1+ut+wt,其中 a t a_t at是常数, u t u_t ut是控制命令(即让机器人这段时间移动多远), w t w_t wt是噪声。同时卡尔曼滤波算法还假设观测值 z t z_t zt与机器人实际离目标的距离 x t x_t xt也是线性的。即可以这么表示 z t = c t x t + v t z_t=c_tx_t+v_t zt=c