Датчики, необходимые для LINEAR_ACCELERATION

Предпосылки: я разрабатываю приложение, основные функции которого включают получение значений линейного ускорения, в частности, с телефона Android. Я также планирую предоставлять устройства вместе с установками приложений, поскольку нашими целевыми клиентами являются в основном организации, а система развертывается локально, а не через магазин.

Дилемма. Теперь при выборе устройства, какие аппаратные датчики необходимы в устройстве для надежного получения LINEAR_ACCELERATION метрики?

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

Я нашел это здесь:

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

Другой информации об этом нет. Так может кто-нибудь предоставить дополнительную информацию по этому поводу?

Заранее спасибо.


person ShahiM    schedule 14.02.2016    source источник


Ответы (3)


Не совсем ответ, но, насколько я пытался, АКСЕЛЕРОМЕТР не очень точный датчик. Если устройство не движется, он должен показывать 9,8 вниз. Ну, я сделал приложение, просто показывающее показания X Y Z, и запустил его на многих разных устройствах. Показания Z были от 8 до 11, и два устройства были собраны вместе в одной движущейся тележке и показывали разные показания X и Y ...

person Pavel B.    schedule 14.02.2016

После множества проб и ошибок с различными устройствами, я думаю, теперь у меня есть приблизительное представление:

Во-первых, из этого сообщения на форуме разработчиков Android:

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

Так вот что.

Методом проб и ошибок я обнаружил, что устройства только с акселерометром не предоставляют датчик LINEAR_ACCELERATION (могут быть исключения, некоторые устройства могут все еще иметь датчик, но ни одно из устройств, которые я пробовал, не имеет тот).

Итак, чтобы получить датчик LINEAR_ACCELERATION, у вас должен быть как минимум магнитометр или гироскоп, что очень редко встречается в смартфонах стоимостью менее 8000 индийских рупий (120 долларов США).

Теперь не часть вопроса, а как написать код для работы на обоих этих типах устройств?

Что ж, в итоге я сделал следующее:

Сначала проверьте, есть ли в устройстве датчик:

Sensor linearAcceleration = sMgr.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),

if (linearAcceleration==null){
   hasLinearAccSensor = false;
}
else {
   hasLinearAccSensor = true;
}

Если есть сенсор, то круто! но если вы этого не сделаете, вы можете использовать датчик TYPE_ACCELEROMETER и самостоятельно отработать линейное ускорение. Что-то вроде этого :

public void processPseudoAcceleration(SensorEvent event)
{
    // alpha is calculated as t / (t + dT)
    // with t, the low-pass filter's time-constant
    // and dT, the event delivery rate

    final float alpha = 0.8f;

    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

    float linear_acceleration[] = {0,0,0};

    linear_acceleration[0] = event.values[0] - gravity[0];
    linear_acceleration[1] = event.values[1] - gravity[1];
    linear_acceleration[2] = event.values[2] - gravity[2];

    setAccValues(linear_acceleration[0],linear_acceleration[1],linear_acceleration[2]);
}

Но обратите внимание, что в моем тесте я обнаружил, что эта функция не так надежна, как фактические показания датчика, но она подходит для большинства приложений.

Надеюсь, кто-то сочтет это полезным. Ваше здоровье.

person ShahiM    schedule 29.08.2016

TYPE_LINEAR_ACCELERATION требует гироскопа.

person Chrystian    schedule 18.02.2016