卡尔曼滤波器和内部状态变量的质量

我正在尝试为Android开发运动检测应用程序。 应用程序应该能够跟踪手机在空间中的运动并将其映射到计算机屏幕上的运动。 我正在使用3轴加速度计,因为数据非常嘈杂,我使用的是卡尔曼滤波器。

内部状态是6分量矢量[speed-x,speed-y,speed-z,accel-x,accel-y,accel-z],测量状态是3分量矢量[accel-x,accel-y,accel-z ]。

滤波器在测量值上运行良好,但速度仍然非常嘈杂。

绘制的值

现在我想知道这是正常行为还是我做错了,因为我对卡尔曼滤波器的理解非常基础。 我正在使用JKalman库并遵循状态转换矩阵(dt是1/15,这是近似的传感器刷新率)

double [] [] A = {{1,0,0,dt,0,0},{0,1,0,0,dt,0},{0,0,1,0,0,dt}, {0,0,0,1,0,0},{0,0,0,0,1,0},{0,0,0,0,0,1}};

我还建立了自己的协方差矩阵,其协方差是根据测试数据计算出来的。 这改善了加速度信号,但对速度没有影响。

目前我能够实现stdvar

[0,0632041857 0,0607274545 0,0886326602]用于速度[x,y,z]

[0,0041689678 0,004423822 0,0074808552]用于加速度[x,y,z]。

我对加速度信号非常满意,我想我无法改善它,但我希望提高速度信号的质量。

不行。

无论你做什么,速度都会在几秒钟内变得非常不准确。 虽然上述链接的答案是关于位置,但速度也是如此。 至于卡尔曼滤波器,请参见此处。

您应该尝试使用GPS来获取速度,或者(如果适用)只是在您的应用中使用手机的方向并放弃获得速度。

除了我刚刚在维基百科上阅读的内容之外,我对卡尔曼滤波器了解不多,但我会说你试图以不恰当的方式应用卡尔曼滤波器。

stdvars应该只代表噪音,但我怀疑这是你计算的。 但更根本的是,我认为你缺少一些输入数据:当你有许多不同的输入时使用卡尔曼滤波器, 例如加速度计+ GPS。

似乎不可能 – 用卡尔曼或其他任何东西 – 你可以在嘈杂的加速度计输入中读取并以某种方式获得平滑准确的轨迹。 您可以随时对加速度计数据进行某种时间平均,这将为您提供平滑的轨迹,但轨迹将与实际轨迹不同。 (如果你想尝试时间平均:例如,a_smooth {i} = 0.6 a {i} + 0.3 a {i-1} + 0.1 a {i-2}。)

还有一个更大的问题是,加速度计的精度非常差,你可能无法做很多事情,特别是跟踪位置,正如@Ali所回答的那样。

编辑 :我在网上找到了一些与你的方程式相似的参考文献,但是那些用于加速度恒定模型的卡尔曼滤波器,显然不是你想要的。

Interesting Posts