iPhone - понимание ротации iPhone - PullRequest
34 голосов
/ 02 марта 2011

Я бьюсь головой о стену, пытаясь понять это.Смотрите следующую картинку.

Предположим, у меня на столе лежит iPhone.В это время показания вращения при движении ядра составляют 0,0,0 для рыскания, крена и тангажа (рисунок A).

Затем я поворачиваю его на 90 градусов.Теперь он сидит на столе с левой стороны, кнопка домой справа.Теперь он читает 0,0,0 (рисунок B).

Теперь я поворачиваю его на 180 градусов.Теперь он сидит правой стороной на столе.Кнопка «Домой» слева.Теперь он читает 180,0,0 (рисунок C).

Проблема возникает, если я сейчас ее сверну.Предположим, я катаюсь на -45 градусов.Я должен читать 180, -45,0, но вместо этого я читаю 180, -45,180 ????(рисунок D).

Почему это так?Почему это дает мне значение для высоты тона, если я никогда не менял это?Как может быть влияние тангажа на поворот под другими углами?спасибо.

enter image description here

Ответы [ 5 ]

9 голосов
/ 02 марта 2011

Учитывая тот случай, что вы можете жить с дельта-движениями, вы можете использовать операцию «разности кватернионов».Допустим, у вас есть предыдущий поворот как кватернион с именем q1 и текущий q2.Затем вы можете вычислить дельту dQ между ними так, чтобы q2 = q1 * dQ было действительным.Все, что вам нужно сделать, это построить инверсию q1 (q1 ^ (- 1)), и тогда вы получите:

dQ = q1 ^ (- 1) * q2

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

[РЕДАКТИРОВАТЬ: Забылинекоторая часть] Чтобы избавиться от эффекта дрейфа, вам «только» нужен способ выразить реальное положение вашего последнего объекта (q1) в виде кватерниона, то есть координат в вашем приложении, как показано на экране.Если вы используете такие инструменты, как Unity, это может быть просто чтение соответствующего свойства объекта.Если у вас нет легкого доступа к нему, у вас может быть возможность отследить эту позицию вручную.

Если вы хотите узнать больше об этом, взгляните на 3D математический учебник для графики и игрыразработка, Флетчер Данн, Ян Парберри стр. 168.

3 голосов
/ 02 марта 2011

Углы Эйлера не настолько точны для описания произвольного вращения, как кватернионы или матрицы вращения. Часто существует более одного набора углов, чтобы описать вращение, и поэтому оно не уникально.

[Редактировать:] Как указывалось, ядро ​​Harinder преобразует углы в каноническое представление, то есть есть некоторые ограничения - я не уверен, но думаю, что угол наклона ограничен [-90; 90].

Взгляните на Gimbal Lock или некоторые похожие статьи о явлении.

1 голос
/ 02 марта 2011

Мне не удалось воспроизвести те же результаты. Используя (бесплатное) приложение Gyroscope , сообщая о крене, тангаже, рыскании, я получаю (0, 0, 0) для позиции A, затем (-90, 0, 0) для B, (-90, 0, 180) для C (что фактически заставляет устройство отвернуться от меня, в отличие от вашей диаграммы), затем (-45, 0, 180) для D.

Даже переворачивая это, потому что вы, кажется, перечисляете как рыскание, крен, подача, это все еще (0, 0, 0) -> (0, -90, 0) -> (180, -90, 0) -> (180, -45, 0). Добавление крена на -90 перед отчетом приведет к параллельности осей тангажа и рыскания, создавая карданный замок , как упоминалось более быстрыми печатными машинами, чем я.

Основная проблема заключается в том, что любая попытка описать вращение по трем осям дает неявный порядок вращений - это «вращение так много вокруг x, затем так много вокруг y, затем так много вокруг z». Какой бы порядок вы ни выбрали, всегда есть возможность вращения вокруг первой оси, чтобы выровнять две другие оси. Ориентация трехмерная, поэтому ее можно описать тремя числами (например, используя единичные кватернионы, но оставив четвертый член неявным), но не углами Эйлера.

РЕДАКТИРОВАТЬ: со ссылкой на ваш комментарий выше, вы можете получить дельта-движения, зарегистрировав обработчик с -startDeviceMotionUpdatesToQueue: withHandler :. Это получит серию CMDeviceMotions, из которых вы можете посмотреть на элементrationRate.

0 голосов
/ 02 марта 2011
0 голосов
/ 02 марта 2011

Акселерометр измеряет сумму двух векторов ускорения: гравитации и пользовательского ускорения. Ускорение пользователя - это ускорение, которое пользователь передает устройству. Поскольку Core Motion может отслеживать положение устройства как с помощью гироскопа, так и акселерометра, он может различать гравитацию и ускорение пользователя

Это может быть полезно для вас:

ан-абсолютная степень измерение

...