通过OpenCV / C ++中的(扩展)卡尔曼滤波器实现数据融合

时间:2015-07-07 08:29:43

标签: c++ opencv location kalman-filter

我正在开展一个项目来跟踪通过数据融合安装在移动设备上的摄像机的位置。 我得到的数据是

1)来自光源A的相机在x,y和z方向的速度

2)来自B的当前和最后一帧(2D,Z不应该改变任何一种方式)的位置之间的差异

我已经做了一个类似的项目但没有任何数据融合,并使用了在OpenCV中实现的卡尔曼滤波器。

目前我一直对我在网上找到的所有不同的实现技术感到困惑。

我如何将我获得的数据插入/组合到KF / EKF的不同组件中?

我有这个例子来改变OpenCV-KF作为EKF。它看起来很像我需要的东西,除了我的对象实际上是相机本身,还能够在y轴和x轴上移动,轮流,....而且我没有得到对象的像素坐标上述数据。 https://sites.google.com/site/timecontroll/home/extended-kalman-filtering-with-opencv

不幸的是,我不确定如何定义我的过渡和测量功能以及相应的矩阵。

设x(k)为当前状态,deltaT是自上次更新以来经过的时间。

对于1,它可能类似于:

x(k)= x(k-1)+ deltaT乘以速度(k-1)

2:

x(k)= x(k-1)+ differenceBetweenFrames

因此,我们假设两个数据源的权重相同,这让我觉得结合起来会是这样的:

x(k)= x(k-1)+(deltaT乘以速度(k-1)+ differenceBetweenFrames)/ 2

对于测量:我通过源A获得X,Y和Z方向的速度,以及通过源B获得X和Y坐标中当前和最后一帧的差异。

这是否有意义,或者我对那里的任何事情都已经错了? 我如何调整转换和测量矩阵以及相应地更新当前状态?

1 个答案:

答案 0 :(得分:3)

你走在正确的轨道上,但你似乎对转换功能和测量功能的概念感到困惑。

要做的第一件事是明确定义要考虑的状态向量。在你的情况下,位置[px,py,pz]和velocity [vx,vy,vz]就够了:

x k = [px k ,py k ,pz k ,vx k ,vy k ,vz k ]

第二件事是选择一个过渡函数来模拟系统的动态。请注意,这与传感器测量无关:它只是系统状态随时间演变的模型。在位置和速度的情况下,一个非常简单的模型如下(但如果需要,您可以选择使用更高级的模型):

p k = [px k ,py k ,pz k ] = p k-1 + dT。的 v <子> K-1

v k = v k-1

这可以按矩阵形式表示如下:

       [ 1  0  0  dT 0  0  ]
       [ 0  1  0  0  dT 0  ]
       [ 0  0  1  0  0  dT ]
x(k) = [ 0  0  0  1  0  0  ] . x(k-1)
       [ 0  0  0  0  1  0  ]
       [ 0  0  0  0  0  1  ]

最后,您需要为传感器推导出测量功能。该测量函数表示当我们知道状态向量时可以推断传感器测量的方式。

您的源A测量系统的速度,因此测量功能如下:

h A x k )= v k

或以矩阵形式:

           [ 0 0 0 1 0 0 ]
hA{x(k)} = [ 0 0 0 0 1 0 ] . x(k)
           [ 0 0 0 0 0 1 ]

您的源B测量位置差异,因此测量功能如下:

h B x k )= p k - p k-1 = p k-1 + dT。 v k-1 - p k-1 = dT。 v k-1 = dT。的 v <子>ķ

或以矩阵形式:

             [ 0  0  0  dT 0  0  ]
hB{ x(k) } = [ 0  0  0  0  dT 0  ] . x(k)
             [ 0  0  0  0  0  dT ]

如果您想为源B提供更准确的测量功能,您可能需要在状态向量中添加前一时间步的位置,如下所示:

x k = [px k ,py k ,pz k ,px k-1 ,py k-1 ,pz k-1 ,vx k ,vy k ,vz k ]

转换函数将变为:

       [ 1  0  0  0  0  0  dT 0  0  ]
       [ 0  1  0  0  0  0  0  dT 0  ]
       [ 0  0  1  0  0  0  0  0  dT ]
x(k) = [ 0  0  0  1  0  0  0  0  0  ] . x(k-1)
       [ 0  0  0  0  1  0  0  0  0  ]
       [ 0  0  0  0  0  1  0  0  0  ]
       [ 0  0  0  0  0  0  1  0  0  ]
       [ 0  0  0  0  0  0  0  1  0  ]
       [ 0  0  0  0  0  0  0  0  1  ]

源A的测量功能将变为:

           [ 0 0 0 0 0 0 1 0 0 ]
hA{x(k)} = [ 0 0 0 0 0 0 0 1 0 ] . x(k)
           [ 0 0 0 0 0 0 0 0 1 ]

源B的测量功能将变为:

           [ 1  0  0 -1  0  0  0  0  0 ]
hB{x(k)} = [ 0  1  0  0 -1  0  0  0  0 ] . x(k)
           [ 0  0  1  0  0 -1  0  0  0 ]

话虽如此,测量系统的速度及其位置的差异几乎是相同的。由于你从不测量位置,你的状态可能不会被观察到,这可能是一个问题。有关更多详细信息,请查看以下文档:

  • &#34;使用卡尔曼滤波器进行状态估计&#34;作者:F.Haugen(pdf
  • &#34;可控性和可观察性:工具 卡尔曼滤波器设计&#34;由Southall,Buxton和Marchant(pdf