Подтвердить что ты не робот

IPhone - понимание поворота iPhone

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

Предположим, у меня 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

4b9b3361

Ответ 1

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

dQ = q1 ^ (- 1) * q2

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

[EDIT: Забыл часть] Чтобы избавиться от дрейфующего эффекта, вам "нужен" только способ выразить реальную позицию последнего объекта (q1) как кватернион, т.е. координаты в вашем приложении, отображаемые на экране. Если вы используете такие инструменты, как Unity, это может быть просто чтение соответствующего свойства объекта. Если у вас нет простого доступа к нему, у вас может быть возможность отслеживать эту позицию вручную.

Если вы хотите больше узнать об этом, посмотрите 3D-учебник по математике для разработки графики и игр, по версии Fletcher Dunn, Ian Parberry 168.

Ответ 2

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

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

Посмотрите Gimbal Lock или некоторые подобные статьи об этом явлении.

Ответ 3

Мне не удалось воспроизвести те же результаты. Используя (бесплатное) приложение "Гироскоп" , сообщаю как roll, pitch, yaw, я получаю (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 перед отчетностью приведет к параллельной настройке оси тангажа и рыскания, создав gimbal lock, как упоминалось более быстрыми машинами, чем I.

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

EDIT: в связи с вашим комментарием выше вы можете получить дельта-движения, зарегистрировав обработчик с -startDeviceMotionUpdatesToQueue: withHandler:. Это получит серию CMDeviceMotions, из которой вы можете посмотреть член rotationRate.

Ответ 4

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

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

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