Использование Quaternion для представления угла гироскопа в C#
Я использую гироскоп WiiM+ для расчета вращения.
Я интегрирую скорости поворота по осям рыскания, тангажа и крена и сохраняю их в векторе под названием angleSum
Таким образом, для каждого чтения angleSum(чтение) представляет вращения y, p и r от начальной ориентации.
Затем я использую кватернионы (с которыми я совершенно незнаком), чтобы представить их так:
q = Quaternion.createfromyawPitchRoll (angleSum.yaw, angleSum.pitch, angleSum.roll * (- 1))
Но когда я поворачиваю wiimote на 90 градусов в направлении и распечатываю qx, qy и qz для поворота, ВСЕ показания влияют на поворот (все они показывают поворот на 90 градусов и обратно, хотя для двух из них величина меньше)
Мой вопрос очень простой: как именно я использую эту кватернионную структуру для представления ориентации? Мне нужна абсолютная (или, по крайней мере, относительная) ориентация с точки зрения рыскания, тангажа и крена.
Спасибо!
1 ответ
Кватернион - это четырехмерная конструкция, свободно определяемая как ось и вращательный компонент вокруг определенной оси (обычно представляемый в виде {x, y, z, w}
). Взглянув на метод, на который вы ссылались, я предполагаю, что вы задаете отклонение, наклон и крены в радианах, а не в градусах. Это удалит наиболее распространенную ошибку реализации из таблицы.
Предполагая, что ваша реализация верна (и кажется, что она есть), q.x
, q.y
, а также q.z
все ожидаемо изменится при любом повороте. Помните, вы определяете четырехмерный объект; кватернионы не совпадают с углами Эйлера.
Если вы хотите получить показания в более удобной для человека форме Эйлера, рассмотрите возможность преобразования вашего кватерниона обратно в рыскание, тангаж и крен. Вот обсуждение для этого в XNA.