Я занимаюсь разработкой приложения для отслеживания ускорения автомобиля.Я использовал стандартный акселерометр, предварительно откалибровав его в определенном положении.
Затем, предполагая, что ориентация телефона не меняется, я записал данные акселерометра за указанное время и рассчитал параметры движения, одним из которых является скорость автомобиля наконец теста.
Он работает довольно хорошо, на прямой, горизонтальной дороге: ошибка в несколько процентов.
Но потом я обнаружил, что в API-уровне 10 естьВиртуальный датчик называется TYPE_LINEAR_ACCELERATION
и, насколько я понимаю, он должен делать то, что мне нужно: фильтровать гравитацию, изменения ориентации - так что я могу использовать его и получить чистое линейное ускорение мобильного устройства.
НО в реальномlife ..
Я сделал простое приложение, которое проводит небольшой тест:
//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 = время интервала), в конце концов я получаю верy низкая скорость - в три раза меньше реальной скорости.
Изменение типа датчика на TYPE_ACCELEROMETER
, калибровка и использование той же формулы для расчета скорости - я получаю хорошие результаты, гораздо ближе к реальности.
Итак, вопрос:
Что на самом деле показывает Sensor.TYPE_LINEAR_ACCELERATION
?
Где я ошибаюсь или что-то не так с реализацией Sensor.TYPE_LINEAR_ACCELERATION
?
Я использовал SamsungТелефон Nexus S.