| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Кватернион в углы Эйлера |
| Автор: GreyBeholder 19.5.2012, 22:57 |
| Ищу алгоритм перехода от кватерниона к углам Эйлера. Первое что пришлось попробовать - http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Conversion и это пробовал (по сути тоже самое) - http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm Формулы там такие: atan2 (2*(q1*q2+q3*q4),1-2*(q2*q2+q3*q3)) asin (2*(q1*q3-q4*q2)) atan2 (2*(q1*q4+q2*q3),1-2*(q3*q3+q4*q4)) Это все работает хорошо в пределах углов 0-90 а дальше или знак. Проблему можно решить, но как понять по кватерниону [q1,q2,q3,q4] в какой момент необходимо менять формулу расчета ?? Для примера прикрепил графики расчета 3х углов по этим формулам, углы кватерниона меняются линейно от 1 до 360, а после пересчета - см. вложения. Помогите пжлст. алгоритмом/методом/статьей как по 4м значениям кватерниона определить изменение ситуации (ведь угол мы еще не знаем). Спасибо. http://s2.ipicture.ru/uploads/20120519/0Cy57Fm8.jpg http://s2.ipicture.ru/uploads/20120519/WxLL5jSN.jpg http://s2.ipicture.ru/uploads/20120519/MWaFUiNn.jpg |
| Автор: baldina 19.5.2012, 23:49 |
| что мешает полученные углы преобразовать в диапазон 0..360? |
| Автор: GreyBeholder 20.5.2012, 00:40 | ||
Они и так в этом диапазоне. Но угол в кватернионе изменяется линейно, т.е. если этим кватернионом поворачивать объект, то он, поворачивается плавно, равномерно, в одну сторону (на угол 360). После преобразования в углы эйлера, результат получается совершенно не тот (см. вложение). Углы курса и крена движутся от 0 до 180, а потом от -180 до 0 (ось ординат) в то время как угол кватерниона изменяется от 0 до 360, ось абсцисс. Менять условия пересчета проблем не составляет, т.е. в нужный момент считать (Х+360), только как этот момент вычислить по четырем значениям кватерниона ? |
| Автор: volatile 20.5.2012, 10:41 |
| GreyBeholder, вы придумали себе проблему, которой нет. Если вам от этого будет легче, сделайте так: if (result<0) result += 360; Хотя смысла в этом нет абсолютно. Так как a == (a+360), где а - угол. В общем у вас все правильно. Не морочьте себе и окружающим голову. |
| Автор: GreyBeholder 20.5.2012, 21:05 | ||
Что же здесь правильного ? Каждый угол является функцией 3х переменных (это углы на которые поворачивает объект данный кватернион) и в зависимости от них выдает абсолютно непредсказуемые результаты. Если кватернион поворачивает объект по одной оси на полный оборот 0-360 (при этом остальные угля <90) я могу применить result += 360; Но ситуация меняется если один из других углов становится больше 90. Результат становится совершенно другим (к примеру: угол крена начинает меняться от -180 до 180). А если один из углов становится больше 270 то мы имеем 3ю ситуацию.... Вот я пытаюсь как-то прийти к решению -> "скормил" кватернион в функцию и на выходе имею правильные углы в полном диапазоне. Если кто-нибудь делал подобное, буду очень благодарен за помощь. Спасибо. |
| Автор: GreyBeholder 20.5.2012, 23:42 | ||||
-180+360=180 180 + 360 = 540 Диапазон = 180-540. В одном случае имеем: if (угол крена < 0) угол крена += 360; В другом случае имеем: if (угол крена < 0) угол крена += 180; В 3м случае имеем.... (еще что-то имеем) внимание вопрос. Как по четырем значения кватерниона определить случай ???? Напр кватернион углов (10,15,20) -> [ 0.9746 0.0625 0.1431 0.1603] Переводим обратно в углы [ 0.9746 0.0625 0.1431 0.1603] -> ( 9.9999 14.9999 19.9999) все правильно Кватернион углов (10,170,250) -> [ 0.0213 -0.8173 -0.5630 0.1209] Переводим обратно в углы [ 0.0213 -0.8173 -0.5630 0.1209] -> [9.9999 10.0030 69.9965] случай 180 - угол крена. 180+угол тангажа. Как по этому " 0.0213 -0.8173 -0.5630 0.1209" идентифицировать именно этот случай Кватернион углов (190,0,0) -> [ -0.0871 0.9962 0 0] Переводим обратно в углы [ -0.0871 0.9962 0 0] -> [ 9.9969 0 0] . . . . И т.д. Примерно так работают эти формулы. |
| Автор: volatile 20.5.2012, 23:54 |
Батенька, вы что? вы там заметили if или как? Диапазон = 0-360. |
| Автор: GreyBeholder 21.5.2012, 00:24 | ||
Верно if не заметил Но от этого не легче. Это - if (угол крена < 0) угол крена += 360; Не работает. Просто меняет случаи/ситуации/диапазоны, местами. |
| Автор: volatile 21.5.2012, 00:37 |
| GreyBeholder, Вы на каком языке пишите? Скинтье программу, я посмотрю. |
| Автор: GreyBeholder 21.5.2012, 08:55 | ||
Пишу на "С"+VerilogHDL проблему с кватернионом решил разобрать в matlab В общем алгоритме кватернион получается путем интегрирования угловых скоростей (с этим нет проблем). Проблемы появились при пересчете кватерниона в угол. Поэтому, в Матлабе я сделал 2е функции: 1я получает кватернион по 3м углам. 2я преобразует кватернион обратно в углы. Потом все это в цикле, переменная цикла меняется от 0 до 360, она же идет в 1ю функцию и в график (ось абсцисс). На оси ординат наблюдаю результат неправильной работы. Код во вложении. При исследовании одного угла, меняйте два остальных (ставьте разные константы). |
| Автор: baldina 21.5.2012, 09:36 |
| теперь понятно... Ваша проблема в том, что для совпадения вам нужен другой ("правильный") отсчет, не 0..360, а -180...180 почитайте в http://en.wikipedia.org/wiki/Euler_angles раздел Angle signs and ranges Добавлено через 1 минуту и 33 секунды если хотите пользоваться 0..360, сначала преобразуйте его в -180...180, потом уже скармливайте вашим алгоритмам |
| Автор: volatile 21.5.2012, 23:04 |
а я даже и скачивать не буду, поскольку полностью доверяю мнению baldina, Тем более что подоозревал это с самого начала. К сожалению, у меня сложилось впечатление, что ТС вообще не понимает что такое приведение углов к нужному диапазону. |
| Автор: GreyBeholder 22.5.2012, 18:02 | ||
Можете конечно не скачивать, но результат не изменился. |
| Автор: baldina 22.5.2012, 18:13 |
| а отчего он должен измениться? |
| Автор: GreyBeholder 22.5.2012, 21:43 | ||
от изменения входного диапазона на -180 - 180 |
| Автор: baldina 22.5.2012, 23:17 |
| поглядите http://codepad.org/vSwYh8I4 может наведет на мысли Добавлено через 5 минут и 26 секунд кстати, прост любопытно: зачем вам углы эйлера? ось поворота+угол вроде удобнее |
| Автор: GreyBeholder 23.5.2012, 18:04 | ||
Всеравно потом искать 3 угла поврота вокруг XYZ. Это связано с особенностями расположния приводов в манипуляторе. Все работает если углы в диапазонах: x - -180...180 y - -90...90 z - -180...180 В том числе и это - http://codepad.org/vSwYh8I4 Как только хоть один выскакивает из диапазона, 2 остальных тоже переворачиваются. Думаю теперь что делать с диапазонами, а точнее с "У" т.к. он -90...90 (маловато). |
| Автор: baldina 23.5.2012, 18:29 | ||||
таков арксинус))) Добавлено через 32 секунды
так сделайте что б не "выскакивал" данный вам пример ведь работает Добавлено через 54 секунды причем входные углы 0..360, как вы и хотели |
| Автор: GreyBeholder 23.5.2012, 20:31 | ||||||
Пример, так же как и мой код, работает в тех же диапазонах (ниче удивительного). сдвинуть диапазон - не проблема. Вся путаница была во влиянии одного угла на другой, ну и в диапазонах. |
| Автор: baldina 23.5.2012, 21:50 |
они влияют, конечно. по определению. и есть такой забавный эффект - gimbal lock |
| Автор: tn17 2.10.2013, 11:00 |
| Всех приветствую! Уважаемые, а что делать, если тангаж +- 90 градусов? Формулы atan2 (2*(q1*q2+q3*q4),1-2*(q2*q2+q3*q3)) asin (2*(q1*q3-q4*q2)) atan2 (2*(q1*q4+q2*q3),1-2*(q3*q3+q4*q4)) тогда не работают - atan2 начинают делить случайные (из-за ошибок вычислений) малые числа и результат (крен и курс) непредсказуем? На индикацию что выводить? А ситуация вполне реальна: ракета стартует или самолет мертвую петлю делает... И еще один вопрос: эти формулы для какой системы координат? У русских принято: ось Х - вперед (в нос), Y - вверх, Z - вправо. Тут так? |
| Автор: baldina 2.10.2013, 12:05 | ||
это в математике принято
atan2(0,x) даёт 0 atan2(x,0) даёт pi/2 или -pi/2 в зависимости от знака x. так что его результат корректен и предсказуем, даже когда значения q1*q2+q3*q4 малы. если же дело в погрешности вычислений, надо разбираться с кодом, где эти погрешности накапливаются, а не с углами. |
| Автор: tn17 3.10.2013, 11:08 |
| 1. к сожалению - нет. Полно источников, где ось Z направлена вверх или вниз. Еще в англоязычном источнике (в этой теме на стр.1) курс измеряется от оси Z против часовой стрелки... 2. при Тангаже=+-90 +-1 градус, не только q1*q2+q3*q4 ~ 0, но и 1-2*(q2*q2+q3*q3)~ 0, и 1-2*(q3*q3+q4*q4)~ 0, и q1*q4+q2*q3 ~ 0, т.ч. речь идет о ситуации ~0 / ~0, где эти ~0 - порядка ошибки вычисления sin и cos. Переход к long double особо ситуацию не спасает... Пока делаю так: если и числитель, и знаменатель по абс. величине больше 0.001, то считаю курс и крен через atan2. Иначе просто выдаю на индикацию последние вычисленные значения курса и крена. 3. По поводу http://codepad.org/vSwYh8I4. Не понял следующего: угол Эйлера Х - это курс или крен? По формулам из кода: угол Y - это Тангаж. Правильно? Тогда логично предположить, что угол Х - курс. |
| Автор: baldina 3.10.2013, 13:25 |
| логично |
| Автор: Pavia 3.10.2013, 13:45 |
Курс, крен и тангаж это углы поворот для летательного аппарата и с углами Эйлера они не имеют ничего общего. Удивительно, что многие их путают. |
| Автор: tn17 3.10.2013, 17:28 | ||||
я так понял, что по п.2 возражений нет? Добавлено через 8 минут и 59 секунд
Это написано в русских ;-) учебниках по динамике полета и по навигации... Про поворот связанной СК относительно нормальной земной (ось Х - на север, Z - на восток, Y - по нормали вверх). А в чем собственно отличие и как это сказывается на записи компонент кватерниона через эти углы "Эйлера" (курс, тангаж, крен) ? Как вариант: может есть книга про кватернионы в приложении к навигации по русским стандартам - см. выше? С кватернионами вообще много "непоняток", например, часто скаляный компонент Qw записывают через квад. корень. А то, что это верно с точностью до знака не пишут. |
| Автор: baldina 4.10.2013, 00:48 | ||
навигация это повороты в локальной системе координат, углы эйлера - в глобальной. никаких тонкостей и проблем вычисления углов эйлера по кватерниону и наоборот нет. сложности возникают при ошибочном выборе инструмента.
подозреваю, что в данном вопросе "навигация по русским стандартам" сводится к определению понятий "тангаж", "крен", "рыскание" (их определение в локальной системе координат тривиально), а теория кватернионов - к формулам преобразования оси и угла поворота к кватерниону и обратно. какая задача решается и в чем затруднения? |
| Автор: tn17 4.10.2013, 12:25 | ||||
1. с моей точки зрения - углы Эйлера это углы поворота локальной СК (связанной с ЛА) относительно глобальной (связанной с Землей), что вполне соответствует учебникам по навигации. При этом "глобальная" СК может быть мегаглобальной 2. О проблемах я уже писал: проблема в том, что существует множество вариантов записи начального кватерниона (qw, qx, qy, qz) ориентации (начального его значения) через углы Эйлера. Есть вариант с записью qw через квад. корень, с последующим делением на 4*qw (при вычислении qx, qy, qz). Есть варианты (разные ?!) с записью через sin и cos половинных углов - это, скорее всего, связано с использованием разных СК, у кого левая, у других правая и т.д. Сейчас сижу и привожу все эти варианты к "русской" (математической 3. Инструмент С++ (фактически С), переменные типа long double. Ситуации типа ~0 / ~0 перехватываю так, как описано выше. 4. Задача - вычислять текущую ориентацию ЛА при известных начальных углах (Курс, Тангаж, Крен) относительно стартовой прямоугольной правой СК и при известных текущих угловых скоростях (Wx, Wy, Wz) в связанной правой СК, путем их интегрирования. 5. Лучшее, что удалось пока получить - объект вращается правильно, но вокруг другой оси |