![]() |
|
![]() ![]() ![]() |
|
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Ищу алгоритм перехода от кватерниона к углам Эйлера.
Первое что пришлось попробовать - http://en.wikipedia.org/wiki/Conversion_be...gles#Conversion и это пробовал (по сути тоже самое) - http://www.euclideanspace.com/maths/geomet...Euler/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 Присоединённый файл ( Кол-во скачиваний: 14 ) ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
что мешает полученные углы преобразовать в диапазон 0..360?
Это сообщение отредактировал(а) baldina - 19.5.2012, 23:54 |
|||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Они и так в этом диапазоне. Но угол в кватернионе изменяется линейно, т.е. если этим кватернионом поворачивать объект, то он, поворачивается плавно, равномерно, в одну сторону (на угол 360). После преобразования в углы эйлера, результат получается совершенно не тот (см. вложение). Углы курса и крена движутся от 0 до 180, а потом от -180 до 0 (ось ординат) в то время как угол кватерниона изменяется от 0 до 360, ось абсцисс. Менять условия пересчета проблем не составляет, т.е. в нужный момент считать (Х+360), только как этот момент вычислить по четырем значениям кватерниона ? |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
GreyBeholder, вы придумали себе проблему, которой нет.
Если вам от этого будет легче, сделайте так: if (result<0) result += 360; Хотя смысла в этом нет абсолютно. Так как a == (a+360), где а - угол. В общем у вас все правильно. Не морочьте себе и окружающим голову. ![]() |
|||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Что же здесь правильного ? Каждый угол является функцией 3х переменных (это углы на которые поворачивает объект данный кватернион) и в зависимости от них выдает абсолютно непредсказуемые результаты. Если кватернион поворачивает объект по одной оси на полный оборот 0-360 (при этом остальные угля <90) я могу применить result += 360; Но ситуация меняется если один из других углов становится больше 90. Результат становится совершенно другим (к примеру: угол крена начинает меняться от -180 до 180). А если один из углов становится больше 270 то мы имеем 3ю ситуацию.... ![]() Вот я пытаюсь как-то прийти к решению -> "скормил" кватернион в функцию и на выходе имею правильные углы в полном диапазоне. Если кто-нибудь делал подобное, буду очень благодарен за помощь. Спасибо. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
||||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
-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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
||||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Верно if не заметил ![]() Но от этого не легче. Это - if (угол крена < 0) угол крена += 360; Не работает. Просто меняет случаи/ситуации/диапазоны, местами. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
GreyBeholder, Вы на каком языке пишите?
Скинтье программу, я посмотрю. |
|||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Пишу на "С"+VerilogHDL проблему с кватернионом решил разобрать в matlab В общем алгоритме кватернион получается путем интегрирования угловых скоростей (с этим нет проблем). Проблемы появились при пересчете кватерниона в угол. Поэтому, в Матлабе я сделал 2е функции: 1я получает кватернион по 3м углам. 2я преобразует кватернион обратно в углы. Потом все это в цикле, переменная цикла меняется от 0 до 360, она же идет в 1ю функцию и в график (ось абсцисс). На оси ординат наблюдаю результат неправильной работы. Код во вложении. При исследовании одного угла, меняйте два остальных (ставьте разные константы). Присоединённый файл ( Кол-во скачиваний: 24 ) ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
теперь понятно...
Ваша проблема в том, что для совпадения вам нужен другой ("правильный") отсчет, не 0..360, а -180...180 почитайте в википедии раздел Angle signs and ranges Добавлено через 1 минуту и 33 секунды если хотите пользоваться 0..360, сначала преобразуйте его в -180...180, потом уже скармливайте вашим алгоритмам Это сообщение отредактировал(а) baldina - 21.5.2012, 09:36 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
а я даже и скачивать не буду, поскольку полностью доверяю мнению baldina, Тем более что подоозревал это с самого начала. К сожалению, у меня сложилось впечатление, что ТС вообще не понимает что такое приведение углов к нужному диапазону. |
|||
|
||||
GreyBeholder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 28.11.2011 Репутация: нет Всего: нет |
Можете конечно не скачивать, но результат не изменился. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
а отчего он должен измениться?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |