图说卡尔曼滤波(正在进行时)

什么是卡尔曼滤波?

你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波器来对系统的下一步做出有根据的预测。即使有噪声信息的干扰,卡尔曼滤波器也能弄清楚真实发生的事情。

卡尔曼滤波器非常适合持续变化的系统。它运行速度快,占用内存小(只需记录前一个状态),对于实时性问题和嵌入式系统而言是理想选择。

你从google上搜索到的关于卡尔曼滤波器的数学实现往往相当复杂,但事实上卡尔曼滤波器很简单,只要你以一个正确的方式看它,理解起来就很容易。

我们能用卡尔曼滤波器干什么?

让我们举一个有意思的例子:你制造了一个可以在树林里面行驶的小机器人,为了实现导航,它需要知道当前所处的位置。

我们假定以\underset{X_{k}}{\rightarrow}来描述机器人的状态,包含了位置和速度这两个信息。

                                                                                               \underset{X_{k}}{\rightarrow} =(\underset{p}{\rightarrow},\underset{v}{\rightarrow})

注意,所谓的状态实际上就是关于系统的一系列参数,它可以是任何东西。在这个例子中状态是位置和速度,换到其他例子它可以是引擎的温度,触摸板上指尖的位置等等。

小机器装有GPS传感器,精度为10m。对于应付一般场景这已经很好了,但不要忘了我们是在小树林里面行驶,那里有许多的沟渠和悬崖,小机器上哪怕偏差个几米都有可能掉到山沟沟里,所以单靠GPS还不够。

实际上抛开GPS,我们也能预测机器人的移动,我们将指令发送给小机器上的马达,如果它保持一个固定的方向运动而不受障碍物的干扰,那么下一刻它会在訪方向上走得更远。显然,机器人对自己的状态是全然不知的:它可能在逆风行驶,轮子有可能打滑,在崎岖不平的地形上翻滚。因此,车轮转动的次数并不能准确地代表实际行驶的距离,预测也变得不可能完美。

综上所述,GPS为我们提供了一些关于状态的信息,但那是间接的、不准确的;我们的预测也提供了关于机器人轨迹的信息,但那同样也是间接的、不准确的。

但这已经是我们能够获得的全部信息,基于这些信息,我们是否能给出一个比单独基于某一项预测更好的结果?答案是肯定的,因为有卡尔曼滤波器。

卡尔曼滤波器是怎么看待这个问题的?

继续上面的话题,我们有一个状态,包含速度和位置。

                                                                                    \underset{x}{\rightarrow}=\begin{bmatrix} p\\ v \end{bmatrix}

我们不知道实际的位置和速度是多少,只是有一系列位置和速度的可能的值的组合,其中有一些组合比其它组合可能性更大。

译者注:颜色越亮表示可能性越大,反之则可能性越小。小白点表示实际值,这也是我们迫切想知道,努力去追求,去接近的东东。

卡尔曼滤波器假定所有的变量(在我们这个例子中就是速度和位置)都是随机的,而且符合高斯分布(正太分布)。每个变量(随机变量)都有一个均值\mu,它是随机分布的中心。以及一个方差\sigma ^{2},衡量不确定性的大小。

gauss_1

在上图中,位置和速度是不相关的,意味着已知其中一个量的状态并不能推测出另一个量可能的状态。

下面这幅图展示了一些有意思的东西,速度和位置变得相关,小机器人在特定位置的可能性依赖于速度的大小。

这其实也很好理解,基于一个旧位置来估计新位置,如果速度很快,小机器人就可能移动得更远(位置更远);如果速度很慢,机器人当然就走不了那么远。

这种联系对于目标跟踪来说非常的重要,因为它提供给我们更多信息:测量一个量告诉了我们关于其它量的可能的情况。这也是卡尔曼滤波器的目标,要从不确定的测量值中尽可能地挖掘出更多的信息。

使用协方差矩阵来捕捉这种相关性,简而言之,协方差矩阵中的一个值\Sigma _{ij}就是表示第i个状态变量和第j个状态变量之间的相关程度。协方差矩阵是对称阵,交换i和j的位置值是一样大小。

译者注:协方差矩阵在统计学和机器学习中随处可见,一般而言,可视作由方差和协方差两部分组成,即方差构成了对角线上的元素,协方差构成了非对角线上的元素。

用矩阵来描述问题

现在使用高斯分布来建模我们已知的关于状态方面的知识,我们需要k时刻两方面的信息:最佳估计^{\hat{x}_{k}}(均值,一般使用u来表示)以及协方差矩阵P_{k}

接下来,我们需要着眼于当前状态(k-1时刻)来预测下一个状态(k时刻)。记住,我们并不知道哪一个状态是"实际"的状态,但是预测函数并不在意这一点,它会作用于所有这些状态,并给出一个新的状态分布。

我们用矩阵Fk来表示预测步骤:
 

它将原始估算中的每一个点移动到新的预测位置,如果原始估算是正确的,这就是系统将要移动到的位置。

我们是怎样使用矩阵来预测下一个时刻的位置(position)和速度(velocity)的呢?这里有一个简单的公式:

换成矩阵形式:

现在我们就有了一个预测矩阵,它可以告诉我们下一刻系统的状态,但目前为止我们还不知道怎么去更新协方差矩阵。现在将引出另一个公式。如果使用矩阵A来乘以分布中的每一个点,那么对于訪分布的协方差矩阵会有什么变化呢?我就直说了吧,会有下面这个等式:

把(4)和(3)结合起来可知:

译者注:关于(4)式,这里有个通俗易懂的证明:

外部影响

与状态自身无关的外部因素同样也会对系统有影响,例如建模列车的运动,列车操作员就可能手动对列车进行调速。同样地,在我们小机器这个例子中,导航软件也可能发布一个指令让机器人停下来。对于这些信息我们用一个向量\underset{u_{k}}{\rightarrow}来表示,并将其纳入预测系统作为修正。

假设我们因为知道油门的设定或者控制指令而知道了加速度a,由基本的运动学原理可知:

表示成矩阵形式:

其中B_{k}控制矩阵,\underset{u_{k}}{\rightarrow}控制向量(对于某些简单的系统,没有外部因素的影响则可以忽略它)。

外部不确定性

如果状态基于自身的属性来演进,那么一切都好办。此外,如果状态基于外部因素来发展也同样好办,因为我们只要清楚那些因素就可以了。

但是,如果存在我们不知道的因素訪怎么办?例如,当我们追踪一个飞行器时,它可能受到风的影响。当我们追踪轮式机器上时,它们的轮子可能会打滑,或者因为颠簸的路面降低运行的速度。我们无法掌控这些事情,它们一旦发生,就会对我们的预测结果产生影响。

通过在每一步的预测后面增加一个不确定性,以此来建模和这个"世界"有关的不确定性的东西。

如上图所示,原始预测中的每一个状态都可能移动到一系列新的状态。对于\hat{x_{k-1}}中的每一个点移动到符合高斯分布,协方差为Qk某个新的位置。换句话说,我们把这些不确定性影响视为协议差为Qk的噪声。

这样产生了一个新的高斯分布,协方差不同,但均值相同。

通过增加协方差Qk我们得到了一个扩展了的协方差,关于预测的新的完整的表达式为:

换句话说:

新的最佳估计是基于之前的最佳估计,加上已知的外部影响的校正。

新的不确定性是基于老的不确定性,加上外部环境的不确定性。

好了,到目前为止还比较好理解。对于我们的系统的状态已经有了一个模糊的估计,再把我们传感器获取的数据纳入进来会怎么样?

通过测量数据来精修

...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值