如何理解那个把嫦娥送上天的卡尔曼滤波算法Kalman filter? https://zhuanlan.zhihu.com/p/77327349 几乎任何带电的军事装备、航空航天装备都需要Kalman滤波算法! https://www.zhihu.com/question/23971601/answer/770830003 如何通俗并尽可能详细解释卡尔曼滤波? 好算法往往都是来源于一个很简单的思想,如果不了解这个思想和演化过程那就谈不上了解这个算法 直观理解 首先卡尔曼滤波要解决的问题是什么?我以机器人估计自己离障碍物距离为例 答:首先机器人已知“传感器测量的机器人离障碍物的距离(我们称它为观测值,比如雷达直接测量机器人离障碍物距离7m)”,“上个时刻机器人离障碍物距离”和“自己当前时刻的速度”这三个数据。而根据“上个时刻机器人离障碍物距离”和“自己当前时刻的速度”可以估算出当前机器人离障碍物的距离(我们称它为估计值)。比如:上一秒离障碍物10m,速度是4m/s,那么现在这秒估计就离障碍物距离是6m。(其实这个叫做机器人移动建模想了解更多移动模型与滤波算法的联系细节的童鞋可以看看《机器人移动模型:根据控制命令预测机器人位置》https://blog.csdn.net/varyshare/article/details/100061173这篇文章) 那么问题来了,机器人离障碍物的距离现在既有个观测值7m,又有个估计值6m。到底相信哪个?单纯相信观测值万一那传感器坏了呢?单纯相信估计值那么万一上个时刻的距离估计值或者速度不准呢?所以,我们要根据观测值和估计值的准确度来得到最终机器人离障碍物的距离估计值。准确度高的就最终结果比重高,准确度低就占比低。如果雷达测量的那个7m准确度是90%,根据速度估计出的那个6m准确度是80%,那么最终的距离估计结果就是 kG = 0.9/(0.9+0.8) res = (1-kG)*6 + kG*7 = 6.52 m 事实上 kG 这个就是所谓的卡尔曼增益,它就是表示这个传感器数据相对于根据速度计算出的估计值的靠谱程度。 直观理解讲完了,以上。如果你想进一步了解卡尔曼滤波在实际应用中怎么计算的可以看看这篇文章《Ai酱:[易懂]如何理解那个把嫦娥送上天的卡尔曼滤波算法Kalman filter?》。接下来我会介绍卡尔曼滤波推导的理论知识。 但是上面的90%与80%这两个准确度是怎么计算的?卡尔曼这个人到底是怎么发明卡尔曼滤波算法的?卡尔曼发明算法的思路历程是什么?卡尔曼滤波算法到底与贝叶斯滤波算法有什么联系?我想这些肯定是你脑海中挥之不去的阴影,仅仅从直观理解无法解答这些问题。 我就从算法发明的角度来挑战一下。 我希望在学本文前你能对贝叶斯滤波有了解。 ====================================================================== 如果你还不清楚贝叶斯滤波怎么做的?可以看看这篇文章【易懂教程】我是如何十分钟理解与推导贝叶斯滤波(Bayes Filter)算法? https://zhuanlan.zhihu.com/p/75880143 很多时候一些算法看起来极其复杂,极其难懂。不是因为我们愚不可及。而是因为我们看到的已经是别人省略过很多步骤和省略很多脑海中思考过的思路最后呈现出的公式和文字。而好的博客就是应该尽量还原这些思考过程以及省略掉的步骤。 像卡尔曼滤波(Kalman filters)、粒子滤波(Particle filters),隐含马尔科夫模型(Hidden Markov models),动态贝叶斯网络(Dynamic Bayesian networks)等等算法。这些算法都和贝叶斯滤波算法非常相似.因此学好了贝叶斯滤波再学其他算法那就容易很多了。 破解概念上的束缚之贝叶斯滤波算法到底有什么用? 学东西最烦的是看了半个月的算法细节,结果发现自己还是不知道这算法有什么用,怎么实现。今天博主就开篇破解贝叶斯中的概念上的障碍。让大家快速学习贝叶斯滤波算法,并且能够用到自己的项目中。贝叶斯滤波算法它做的工作就是根据已有的信息来计算概率。比如我想根据一些信息识别某个人性别是不是女,那贝叶斯滤波算法要做的是就是计算这个人是女的概率P(女)。来了新的信息就计算新的概率。。如果你不理解这句话看接下来这个例子你就懂了。假如现在贝叶斯滤波算法是要根据你已输入的信息分析某个人是男是女。贝叶斯滤波算法最终的输出是计算出根据现有信息判断这个人是男性的概率是多少,女性的概率是多少。然后你的算法就选择概率更大的那种情况输出结果。如果有新的信息进来(比如“那个人有长头发”),贝叶斯算法要重新计算这个人是男性的概率是多少,女性的概率是多少。。 那它具体怎么做的呢? 当你什么信息都不提供给贝叶斯滤波算法的时候,然后你问贝叶斯算法那个人的性别是女的概率是多少。贝叶斯滤波算法会告诉你P(女)=0.5。注意:P(女)=0.5这个表示的含义是“根据已有信息,那个人是女性概率是0.5”. 现在P(女)=P(男)=0.5我们是没法判断性别。这个数值“0.5”是我们设置的一个初始值,一般是需要根据你的统计经验设置的(如果你是想用贝叶斯滤波算法进行垃圾邮件识别,那么它是垃圾邮件这个概率肯定不会有0.5这么大。毕竟垃圾邮件还是少数。你需要统计收到的邮件中垃圾邮件的占比,然后作为算法的初始值。好让算法在没有任何提示信息的情况下能输出当前邮件是垃圾邮件的概率)。 P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(女|长发)=\frac{P(长发|女)P(女)}{P(长发)} 然后,回到性别识别那个问题。 当你告诉算法这个人有长头发,你再问算法这个人现在性别是女的概率是多少。贝叶斯滤波算法会根据概率论中的条件概率知识算出“在知道某个人有长头发的条件下,这个人性别是女的概率P(女)=0.87”。至于它到底怎么算的文章后面会讲。现在你只需要对整个算法有个直观理解即可。为什么它能知道根据“有长头发”这个信息来更新概率呢?这是因为算法需要我们告诉它“长头发中女性占比是多少(这个叫做先验知识)”,P(女)=0.87这个也是需要我们经过统计才能得到的数据。 当你再告诉算法这个人使用口红,然后你再问算法这个人现在性别是女的概率是多少?贝叶斯滤波算法会根据概率论中条件概率知识,以及需要你告诉它“使用口红的人中女性占比是多少”,来更新当前这个人是女性的概率P(女)=0.91。 以上就是贝叶斯算法做的工作。 贝叶斯滤波算法做的工作:它做的工作就是根据不断接收到的新信息和我提供的一些已经知道的统计值,来不断更新概率。更新概率值的方法是根据概率论中的条件概率计算公式来更新的。贝叶斯滤波算法计算的结果是一个概率值有什么用呢? 比如我要它根据我提供的一些信息识别某个人是不是女,那它就得计算这个人是女的概率P(女).如果我想让它根据雷达测距判断机器人离障碍物距离,那它就得计算出机器人离障碍物各种距离取值的概率(为何要计算概率?因为雷达测量会存在误差),比如计算机器人离障碍物10cm远的概率是0.87,离障碍物11cm远的概率是0.21,离障碍物9cm远的概率是0.01。那么我就认为机器人离障碍物距离是10cm。 后面还有介绍贝叶斯滤波算法怎么随着收到的新信息来更新概率的? 以及机器人状态估计中的贝叶斯滤波的推导,很好 由于文章里面公式很多知乎markdown不支持公式没办法里面只能截图,大家要是觉得麻烦的话可以看看我在CSDN写的原文:https://blog.csdn.net/varyshare/article/details/97642209。 如果你想了解贝叶斯滤波具体怎么编程实践可以看看这篇文章<[易懂实例讲解]离散型贝叶斯滤波python编程代码实践> https://link.zhihu.com/?target=https%3A//blog.csdn.net/varyshare/article/details/100098979 ======================================================= 回到卡尔曼滤波的学习: 首先卡尔曼滤波算法是对贝叶斯滤波的一种具体实现。那么贝叶斯滤波又是什么?贝叶斯滤波是一种思想,它告诉了我们怎么在知道观测值与根据控制命令所计算的估计值这两种值的可信度时如何计算最终估计出的值的可信度。但是贝叶斯滤波并没有告诉我们怎么计算观测值与估计值的可信度。而卡尔曼滤波算法就是对贝叶斯滤波算法的一个具体实现。卡尔曼滤波认为观测值可信度模型是一个正态分布,控制模型是一个正态分布。然后信号是线性变化的。也就是说卡尔曼假设上文中的机器人一定是匀速直线运动,机器人离障碍物距离变化肯定是随时间线性变化(这就是卡尔曼算法的局限,你设计一种新的假设那就发明了新的算法 ############### 假设你有两个传感器,测的是同一个信号。可是它们每次的读数都不太一样,怎么办?取平均。再假设你知道其中贵的那个传感器应该准一些,便宜的那个应该差一些。那有比取平均更好的办法吗?加权平均。怎么加权?假设两个传感器的误差都符合正态分布,假设你知道这两个正态分布的方差,用这两个方差值,(此处省略若干数学公式),你可以得到一个“最优”的权重。接下来,重点来了:假设你只有一个传感器,但是你还有一个数学模型。模型可以帮你算出一个值,但也不是那么准。怎么办?把模型算出来的值,和传感器测出的值,(就像两个传感器那样),取加权平均。OK,最后一点说明:你的模型其实只是一个步长的,也就是说,知道x(k),我可以求x(k+1)。问题是x(k)是多少呢?答案:x(k)就是你上一步卡尔曼滤波得到的、所谓加权平均之后的那个、对x在k时刻的最佳估计值。于是迭代也有了。这就是卡尔曼滤波。(无公式) 作者:Kent Zeng 链接:https://www.zhihu.com/question/23971601/answer/26254459 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ####### 作者:肖畅 链接:https://www.zhihu.com/question/23971601/answer/46480923 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 怒答!刚刚学过并且试着直观地理解过,如有不妥的地方还望大牛们指教。图片来源及参考文献:https://courses.engr.illinois.edu/ece420/sp2017/UnderstandingKalmanFilter.pdf(如果上面的链接失效,贴一个备用IEEE Xplore的链接,大家自行下载:Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation [Lecture Notes])题主如果只是想泛泛理解, Kent Zeng 的回答已经非常棒了。我尝试做一个更详细的解答。好了下面进入正题,先从简单的说起:考虑轨道上的一个小车,无外力作用,它在时刻t的状态向量只与相关:(状态向量就是描述它的t=0时刻所有状态的向量,比如:[速度大小5m/s, 速度方向右, 位置坐标0],反正有了这个向量就可以完全预测t=1时刻小车的状态)那么根据t=0时刻的初值,理论上我们可以求出它任意时刻的状态。当然,实际情况不会这么美好。这个递推函数可能会受到各种不确定因素的影响(内在的外在的都算,比如刮风下雨地震,小车结构不紧密,轮子不圆等等)导致并不能精确标识小车实际的状态。我们假设每个状态分量受到的不确定因素都服从正态分布。现在仅对小车的位置进行估计请看下图:t=0时小车的位置服从红色的正态分布。 ############### 回到:如何理解那个把嫦娥送上天的卡尔曼滤波算法Kalman filter? 卡尔曼滤波怎么做的? 我们先回顾总结下直观理解中是怎么做的。 1.根据上一秒导弹的位置 和 导弹的的速度估计出当前时刻导弹的位置粗略估计值。 2.将雷达测得导弹位置测量值和我们计算出的导弹位置粗略估计值根据这两种数据可信度来进行线性加权和得到准确的导弹位置估计值。 在前面我们也提到了导弹的位置和雷达测量值都是有误差的。所以卡尔曼想用概率来衡量数据的可信度。 比如:雷达测量的数据它就不只是一个数字了。而是说测量发现导弹有0.8的概率在7m那个位置,有0.1的概率在7.2m那个位置。有0.1的概率在6.9m那个位置。这些数据就叫做概率分布。概率分布的意思就是很多个值还有它们各自出现的概率多大所组成的数据就叫做概率分布。 卡尔曼认为导弹速度、导弹位置、雷达测距的测量值这些都服从正态分布(对就是高中学的那个正态分布)。这是啥意思呢?比如下面这个图是讲上个时刻导弹的位置的概率分布,从图中看出它在10m(横轴)那个位置的纵坐标最高所以概率最大。它在其他地方的概率相对小一点。 1.根据上一秒导弹的位置 和 导弹的速度估计出当前时刻导弹的位置粗略估计值。 2.将雷达测得导弹位置测量值和我们计算出的导弹位置粗略估计值根据这两种数据可信度来进行线性加权和得到准确的导弹位置估计值。 我们来看看具体怎么做的。 1.计算粗略估计值(这个是做了一个硬假设:导弹是保持匀速运动),大家可以对比着看下直观理解是怎么做的: x 在 t时刻的粗略估计值 = x_{t-1} - v_{t-1} = N(10,0.2^2) - N(4,0.7^2) = N(6,0.2^2+0.7^2) 2. 根据 粗略估计值的概率分布与雷达的测量值概率分布得到精确估计值的概率分布。现在我们是用概率分布来计算。所以和直观理解中的计算方式有不同。因为直观理解中的计算方式是相当于粗略估计值这个概率分布的均值与雷达测量值的概率分布的均值进行加权和得到精确估计值的概率分布的均值。由于正态分布是均值那个地方的概率最大,所以当前时刻导弹位置的精确估计值就是它概率分布的均值。但是现在我们还是没有回答怎么根据粗略估计值的概率分布与雷达的测量值概率分布得到精确估计值的概率分布。其实这个也很简单。直接把这两个概率分布相乘即可 关于为何是直接相乘请参考这个回答《如何通俗并尽可能详细解释卡尔曼滤波?》。这是由贝叶斯滤波所推导得到的。所以我们得到当前时刻导弹位置的精确估计是 x_t = x 在 t时刻的粗略估计值 * Z_t = N(6,0.2^2+0.7^2) + N(7,0.1^2) 大家可以对比着直观理解那看看有什么相似的地方。事实上我们就是把方差作为可信度,方差越大越不可信。这就是当前时刻导弹位置的最优估计的概率分布: 而正态分布是在均值那个地方的概率最大。所以当前时刻导弹位置的最优估计就是上面这个概率分布的均值 后续的话会继续写怎么把这篇文章计算过程编程实现。其实原理懂了编程很简单的。