Датчик TYPE_LINEAR_ACCELERATION Android - что он показывает?

Я разрабатываю приложение для отслеживания ускорения автомобиля. Я использовал стандартный акселерометр, предварительно откалибровав его в определенном положении.

Затем, предполагая, что ориентация телефона не меняется, я записал данные акселерометра в течение определенного времени и рассчитал параметры движения, одним из которых является скорость автомобиля в конце теста.

Работает неплохо, на прямой горизонтальной дороге: погрешность в несколько процентов.

Но потом я узнал, что на уровне 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.

36
задан MasterAM 9 March 2014 в 22:09
поделиться