Странное поведение с датчиком ориентации Android - PullRequest
9 голосов
/ 07 апреля 2011

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

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

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

Ответы [ 4 ]

17 голосов
/ 07 апреля 2011

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

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

Направление косинусной матрицы ИДУ: Теория

Матрицы вращения работают как шарм.

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

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

1 голос
/ 26 апреля 2013

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

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

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

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

0 голосов
/ 24 мая 2019

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

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

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

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

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

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

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

0 голосов
/ 18 июня 2013

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

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);
...