Я разрабатываю приложение для отслеживания ускорения автомобиля. Я использовал стандартный акселерометр, предварительно проверив его в определенном положении.
Затем, при условии, что ориентация телефона не меняется, я зарегистрировал данные акселерометра за заданное время и рассчитанные параметры перемещения, одним из которых является скорость автомобиля в конце теста.
Он работает довольно хорошо, по прямой, горизонтальной дороге: ошибка в несколько процентов.
Но потом я узнал, что на уровне 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 = acceleration (SQRT (x*x+y*y+z*z))
(t = время интервала), в конце концов я получаю очень низкая скорость - в три раза меньше реальной скорости.
Изменение типа датчика на TYPE_ACCELEROMETER
, калибровка и использование той же формулы для расчета скорости - я получаю хорошие результаты, намного ближе к реальности.
Итак, вопрос:
Что действительно показывает Sensor.TYPE_LINEAR_ACCELERATION
?
Где я ошибаюсь или что-то не так с реализацией Sensor.TYPE_LINEAR_ACCELERATION
?
Я использовал телефон Samsung Nexus S.