|
|
|
Гироскоп - вырождение угла, Как борются с этим? |
|
|
|
Feb 10 2014, 12:08
|
Участник
Группа: Участник
Сообщений: 30
Регистрация: 9-02-14
Пользователь №: 80 406
|
А это разве не эффект "схлопывания рамок"? ))
|
|
|
|
|
Feb 10 2014, 14:01
|
Профессионал
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968
|
Цитата(FPGAz @ Feb 10 2014, 16:08) А это разве не эффект "схлопывания рамок"? )) В кватернионах такого нет. Это в углах эйлера. Просто действительно при повороте на 90 град углы местами меняются местами, вот мне и надо плавно, по ходу поворота на 90 град. менять регулируемую величину с одного угла на другой (учитывая и тот и другой, но какой-то в большей степени, какой-то в меньшей). Да, вникнуть так сразу трудно, расчитываю на тех кто решал такое. Им должно быть понятно. PS А нет у кого геометрии как получаются эти углы из кватерниона? Почему именно например именно такие аргументы 2*q[1]*q[2]-2*q[0]*q[3] и 2*q[0]*q[0]+2*q[1]*q[1]-1? Почему еще минус 1? Подозреваю что в другой комбинации элементы кватерниона дадут нужный угол. Например где-то откопал такое вычисление угла тангажа: x=2*q[1]*q[3]-2*q[0]*q[2]; y=2*q[3]*q[2]+2*q[0]*q[1]; z=q[0]*q[0]+q[3]*q[3]-q[1]*q[1]-q[2]*q[2]; reg_ang=((atan(x/(sqrt(y*y+z*z))))*180)/3.141519; Работает отлично. Но вот сейчас даже не могу найти откуда это взял. Хотел перечитать откуда взялось там чего.
|
|
|
|
|
Feb 11 2014, 12:43
|
Профессионал
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968
|
Цитата(Taran87 @ Feb 11 2014, 15:09) Сталкивался с ситуацией пересчета угла рысканья (yaw) для мобильных, носимых устройств. Пересчет из кватернион в угол не дает всегда адекватный результат. Решил проблему при переходе в матрицу ДСМ, в которой точно видно при каких углах работает та или иная формула. Если задача еще актуально жду ответа. Да да да, актуально. Интересны подробности, если Вас не затруднит. UPD Вроде понял, чего хочу. )) Более формализованная задача: Есть кватернион текущего поворота Qт, q[n] - его элементы По нему вычисляем углы, нужные мне, по формулам: x=2*q[1]*q[3]-2*q[0]*q[2]; y=2*q[3]*q[2]+2*q[0]*q[1]; z=q[0]*q[0]+q[3]*q[3]-q[1]*q[1]-q[2]*q[2]; teta = ((atan(x/(sqrt(y*y+z*z))))*180)/3.141519; phy = atan2(2*q[1]*q[2]-2*q[0]*q[3],2*q[0]*q[0]+2*q[1]*q[1]-1))*180)/3.141519; Вопрос: как повернуть систему координат (найти кватернион поворота) так, чтобы teta стала равна 0. Вот так вполне конкретно. Понятно что надо повернуть на угол, обратный teta, но вот относительно какого вектора? Че-то не соображу. Интуитивно чувствую, что решение такой задачи однозначное. При таком повороте как раз угол, который вырождается в 90 град, стает тем что нужно.
|
|
|
|
|
Mar 15 2017, 08:22
|
Группа: Участник
Сообщений: 9
Регистрация: 26-01-07
Пользователь №: 24 779
|
Прошу прощения за некромантию. Уважаемый AlexPec, удалось ли вам повернуть систему координат на угол обратный teta? А то мне как-раз требуется проделать такой-же фокус, только дополнительно еще повернуть и на угол обратный phy. Т.е. чтобы осталось только вращение по одному углу psi.
|
|
|
|
|
Mar 15 2017, 09:55
|
Группа: Участник
Сообщений: 9
Регистрация: 26-01-07
Пользователь №: 24 779
|
Попробую уточнить вопрос. Имеется некоторый кватернион q определяющий текущее положение тела в пространстве. Если проделать следующие математические операции YPR = euler_from_quat(q); // Вычисляем углы Эйлера
q1 = Quat_from_Eueler(0, 0, -YPR[2]); // Формируем кватернионы обратного поворота q2 = Quat_from_Eueler(0, -YPR[1], 0); q4 = quat_mul_quat(q1, q); // Поворот q5 = quat_mul_quat(q2, q4); // Поворот
то в q5 будет отсутствовать вращение по двум осям. Останется только одно. Если я хочу заблокировать вращение по другим осям, то пытаюсь сделать так
YPR = euler_from_quat(q); // Вычисляем углы Эйлера
q1 = Quat_from_Eueler(0, -YPR[1], 0); // Формируем кватернионы обратного поворота q2 = Quat_from_Eueler(-YPR[0], 0, 0); q4 = quat_mul_quat(q1, q); // Поворот q5 = quat_mul_quat(q2, q4); // Поворот
но вращение остается по всем осям. Чувствую, что преобразование не корректное т.к. мне нужно исключить вращение по тангажу, курсу и крену, а я вычитаю углы Эйлера, но, в первом случае результат получается именно такой, какой и нужно. Т.е. вычисляется общий кватернион поворота, а затем нужно вычислить отдельные его составляющие после обнуления поворота по другим осям. Т.е. требуется найти три кватерниона поворота, после которых 1. тангаж=текущий угол; крен=0; курс=0; 2. тангаж=0; крен=текущий угол; курс=0; 3. тангаж=0; крен=0; курс=текущий угол;
А может надо совсем все по другому делать т.к. в конечном итоге нужно определить углы между локальными осями координат (оси объекта) относительно плоскостей глобальной системы координат.
|
|
|
|
|
Mar 16 2017, 13:09
|
Группа: Участник
Сообщений: 9
Регистрация: 26-01-07
Пользователь №: 24 779
|
Понемногу разбираюсь. Поскольку поворот на углы Эйлера осуществляется последовательно - XYZ, то и вычитание этих углов должно быть таким же только в обратном порядке - ZYX. Таким образом, методом вычитания можно найти только первый угол - X, осуществив последовательное вычитание вокруг ZY. На этом мысль заканчивается. Как найти два других угла непонятно.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|