Датчик Android TYPE_LINEAR_ACCELERATION - что он показывает? - PullRequest
35 голосов
/ 22 октября 2011

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

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

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

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

Ответы [ 4 ]

20 голосов
/ 04 ноября 2011

Очень интересный вопрос !!!!

Я разрабатываю что-то похожее на ваше приложение.То, что я обнаружил в TYPE_LINEAR_ACCELERATION, меня не устраивает.

1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc реализованы только для Android 2.3 (и выше), поэтому у меня есть Android 2.2, и я не могу их протестировать.

2) TYPE_LINEAR_ACCELERATION не так точен, как это было бы, потому что есть некоторая простая проблема, когда вычесть гравитацию.На самом деле это «датчик синтеза», который использует акселерометр и ориентацию, чтобы знать, куда направлена ​​сила тяжести, а затем подводная лодка.это.

Здесь я нашел очень полезный ответ, который объясняет это:

https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM

TYPE_ACCELEROMETER использует акселерометр и толькоакселерометр.Он возвращает необработанные события акселерометра с минимальной обработкой или вообще без обработки.

TYPE_GYROSCOPE (если имеется) использует гироскоп и только гироскоп.Как и выше, он возвращает необработанные события (угловая скорость и рад / с) без какой-либо обработки (без коррекции смещения / масштаба).

TYPE_ORIENTATION устарело.Возвращает ориентацию как yaw / pitch / roll в градусах.Он не очень хорошо определен и на него можно положиться только тогда, когда устройство не имеет «крена».Этот датчик использует комбинацию акселерометра и магнитометра.Сильно лучшие результаты можно получить с помощью помощников SensorManager.Этот датчик сильно «обработан».

TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR являются «плавкими» датчиками, которые возвращают соответственно линейное ускорение, гравитацию и вектор вращения (кватернион).Не определено, как они реализованы.На некоторых устройствах они реализованы в ч / б, на некоторых устройствах они используют акселерометр + магнитометр, на некоторых других устройствах они используют гироскоп.

На Nexus S и Xoom гироскоп в настоящее время НЕ используется.Они ведут себя так, как если бы не было гироскопа, как на Nexus One или Droid.Мы планируем улучшить эту ситуацию в будущем выпуске.

В настоящее время единственный способ воспользоваться гироскопом - это использовать TYPE_GYROSCOPE и интегрировать вывод вручную.

Надеюсь, это поможет,

Матиас

Во всяком случае, в различных местах в Интернете я не нашел лучшего слова о сенсоре телефона и его возможностях, из-зафакт, который не точен ...

Еще немного точности может быть достигнуто с помощью фильтра Калмана, но я понятия не имею, как ...

5 голосов
/ 14 ноября 2015

Я понимаю, что мой ответ довольно поздно.Я наткнулся на эту тему, когда искал некоторую информацию о TYPE_LINEAR_ACCELERATION.

Неправильно делать a = sqrt (ax ^ 2 + ay ^ 2 + az ^ 2) и затем делать v = u + a т.Это будет работать только тогда, когда v и a находятся в одном и том же направлении.И любое отклонение может привести к ошибкам.Ускорение и скорость являются векторными величинами и должны рассматриваться как таковые.Вы должны сделать vx = ux + ax t, vy = uy + ay t и vz = uz + az t.а затем v = sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2).

4 голосов
/ 28 июня 2015

TYPE_LINEAR_ACCELERATION не показывает «сырые» данные с датчика, он показывает данные, обработанные высокочастотным фильтром, поэтому постоянное ускорение, такое как гравитация или любое другое медленно меняющееся ускорение, не может пройти через фильтр.

У вашего автомобиля довольно постоянное ускорение, которое не может пройти фильтр.Если вы изменяете свое ускорение очень быстро, нажимая на тормоза, затем нажимая педаль акселерометра, а затем обратно на тормоза, тогда TYPE_LINEAR_ACCELERATION покажет довольно правильный результат, в противном случае он всегда показывает меньшее, чем реальное значение ускорения.

Используйте TYPE_ACCELEROMETER, а затем удалите G (9.81) вручную.На самом деле, вы должны измерить G самостоятельно, когда реальное ускорение равно 0, а затем использовать значение TYPE_ACCELEROMETER как G. В моем случае это 9,6.

TYPE_ACCELEROMETER хорошо для быстро меняющегося ускорения, которое длится менее 1 секунды, какдвигая рукой, имитируя коробку или бой на мечах.

2 голосов
/ 22 февраля 2015

TYPE_LINEAR_ACCELERATION - трехмерный вектор, указывающий ускорение вдоль каждой оси устройства, не включая гравитацию.TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION

...