我正在尝试为Android开发运动检测应用程序。应用程序应该能够跟踪手机在空间中的运动并将其映射到计算机屏幕上的运动。我正在使用3轴加速度计,因为数据非常嘈杂,我使用卡尔曼滤波器。
内部状态是6分量矢量[speed-x,speed-y,speed-z,accel-x,accel-y,accel-z],测量状态是3分量矢量[accel-x,accel-y,加速 - 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]。
我对加速度信号非常满意,我想我无法改善它,但我希望提高速度信号的质量。
答案 0 :(得分:3)
无论你做什么,速度都会在几秒钟内变得非常不准确。虽然上述链接的答案是关于位置的,但速度也是如此。至于卡尔曼滤波器,另见here.
您应该尝试使用GPS来获取速度,或者(如果适用)只是在您的应用中使用手机的方向并放弃获得速度。
答案 1 :(得分:2)
除了我刚刚在维基百科上阅读的内容之外,我对卡尔曼滤波器了解不多,但我会说你试图以不恰当的方式应用卡尔曼滤波器。
stdvars应该只代表 噪音,但我怀疑这是你计算的。但更重要的是,我认为你缺少一些输入数据:当你有许多不同的输入时,就会使用卡尔曼滤波器,例如加速度计+ GPS。
似乎不可能 - 用卡尔曼或其他任何东西 - 你可以在嘈杂的加速度计输入中读取并以某种方式获得平滑准确的轨迹。您可以随时对加速度计数据进行某种时间平均,这将为您提供平滑的轨迹,但轨迹将与实际轨迹不同。 (如果你想尝试时间平均:例如,a_smooth {i} = 0.6 a {i} + 0.3 a {i-1} + 0.1 a {i-2}。)
并且存在一个更大的问题,即加速度计的精度非常差,你可能无法做很多事情,特别是跟踪位置,正如@Ali回答的那样。
编辑:我在网上发现了一些与您的方程式具有相似方程式的引用,但是那些是用于常数加速度的模型上的卡尔曼滤波器,这是显然不是你想要的。