Использование Quaternion для представления угла гироскопа в C # - PullRequest
1 голос
/ 07 декабря 2010

Я использую гироскоп WiiM + для расчета вращения.

Я интегрирую скорости поворота по осям рыскания, тангажа и крена и сохраняю их в векторе под названием angleSum

Таким образом, для каждого показания angleSum (показание) представляет повороты y, p и r от начальной ориентации.

Затем я использую кватернионы (с которыми я совершенно незнаком), чтобы представить их так:

q = Quaternion.createfromyawPitchRoll (angleSum.yaw, angleSum.pitch, angleSum.roll * (- 1))

Но когда я поворачиваю свой wiimote на 90 градусов в направлении и распечатываю qx, qy и qz для поворота, ВСЕ показания влияют на поворот (все они показывают поворот на 90 градусов и обратно, хотя величина меньше для двух из них)

Мой вопрос очень простой: как именно я использую эту кватернионную структуру для представления ориентации? Мне нужна абсолютная (или, по крайней мере, относительная) ориентация с точки зрения рыскания, тангажа и крена.

Спасибо!

1 Ответ

1 голос
/ 07 декабря 2010

A кватернион - это четырехмерная конструкция, свободно определяемая как ось и компонент вращения вокруг определенной оси (обычно представляемая как {x, y, z, w}). Взглянув на метод, на который вы ссылались, Я предполагаю, что вы вводите рыскание, тангаж и крен в радианах вместо градусов. Это удалит наиболее распространенную ошибку реализации из таблицы.

Предполагая, что ваша реализация верна (и кажется, что это так), q.x, q.y и q.z все ожидаемо изменится при любом повороте. Помните, вы определяете четырехмерный объект; кватернионы не совпадают с углами Эйлера.

Если вы хотели бы , чтобы получить показания в более дружественной для человека записи Эйлера, рассмотрите возможность преобразования вашего кватерниона обратно в рыскание, тангаж и крен. Вот обсуждение для этого в XNA.

...