Почему крен непредсказуем, когда шаг приближается к 90 градусам? - PullRequest
1 голос
/ 12 июня 2019

Во время игры с Sensor Manager я заметил, что данные датчика имеют некоторые ограничения, которые я не могу понять.

Прослушивая события датчика, мы можем извлечь значения азимута, высоты тона и крена. Здесь - учебник из Google Codelabs.

SensorManager.getRotationMatrix(rotationMatrix, null, mAccelerometerData, mMagnetometerData);
SensorManager.getOrientation(rotationMatrix, orientationValues);

float azimuth = (float) Math.toDegrees(orientationValues[0]);
float pitch = (float) Math.toDegrees(orientationValues[1]);
float roll = (float) Math.toDegrees(orientationValues[2]);

Теперь проблема в том, что бросок становится непредсказуемым (из-за неправильного изменения его значения очень часто), когда шаг приближается к 90 градусам.

Я нашел подтверждение этой проблемы в книге Beginning Android Wearables , но, как уже упоминалось, объяснение выходит за рамки книги.

В-третьих, ссоглашения, описанные выше, азимут, шаг и крен становятся привередливыми и непредсказуемыми, когда шаг имеет значения, близкие к 90 или -90 градусам.Эта проблема связана не с аппаратными датчиками, а с математикой азимута, шага и крена.Подробное описание блокировки карданного подвеса выходит за рамки этой книги, но его последствия просты: не доверяйте ориентации, когда угол наклона близок к +/- 90 градусам.Если эти значения высоты звука для приложения неизбежны, рассмотрите возможность использования матриц вращения или кватернионов.

Вопрос

Может ли кто-нибудь объяснить это немного подробнее?Как приложения пузырькового уровня (например, Bubble level ) решают эту проблему в Android?

...