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]()
Ответы
Ответ 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 способен отслеживать отношение устройств, используя как гироскоп, так и акселерометр, он может различать гравитацию и ускорение пользователя.
Это может быть полезно для вас:
абсолютная степень измерения
Ответ 5
Этот вопрос выглядит актуальным:
iphone - основной диапазон движения рыскания, высоты тона и ролика