Я разрабатываю приложение для отслеживания ускорения автомобиля. Я использовал стандартный акселерометр, предварительно откалибровав его в определенном положении.
Затем, предполагая, что ориентация телефона не меняется, я записал данные акселерометра в течение определенного времени и рассчитал параметры движения, одним из которых является скорость автомобиля в конце теста.
Работает неплохо, на прямой горизонтальной дороге: погрешность в несколько процентов.
Но потом я узнал, что на уровне 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");
}
Я привязываю слушателя со следующими параметрами:
mSensorManager.registerListener(linAcc,
mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
SensorManager.SENSOR_DELAY_GAME);
Он работает нормально, но когда я проанализировал дамп данных, вычисление скорости как V = V0 + AT
, где V0 = 0
сначала, затем - скорость перед этим интервалом, A = ускорение (SQRT (x * x + y * y + z * z))
(t = время интервала), в итоге я получаю очень низкую скорость - в три раза меньше реальной скорости.
Изменение типа датчика на TYPE_ACCELEROMETER
, калибровка и использование той же формулы для расчета скорости - я получаю хорошие результаты, намного ближе к реальности.
Итак, вопрос:
Что действительно показывает Sensor.TYPE_LINEAR_ACCELERATION
?
Где я ошибаюсь, или что-то не так с реализацией Sensor.TYPE_LINEAR_ACCELERATION
?
Я использовал телефон Samsung Nexus S.