Исправление рычажной части одного кватерниона рычажной частью другого - PullRequest
6 голосов
/ 30 мая 2011

У меня есть следующая проблема: кватернион (q1) от устройства захвата движения должен быть скорректирован на угол рыскания (и только рыскание!) От другого кватерниона ориентации (q2), полученного вторым отслеживаемым объектом, так, чтобы шаг и крен q1 такие же, как и раньше, но q1 имеет рыскание q2.

Рабочим решением является преобразование кватов в матрицы, затем я делаю вычисления, чтобы извлечь угол поворота, а затем я делаю коррекцию курса. Но это приводит к «переворачиванию», когда оно находится непосредственно в направлении определенной оси (например, после 0 ° - 359 °). Также пробовал другие преобразования, которые не удобны.

Есть ли возможность выполнить математику непосредственно на кватернионах без преобразования в матрицы или углы Эйлера (т. Е. Чтобы я мог установить исправленный кватернион как кватернион для отслеживаемого объекта)?

Как уже говорилось - коррекция должна включать только вращение вокруг оси вверх (рыскание). У меня не так много возможностей программирования в отношении математических классов (к сожалению, VSL Script от Virtools довольно ограничен в этом направлении). У кого-нибудь есть совет?

Ответы [ 4 ]

1 голос
/ 15 июня 2011

Для этой задачи лучше всего использовать углы Эйлера, поскольку их преимущество (единственное преимущество вообще) заключается в разделении на отдельные повороты вокруг ортогональных осей.Поэтому преобразуйте оба кватерниона в соглашение об угле Эйлера, которое соответствует вашим потребностям, и просто замените угол поворота q1 на q2.

Конечно, вам нужно использовать соответствующее соглашение об угле Эйлера, в котором другие повороты не зависят отугол поворота (таким образом, поворот поворота применяется первым при преобразовании точки?), так что вы можете просто изменить угол, не влияя на другие оси.При преобразовании полученного тройного угла Эйлера обратно в кватернион вы должны снова получить уникальное представление, или я что-то упустил?

0 голосов
/ 20 мая 2017

Вы можете удалить часть рыскания кватерниона, рассчитав часть рыскания, а затем применив ее инверсию.Давайте предположим, что ваши кватернионы равны quat(w,x,y,z) == w + xi + yj + zk), а рыскание определено вокруг оси Z (эйлер 123 или 213 из этой статьи ).

Обратите внимание, что в этих кадрах вращение на yaw вокруг оси Z представлен кватернионом quat(cos(yaw/2), 0, 0, sin(yaw/2)).

Разлагая кватернионы на эйлеровы углы, мы имеем отклонение от курса:

yaw = atan2(-2*x*y + 2*w*z, +w*w +x*x -y*y -z*z); // 123 angles (page 24)
yaw = atan2(-2*x*y + 2*w*z, +w*w -x*x +y*y -z*z); // 213 angles (page 28)

Из которого мы можем вывести, что

quat quat_2yaw = quat(w*w +x*x -y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 123 angles
quat quat_2yaw = quat(w*w -x*x +y*y -z*z, 0, 0, -2*x*y + 2*w*z).normalize(); // 213 angles

Простой способ уменьшить угол кватерниона вдвое - добавить его к единичному кватерниону и нормализовать:

quat quat_yaw = (1 + quat_2yaw).normalize();

Чтобы ответить на исходный вопрос - мы хотим взятьрыскать от q1 и заменить ею q2.Мы можем сделать это следующим образом:

q2 = get_quat_yaw(q1) * get_quat_yaw(q2).conj() * q2;
0 голосов
/ 17 июня 2011

Если у вас есть кватернионы Q1 и Q2 и ваше направление "вверх" равно y , то если вы уберете y компонент Q1 и перенормируйте, тогда вы получите кватернион без компонента рыскания. Аналогично, если вы уберете x и z компонентов Q2 , то вы получите кватернион с only компонентом рыскания. Умножьте второе на первое (используя умножение кватернионов), и вы там.

Q1[2] = 0;
normalize4d(Q1);
Q2[1] = 0;
Q2[3] = 0;
normalize4d(Q2);
Q3 = quatMult(Q2,Q1);

Конечно, вы можете проверить особый случай, когда произошло вращение точно (или близко) к 180 градусам, поскольку это может привести к числовой нестабильности при попытке нормализовать вектор с очень малой величиной.

0 голосов
/ 30 мая 2011

Краткий ответ: Да, это возможно.Вы можете сформулировать повороты (вокруг произвольной оси) и выполнить их с помощью кватернионных операций.

Длинный ответ: см. Статью Википедии о кватернионах и вращениях .Я полагаю, что проблема, которую вы описываете, это замок карданного подвеса.

...