Мне не удалось воспроизвести те же результаты. Используя (бесплатное) приложение 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.