Я использую библиотеку это, в которой я надеялся найти вращение по рысканью в градусах от заданного система отсчета.
Однако, когда я начал тестировать его, я заметил резкое изменение рыскания при легком перемещении устройства по крену и тангажу. Когда устройство находится на столе и вращается в нем, кажется, что он дает правильные значения.
Я также замечаю, глядя на вращение, которое, кажется, дает правильные значения при вращении его в качающемся режиме, что легкое перемещение его по высоте внезапно резко меняет значение.
Приведенные значения не изолированы друг от друга - вращение от данной системы отсчета?
Обратите внимание, что в библиотеке используется кватернион, так что не должно быть проблем с блокировкой карданного подвеса, или она возникает из-за простого представления поворота в градусах (с углами Эйлера)?
Здесь — исходный код
Редактировать: Я изменил реагировать родные датчики, чтобы дать мне отношение CMDeviceMotions на iOS (крен, тангаж, рыскание). Они давали мне вращение независимо друг от друга — что решало проблему.
Карданный замок является неотъемлемым свойством представления вращения с использованием углов Эйлера (то есть рыскания, тангажа, крена или любой другой комбинации). Хотя вы правы в том, что кватернионы не страдают от этой проблемы, представление углов Эйлера, в которое вы их конвертируете, делает это.
«Решение», часто используемое на практике, если вы хотите продолжать использовать углы Эйлера для представления своих вращений, состоит в том, чтобы переключиться с представления рыскания-тангажа-крена (xyz) на другую комбинацию, которая лучше работает в вашей системе координат - иметь взгляните на вики-страница для комбинаций, которые вы могли бы попробовать. По сути, это просто устанавливает блокировку подвеса на другую комбинацию углов, но для практических приложений с четко определенными диапазонами значений этого часто достаточно, чтобы избежать проблем.
В зависимости от вашего варианта использования более «правильным» решением может быть полное переключение на представление кватернионов, что полностью устраняет проблему.
В конце концов мне удалось создать решение, полностью основанное на кватернионах, с помощью разработчика игр.