我正在使用Kalman Filter opencv库来使用Kalman估计器的功能。
我的程序不强制实时递归。我的问题是,当转移矩阵具有依赖于时间步长的元素时,每次在predict或correct中使用它时,我是否必须更新转移矩阵以反映自上次递归以来经过的时间?
编辑:我之所以问这个问题,是因为该滤波器在转移矩阵无需更正时运行良好,但在更新时间步长时则不行。
我正在使用Kalman Filter opencv库来使用Kalman估计器的功能。
我的程序不强制实时递归。我的问题是,当转移矩阵具有依赖于时间步长的元素时,每次在predict或correct中使用它时,我是否必须更新转移矩阵以反映自上次递归以来经过的时间?
编辑:我之所以问这个问题,是因为该滤波器在转移矩阵无需更正时运行良好,但在更新时间步长时则不行。
许多对卡尔曼滤波器的描述将转移矩阵写成F
,好像它是一个常数。正如你所发现的,在某些情况下,例如使用可变时间步长,您必须在每次更新时更新它(以及Q
)。
考虑一个简单的位置和速度系统,其中
F = [ 1 1 ] [ x ]
[ 0 1 ] [ v ]
因此,在每一步中,x = x + v
(位置根据速度更新),v = v
(速度不变)。
只要您的速度以长度/时间步长为单位,这是可以的。 如果您的时间步长不同,或者如果您用更典型的单位(如长度/s)表示速度,则需要像这样编写F
:
F = [ 1 dt ] [ x ]
[ 0 1 ] [ v ]
这意味着每当时间步长发生变化时(如果没有固定的计划,则每次都需要),您必须计算F
的新值。
请记住,您还要在每次更新时添加过程噪声Q
,因此很可能也需要根据时间进行缩放。