我想利用Android设备上的加速度计(Sensor.TYPE_LINEAR_ACCELERATION
)来计算位移。这是我的OnSensorChanged()
方法:
public void onSensorChanged(SensorEvent event) {
accelX = event.values[0];
accelY = event.values[1];
accelZ = event.values[2];
long currentTime = System.currentTimeMillis() / 1000;
if(prevTime == 0) prevTime = currentTime;
long interval = currentTime - prevTime;
prevTime = currentTime;
velX += accelX * interval;
velY += accelY * interval;
velZ += accelZ * interval;
distX += prevVelX + velX * interval;
distY += prevVelY + velY * interval;
distZ += prevVelZ + velZ * interval;
prevAccelX = accelX;
prevAccelY = accelY;
prevAccelZ = accelZ;
prevVelX = velX;
prevVelY = velY;
prevVelZ = velZ;
}
然而,速度在任何形式的移动后并不会归零。除非减速非常突然,否则其影响很小。这导致了一些非常不准确的距离值。
加速度计也非常嘈杂,因此我添加了以下内容:
accelX = (accelX * accelKFactor) + prevAccelX * (1 - accelKFactor);
accelY = (accelY * accelKFactor) + prevAccelY * (1 - accelKFactor);
accelY = (accelX * accelKFactor) + prevAccelY * (1 - accelKFactor);
accelKFactor
= .01时,我是否漏掉了一些明显的东西?
我的最终目标只是要能够判断设备是否移动了超过约10英尺,但现在,我的数据几乎是无用的。
编辑:
我找到了问题的一部分。 currentTime
是一个长整型,但我将系统时间(以毫秒为单位)除以1000以获得秒数。因此速度实际上只能每1秒更新一次。将 currentTime
更改为双精度浮点数有所帮助,但并不能完全解决问题。