Странное поведение с датчиком ориентации 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);
Хорошо, если вы работаете по телефону.
Кватернионы самые лучшие, и вы должны их использовать
Для матрицы поворота и угла Эйлера вы легко можете встретить такой термин, как карданный замок. Это часто случается с насильственными действиями пользователя.
Блокировка карданного подвеса - это потеря одной степени свободы в трехмерном, трехколесном механизме, которая происходит, когда оси двух из трех карданов приводятся в параллельную конфигурацию, "запирая" систему во вращение в вырожденном двух- мерное пространство.
Матрица вращения и угол Эйлера хороши для медленного движения робота.
Подробнее о конкатенациях кватернионов и точке преобразования в новую систему вы можете обратиться по ссылке вики