У меня есть приложение, которое фиксирует углы, когда пользователь ходит по объекту, а указательное устройство (предпочтительно) находится в центре объекта. Угол получает reset по команде пользователя. - так ссылки отношение получает reset
Использование углов Эйлера приводит к блокировке каркаса, поэтому в настоящее время я использую кватернионы и расчетные углы следующим образом:
double angleFromLastPosition = acos(fromLastPositionAttitude.quaternion.w) * 2.0f;
Это дает хорошую точность, и он отлично работает, если шаг устройства и рыскание не изменяются. Другими словами, когда угол показывает 360 градусов, я оказываюсь в том же месте, что и начало круга.
Задача 1: если рывок рыскания и высота тона слегка меняются (пользователь не указывает прямо в центр объекта), то и angleFromLastPosition. Я понимаю эту часть, так как моя угловая формула просто показывает угол между двумя отношениями устройств в трехмерном пространстве.
Сценарий:
- Я отмечаю начало поворота и начинаю двигаться по кругу вокруг объекта, указывая на центр.
- Я останавливаюсь, скажем, на 45 градусов и меняю шаг устройства, указывая его выше или ниже. Угол изменяется соответственно.
- Мне хотелось бы видеть: угол остается на уровне 45 градусов, даже если изменяется шаг или рыскание.
Вопрос 1: как я могу рассчитать только рулон устройства с использованием кватернионов и игнорировать изменения в других двух осях (по крайней мере, в пределах некоторого разумного количества градусов).
Проблема 2: если я немного повернусь, а затем полностью заморожу устройство (на штативе, чтобы его вообще не трясло), angleFromLastPosition дрейфует со скоростью 1 градус за 10-20 секунд, и, похоже, это не так быть линейным. Другими словами, он сначала сползает, а затем значительно замедляется. Иногда я вообще не дрейфую - угол твердый, если устройство неподвижно. И это заставляет меня потерять понимание того, что происходит.
Вопрос 2, что здесь происходит, и как я могу позаботиться о дрейфе?
Я просмотрел довольно много статей и руководств, а математика кватернионов сейчас находится вне меня, надеюсь, кто-то сможет помочь с подсказкой, ссылкой или несколькими строками кода.