考虑溢出的卡尔曼滤波器实现

3

我正在尝试实现一个卡尔曼滤波器,使用三轴加速度计和三轴陀螺仪作为传感器来获取物体的方向。

选择用于预测阶段动态模型很简单,它是:

new_angle = angle + angular_velocity * time
new_angular_velocity = angular_velocity

但是我手头没有浮点支持,而且我需要每个精度位来模拟角度。因此,我的计划是将角度表示为32位整数数据,表示完整的2 pi旋转为2^32个小步骤。

因此,整数溢出可以自动处理包裹(2 pi0方向相同)。

但是这也给过滤器带来了问题:如果估计的角度为359°,而我的测量值为,则过滤器会假设有一个巨大的创新,导致不确定性和奇怪的值。

有没有办法让过滤器意识到这种可能的包裹?在上述情况下只给出的创新?

为了规避这个问题,我考虑使用角度差而不是角度,但我找不到合适的模型。

1个回答

2
我今天也遇到了类似的问题,但我没有像你那样受限制。以下是我的解决方法:
1.在计算predicted_angle值后,立即执行以下操作: // 避免在0和360之间跳动 if (measured_angle < pi/2 && predicted_angle > 3*pi/2) predicted_angle = predicted_angle - 2*pi; if (measured_angle > 3*pi/2 && estimate_aAngle < pi/2) predicted_angle = predicted_angle + 2*pi;
2.在计算estimated_angle之后将其进行归一化。
如果您不介意牺牲一些精度,可以切换到带符号整数[-2*Pi,+2*Pi)范围并执行相同操作。
附加建议:如果每个样本的最大角度变化很小,我认为您可以在KF中使用内部角度偏移来牺牲一小部分精度。该偏移量必须大于该值。 您将拥有一个2 ^ 32 = 2 * Pi + 2 * OFFSET范围,而不是2 * pi。在KF中将此OFFSET添加到本地角度变量中,并返回estimated_angle=normalize(offset_estimated_angle - OFFSET,0-2*pi)。
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接