我正在考虑为Android手机实施一个惯性导航系统,我意识到加速度计的准确性和读数的不断波动很难实现.
首先,我将手机放在一个平面上,并在X和Y方向上取样1000个加速度计读数(平行于工作台,因此没有重力作用于这些方向).然后我平均这些读数并使用该值来校准手机(从每个后续读数中减去该值).
然后我再次将它放在桌面上并在X和Y方向上采样5000个加速度计读数来测试系统.考虑到校准,我预计这些加速度应该在每个方向上加起来为0(大致).然而,情况并非如此,并且超过5000次迭代的总加速度远不及0(每个轴上平均大约10).
我意识到没有看到我的代码,这可能很难回答,但在更一般的意义上......
这只是移动电话(HTC Desire S)上加速度计读数不准确的一个例子,还是我在编码中出错的可能性更大?
我正在开发汽车加速跟踪应用程序.我使用标准加速度计,事先在特定位置校准.
然后,假设手机的方向没有改变,我将加速度计数据记录了指定的时间并计算了移动参数,其中一个是测试结束时的汽车速度.
它在一条平直的水平道路上工作得相当好:几个百分点的误差.
但后来我发现,在API级别10中有一个叫做的虚拟传感器TYPE_LINEAR_ACCELERATION,据我所知,它必须做我需要的东西:过滤重力,方向变化 - 所以我可以使用它并获得纯粹的线性加速度移动设备.
但在现实生活中......
我做了一个简单的应用程序,做了一点测试:
//public class Accelerometer implements SensorEventListener { ...
public void onSensorChanged(SensorEvent se)
{
if(!active)
return;
lastX = se.values[SensorManager.DATA_X];
lastY = se.values[SensorManager.DATA_Y];
lastZ = se.values[SensorManager.DATA_Z];
long now = System.currentTimeMillis();
interval = now - lastEvetn;
lastEvetn = now;
out.write(Float.toString(lastX) + ";" +
Float.toString(lastY) + ";" +
Float.toString(lastZ) + ";" +
Long.toString(interval) + "\n");
}
Run Code Online (Sandbox Code Playgroud)
我用以下参数绑定一个监听器:
mSensorManager.registerListener(linAcc,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_GAME);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是当我分析数据转储时,计算速度,比如V = V0 + AT,V0 = 0首先,然后 - 之前的间隔速度,A = …
我正在尝试为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].
我对加速度信号非常满意,我想我无法改善它,但我希望提高速度信号的质量.