只使用手机(Android)内置的加速计,我该如何找到它的速度?
我一直在进行这个问题的数学实验,但是无论我提出什么函数,都会导致速度呈指数级增长。 我从假设开始工作,即在应用程序启动时,手机处于静止状态。这应该可以确保至少粗略地找到速度。
我有相当扎实的物理和数学背景,因此在这里的任何概念上都不应该遇到任何困难。
我该怎么做?
只使用手机(Android)内置的加速计,我该如何找到它的速度?
我一直在进行这个问题的数学实验,但是无论我提出什么函数,都会导致速度呈指数级增长。 我从假设开始工作,即在应用程序启动时,手机处于静止状态。这应该可以确保至少粗略地找到速度。
我有相当扎实的物理和数学背景,因此在这里的任何概念上都不应该遇到任何困难。
我该怎么做?
首先,您需要从加速度计数据中消除重力加速度。然后,只需对加速度进行积分即可得到速度。不要忘记,加速度和速度是向量而不是标量,并且您还需要跟踪手机在空间中的旋转,以正确确定加速度向量相对于计算出的速度向量的方向。
public TiltSensor(Context c) {
man = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
mag_sensor = man.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
acc_sensor = man.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
has_mag = man.registerListener(this, mag_sensor, delay);
has_acc = man.registerListener(this, acc_sensor, delay);
if (has_acc) {
tiltAvailble = true;
if (has_mag) {
Log.d("TiltCalc", "Using accelerometer + compass.");
}
else {
Log.d("TiltCalc", "Using only accelerometer.");
}
}
else {
tiltAvailble = false;
Log.d("TiltCalc", "No acceptable hardware found, tilt not available.");
//No use in having listeners registered
pause();
}
}
@Override
public void onSensorChanged(SensorEvent e) {
final float[] vals = e.values;
final int type = e.sensor.getType();
switch (type) {
case (Sensor.TYPE_ACCELEROMETER): {
needsRecalc = true;
if (!has_mag) {
System.arraycopy(accelerometer, 0, old_acc, 0, 3);
}
System.arraycopy(vals, 0, accelerometer, 0, 3);
if (!has_mag) {
for (int i = 0; i < 3; i++) {
//Accumulate changes
final float sensitivity = 0.08f;
dampened_acc[i] += (accelerometer[i] - old_acc[i]) * sensitivity;
//Even out drift over time
dampened_acc[i] *= 0.99;
}
}
}
break;
case (Sensor.TYPE_MAGNETIC_FIELD): {
needsRecalc = true;
System.arraycopy(vals, 0, magnetic_field, 0, 3);
}
break;
}
}
总之,我只想重申这并不是以任何方式“正确”的代码,它只是作为游戏输入的一种简单方法。要使用此代码,我只需执行以下操作(是的,奇怪的常量很糟糕):
Ship ship = mShipLayer.getShip();
mTiltSensor.getTilt(vals);
float deltaY = -vals[1] * 2;//1 is the index of the axis we are after
float offset = ((deltaY - (deltaY / 1.5f)));
if (null != ship) {
ship.setOffset(offset);
}
享受吧!
v = 积分(a) ?
一般来说,我认为加速度计的不准确性会使这变得相当困难。