详解卡尔曼滤波(Kalman Filter)原理
看过很多关于卡尔曼滤波的资料,发现很多资料写的都很晦涩,初学者很难看懂。在网上找了很多资料之后,发现了 这篇博文 讲的非常清晰易懂,特此翻译记录,以备后用。为保证翻译的原滋原味,以下均用第一人称表述。
我不得不说一说卡尔曼滤波,因为它能做到的事情简直令人惊叹。
很可惜的是,很少有软件工程师和科学家对此有深入了解。这让我感到很沮丧,因为卡尔曼滤波是如此通用且强大的工具,它能在不确定情况下 组合信息 。有时,它提取准确信息的能力似乎几乎是不可思议的。如果听起来我讲的太多了,那么请看一下之前 发布的视频 ,其中演示了一个利用卡尔曼滤波观察自由浮动物体的速度来确定它的方向。真棒!
你可以在任何含有 不确定信息 的动态系统中的使用卡尔曼滤波,对系统的下一步动作做出 有根据的猜测 。即使伴随着各种干扰,卡尔曼滤波总是能指出真实世界发生的情况。它可以利用怪异现象之间的关联,你可能不会想到利用这些关联!
卡尔曼滤波对于持续变化的系统是理想的选择。由于卡尔曼滤波除了记忆前一个状态而不需要保留其他的历史记忆信息,因此卡尔曼滤波具有轻量化的特点,运行速度非常快,非常适合处理实时的问题和嵌入式系统。
你在Google上找到的大部分关于卡尔曼滤波的数学描述是晦涩难懂的。那是非常糟糕的状况!因为卡尔曼滤波能被简单和容易的方式所理解的。因此,本文是一个非常不错的文章主题,本文将尝试用许多清晰、美观的图片来阐明它。 本文的前提很简单,你仅仅需要对概率和矩阵有基本的了解。
本文将从一个简单的例子开始,说明卡尔曼滤波可以解决的问题。但如果你想直接接触精美的图片和数学,请随时跳转。
举一个简单的小例子:你已经做了一个能在丛林中游走的小机器人,为确保其能导航,机器人需要知道它所在的位置。
我们的机器人也有GPS传感器,精确大约10米,但它需要更精确地知道自己的位置。在树林中有很多沟壑和悬崖,如果机器人的误差超过几英尺,它可能会从悬崖上掉下去。所以仅依赖GPS进行定位是远远不够的。
我们可能还知道机器人是如何移动的:机器人知道发送给车轮马达的指令,如果它朝一个方向前进,没有任何干扰,下一刻它可能会继续朝同一方向前进。当然,它对自己的运动并不完全了解:它可能会受到风的冲击,车轮可能会打滑,或者在崎岖不平的地形上滚动;所以轮子转动的数量可能不能准确地代表机器人实际行走了多远,这个预测也不会完全准确。
GPS 传感器 告诉我们一些关于状态的信息,但只是间接的,带有一些不确定性而且并不精准。我们的 预测 告诉了机器人是如何移动的,但只是间接的,并且也是不确定和不精准的。
但是,如果我们利用所有可用的信息,我们能得到一个比这两个估计本身更好的答案吗?当然,答案是肯定的,这就是卡尔曼滤波器的作用。
让我们来看看我们想要诠释的一个场景。我们继续上一个例子,机器人仅仅包含一个位置和速度的简单状态。
更有趣的是下面的例子:位置和速度是呈 相关性 的。观察特定位置的可能性取决于你的速度:
这种关系非常重要,因为它给我们提供了更多的信息:一个测量值告诉我们其他测量值可能是什么。我们要尽可能多地从不确定的目标中压缩卡尔曼滤波器的信息!
这种相关性被称为 协方差矩阵 。简而言之,矩阵的每个元素
我们基于高斯分布来建立状态变量,所以在时间
接下来,我们需要某种方式来知道目前状态(时刻
对于上述所有的数学公式,你仅仅需要实现公式(7)、(18)和(19)。(如果你忘记了上述公式,你也能从公式(4)和(5)重新推导。)
这将允许你精确地建模任何线性系统。对于非线性系统,需要用到 扩展卡尔曼滤波 ,区别在于EKF多了一个把预测和测量部分进行线性化的过程。