Странное поведение с датчиком ориентации Android

В настоящее время я пытаюсь повернуть 3D-куб, используя значения датчика ориентации, используя метод getRotation(). Некоторые неожиданные поведения наблюдаются, когда устройство Android поворачивается выше определенных границ. Например, если я заставлю устройство "встать", значение "рулона" просто сходит с ума.

Также я испытываю явление, похожее на так называемый карданный замок. Единственная разница в том, что я испытываю эту проблему даже до применения значений датчика к 3D-вращению. Когда я пытаюсь изменить значение "тангажа", поворачивая устройство вокруг только оси "тангажа", значение "рыскания" также изменяется в зависимости от вращения тона. Это кажется совершенно неразумным для меня.

Может ли кто-нибудь помочь мне? Я застрял в этой проблеме на месяц.

3 ответа

Решение

Это общая проблема с рысканием, тангажом и креном. Вы не можете избавиться от этого, пока вы используете рыскание, тангаж и крен (углы Эйлера). Это видео объясняет почему.

Я использую матрицы вращения вместо углов Эйлера в моем приложении для определения движения. Для введения в матрицы вращения я рекомендую:

Направление Косинус Матрица ИДУ: Теория

Вращающиеся матрицы работают как шарм.

Кватернионы также очень популярны и считаются самыми стабильными.

[Этот ответ был скопирован отсюда.]

Использование кватернионов для вычисления YPR не поможет решить любую проблему. Проблема блокировки карданного подвеса (которая около шага +/-90 может привести к рывку и крену - фактически, рывку на северном полюсе - сойти с ума при небольших изменениях / шуме в нижележащем кватернионе).

Однако, если вы используете значения Yaw Pitch и Roll для вращения 3D-объекта, не должно быть странного поведения вблизи положения блокировки карданного подвеса. Просто возникает дисбаланс в рыскании и крене, а большие отклонения в рыскании и крене не означают, что фактическая ориентация сходит с ума - просто то, что ориентация нечувствительна к большим изменениям крена вокруг рычага около шага 90.

НО, также обратите внимание, что телефоны и браузеры для HTML5 не реализуют должным образом соглашения о сдвиге и тангаже для Android. Вот хороший блог для справки:

http://www.sensorplatforms.com/understanding-orientation-conventions-mobile-platforms/

Вот базовый пример, это вернет вектор гравитации. Обратите внимание, что вы можете изменить тип датчика и скорость выборки, подробнее здесь

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorManager.registerListener(new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        double total = Math.sqrt(x * x + y * y + z * z);

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

}, sensor, SensorManager.SENSOR_DELAY_FASTEST);

Хорошо, если вы работаете по телефону.

Кватернионы самые лучшие, и вы должны их использовать

Для матрицы поворота и угла Эйлера вы легко можете встретить такой термин, как карданный замок. Это часто случается с насильственными действиями пользователя.

Блокировка карданного подвеса - это потеря одной степени свободы в трехмерном, трехколесном механизме, которая происходит, когда оси двух из трех карданов приводятся в параллельную конфигурацию, "запирая" систему во вращение в вырожденном двух- мерное пространство.

Матрица вращения и угол Эйлера хороши для медленного движения робота.

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

https://en.wikipedia.org/wiki/Quaternion

Другие вопросы по тегам