Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кватернион в углы Эйлера 
:(
    Опции темы
GreyBeholder
Дата 19.5.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 )
Присоединённый файл  pics.zip 32,39 Kb
PM MAIL   Вверх
baldina
Дата 19.5.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



что мешает полученные углы преобразовать в диапазон 0..360?

Это сообщение отредактировал(а) baldina - 19.5.2012, 23:54
PM MAIL   Вверх
GreyBeholder
Дата 20.5.2012, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(baldina @ 19.5.2012,  23:49)
что мешает полученные углы преобразовать в диапазон 0..360?

Они и так в этом диапазоне. Но угол в кватернионе изменяется линейно, т.е. если этим кватернионом поворачивать объект, то он, поворачивается плавно, равномерно, в одну сторону (на угол 360). После преобразования в углы эйлера, результат получается совершенно не тот (см. вложение). Углы курса и крена движутся от 0 до 180, а потом  от -180 до 0 (ось ординат) в то время как угол кватерниона изменяется от 0 до 360, ось абсцисс.

Менять условия пересчета проблем не составляет, т.е. в нужный момент считать (Х+360), только как этот момент вычислить по четырем значениям кватерниона ?
PM MAIL   Вверх
volatile
Дата 20.5.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



GreyBeholder, вы придумали себе проблему, которой нет.

Если вам от этого будет легче, сделайте так:
if (result<0)
   result += 360;

Хотя смысла в этом нет абсолютно. Так как a == (a+360),  где а - угол.

В общем у вас все правильно. Не морочьте себе и окружающим голову. smile 

PM MAIL   Вверх
GreyBeholder
Дата 20.5.2012, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 20.5.2012,  10:41)
GreyBeholder, вы придумали себе проблему, которой нет.

Если вам от этого будет легче, сделайте так:
if (result<0)
   result += 360;

Хотя смысла в этом нет абсолютно. Так как a == (a+360),  где а - угол.

В общем у вас все правильно. Не морочьте себе и окружающим голову. smile

Что же здесь правильного ? Каждый угол является функцией 3х переменных (это углы на которые поворачивает объект данный кватернион) и в зависимости от них выдает абсолютно непредсказуемые результаты.
Если кватернион поворачивает объект по одной оси на полный оборот 0-360 (при этом остальные угля <90) я могу применить result += 360;
Но ситуация меняется если один из других углов становится больше 90. Результат становится совершенно другим (к примеру: угол крена начинает меняться от -180 до 180).
А если один из углов становится больше 270 то мы имеем 3ю ситуацию....  smile 

Вот я пытаюсь как-то прийти к решению -> "скормил" кватернион в функцию и на выходе имею правильные углы в полном диапазоне.
Если кто-нибудь делал подобное, буду очень благодарен за помощь. 
Спасибо.
PM MAIL   Вверх
volatile
Дата 20.5.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(GreyBeholder @  20.5.2012,  21:05 Найти цитируемый пост)
 Результат становится совершенно другим (к примеру: угол крена начинает меняться от -180 до 180).

if (угол крена < 0)
   угол крена += 360;
smile 
?
PM MAIL   Вверх
GreyBeholder
Дата 20.5.2012, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 20.5.2012,  23:19)
Цитата(GreyBeholder @  20.5.2012,  21:05 Найти цитируемый пост)
 Результат становится совершенно другим (к примеру: угол крена начинает меняться от -180 до 180).

if (угол крена < 0)
   угол крена += 360;
smile 
?

-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] 
.
.
.
.
И т.д.
Примерно так работают эти формулы.


PM MAIL   Вверх
volatile
Дата 20.5.2012, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(GreyBeholder @  20.5.2012,  23:42 Найти цитируемый пост)
-180+360=180
180 + 360 = 540
Диапазон = 180-540.


Батенька, вы что?  smile 
вы там заметили if или как?

Диапазон = 0-360.




Это сообщение отредактировал(а) volatile - 20.5.2012, 23:56
PM MAIL   Вверх
GreyBeholder
Дата 21.5.2012, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 20.5.2012,  23:54)
Цитата(GreyBeholder @  20.5.2012,  23:42 Найти цитируемый пост)
-180+360=180
180 + 360 = 540
Диапазон = 180-540.


Батенька, вы что?  smile 
вы там заметили if или как?

Диапазон = 0-360.

Верно if не заметил  smile  извините.
Но от этого не легче.

Это - 
if (угол крена < 0)
   угол крена += 360;

Не работает. Просто меняет случаи/ситуации/диапазоны, местами.

PM MAIL   Вверх
volatile
Дата 21.5.2012, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



GreyBeholder, Вы на каком языке пишите?
Скинтье программу, я посмотрю.

PM MAIL   Вверх
GreyBeholder
Дата 21.5.2012, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 21.5.2012,  00:37)
GreyBeholder, Вы на каком языке пишите?
Скинтье программу, я посмотрю.

Пишу на "С"+VerilogHDL
проблему с кватернионом решил разобрать в matlab
В общем алгоритме кватернион получается путем интегрирования угловых скоростей (с этим нет проблем).
Проблемы появились при пересчете кватерниона в угол. Поэтому, в Матлабе я сделал 2е функции:
1я получает кватернион по 3м углам.
2я преобразует кватернион обратно в углы.
Потом все это в цикле, переменная цикла меняется от 0 до 360, она же идет в 1ю функцию и в график (ось абсцисс). На оси ординат наблюдаю результат неправильной работы.
Код во вложении.
При исследовании одного угла, меняйте два остальных (ставьте разные константы).


Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  Quaternions.zip 0,86 Kb
PM MAIL   Вверх
baldina
Дата 21.5.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL   Вверх
volatile
Дата 21.5.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(baldina @  21.5.2012,  09:36 Найти цитируемый пост)
теперь понятно...

а я даже и скачивать не буду, поскольку полностью доверяю мнению baldina
Тем более что подоозревал это с самого начала.

Цитата(baldina @  21.5.2012,  09:36 Найти цитируемый пост)
преобразуйте его в -180...180,

 К сожалению, у меня сложилось впечатление, что ТС вообще не понимает что такое приведение углов к нужному диапазону.

PM MAIL   Вверх
GreyBeholder
Дата 22.5.2012, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.11.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 21.5.2012,  23:04)
Цитата(baldina @  21.5.2012,  09:36 Найти цитируемый пост)
теперь понятно...

а я даже и скачивать не буду, поскольку полностью доверяю мнению baldina
Тем более что подоозревал это с самого начала.

Цитата(baldina @  21.5.2012,  09:36 Найти цитируемый пост)
преобразуйте его в -180...180,

 К сожалению, у меня сложилось впечатление, что ТС вообще не понимает что такое приведение углов к нужному диапазону.

Можете конечно не скачивать, но результат  не изменился.

PM MAIL   Вверх
baldina
Дата 22.5.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



а отчего он должен измениться?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.