Я разрабатываю приложение для отслеживания ускорения автомобиля. Я использовал стандартный акселерометр, предварительно откалибровав его в определенном положении.
Затем, предполагая, что ориентация телефона не меняется, я записал данные акселерометра за указанное время и рассчитал параметры движения, одним из которых является скорость автомобиля в конце теста.
На прямой горизонтальной дороге работает неплохо: погрешность в несколько процентов.
Но потом я узнал, что в API-level 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.
v0
— начальная скорость,v
— скорость. длина ускорения никогда не требуется при вычислении скорости, поэтому опубликуйте свой код, показывающий, почему вы его используете. - person Ali   schedule 23.10.2011