如何使用度数为 0-360 的卡尔曼滤波器
How to use Kalman filter with degrees 0-360
我必须过滤 GPS 提供的航向。航向以 0-360 度的形式提供。当 0-360 或 360-0 之间有过渡时,卡尔曼会发疯,我过滤的航向完全错误。有没有可能对这种数据使用卡尔曼?
我通过明智地使用(C 数学库)函数余数处理过类似的问题。 remainder(a,b) 给出 a 除以 b 的余数,介于 -b/2 和 b/2 之间。不在 0 和 b 之间。
例如,在您只有航向作为状态的简单情况下,一般卡尔曼测量更新我将写为
X^ = X~ + K*(Y-H*X~)
(其中 X~ 是更新状态,X^ 是测量时的预测状态,Y 是测量值,H 是测量模型矩阵,K 是卡尔曼增益)。
变成
dY = remainder( Y-X~, 360)
X^ = remainder( X~ + K*dY, 360)
有两个余数是为了避免过滤后的航向永远增加,而是留在了[-180,180]。虽然这不是绝对必要的,但当我的过滤器显示航向是 3.6 亿度加 15,而不是 15 时,我觉得很奇怪。
如果您也在对航向变化率进行建模,那么您的状态就是 h,hdot(航向和航向变化率),那么在时间更新中也值得做类似的事情。
那是你在用 dt say
更新时间时应该有的
h~ = remainder( h + dt*hdot, 360)
hdot~ = hdot
同样,这是为了让 h 保持在 [-180, 180]。
状态协方差的更新以及 K 的计算方式没有改变。
如果您正在使用一些实现卡尔曼滤波器方程的包,您可以通过在将观测值传递给测量更新之前更改观测值来实现相同的功能。如果Y是观测值,X是状态,把Y改成
Y^ = X + remainder( Y-X, 360)
然后我们将
Y^-X = remainder( Y-X, 360)
基于以上原因,我也推荐 're-normalising' X^ by
X^ = remainder( X^, 360)
测量更新后
我必须过滤 GPS 提供的航向。航向以 0-360 度的形式提供。当 0-360 或 360-0 之间有过渡时,卡尔曼会发疯,我过滤的航向完全错误。有没有可能对这种数据使用卡尔曼?
我通过明智地使用(C 数学库)函数余数处理过类似的问题。 remainder(a,b) 给出 a 除以 b 的余数,介于 -b/2 和 b/2 之间。不在 0 和 b 之间。
例如,在您只有航向作为状态的简单情况下,一般卡尔曼测量更新我将写为
X^ = X~ + K*(Y-H*X~)
(其中 X~ 是更新状态,X^ 是测量时的预测状态,Y 是测量值,H 是测量模型矩阵,K 是卡尔曼增益)。
变成
dY = remainder( Y-X~, 360)
X^ = remainder( X~ + K*dY, 360)
有两个余数是为了避免过滤后的航向永远增加,而是留在了[-180,180]。虽然这不是绝对必要的,但当我的过滤器显示航向是 3.6 亿度加 15,而不是 15 时,我觉得很奇怪。
如果您也在对航向变化率进行建模,那么您的状态就是 h,hdot(航向和航向变化率),那么在时间更新中也值得做类似的事情。 那是你在用 dt say
更新时间时应该有的h~ = remainder( h + dt*hdot, 360)
hdot~ = hdot
同样,这是为了让 h 保持在 [-180, 180]。
状态协方差的更新以及 K 的计算方式没有改变。
如果您正在使用一些实现卡尔曼滤波器方程的包,您可以通过在将观测值传递给测量更新之前更改观测值来实现相同的功能。如果Y是观测值,X是状态,把Y改成
Y^ = X + remainder( Y-X, 360)
然后我们将
Y^-X = remainder( Y-X, 360)
基于以上原因,我也推荐 're-normalising' X^ by
X^ = remainder( X^, 360)
测量更新后