Войти
ПрограммированиеФорумФизика

Как получить углы ейлера , в собственом базисе кватерниона ? (2 стр)

Страницы: 1 2 3 Следующая »
#15
(Правка: 20:40) 20:35, 14 фев. 2019

foxes
> M2.EulerAngle.z - это конкретное значение угла, поэтому все таки нулю.
Не буду вдаваться в пдробности , ну есть такая теорема в группах ли , а матрица вращения , верней все возможные её значения , ето группа-ли ! Если совсем просто , то в 3-мерном пространстве не существует вращения в нюлевую матрицу , такое вращения существует только в размерности 4-D пространстве в комопозиции 6-углов ейлера !
P.S: Понятно что теорема не про вращения и звучит совсем по другому , но я перефразировал чтоб было понятно ..

foxes
> Надо попробовать вывести значение всех углов Эйлера на каждом шаге обратного
> поворота. Мне кажется что идея умножения матриц X*Y*(-X) изначально не верна и
> не дает вращение вокруг единственной оси.
Тоже так думал .!Ну я проверил вроде все ок .!

foxes
> Можно также твою задачу переформулировать и взять за основу не получение углов
> Эйлера, а наоборот получение нужного кватерниона или матрицы от соответствующих
> углов Эйлера, чтобы определить этот самый базис который тебе требуется.
Я из всех углов ейлера пробовал создать новый кватернион . И он на 100% анологичен исходнуму реальному кватерниону . Так что с углами ейлера вроде все ок ..!


foxes
>
> Я бы начал плясать от имеющейся реализации IQuaternion::GetEulerAngles. Там по
> идеи надо "x и y" местами поменять чтобы получить требуемый результат. А чтобы
> проверить правильность работы соответственно поменять матрицы в
> IQuaternion::FromEulerAngles и заодно проверить тот алгоритм который работает с
> обратными поворотами. Потому как алгоритм которым ты проверяешь правильность
> работы остается не раскрытым.
Я уже перепробовал все возможные комибинации , ни чего не работает .!

P.S: Какого черта автор алгоритма пишет что у него рабоатет , если нафиг ни чего не работает ...!?


#16
(Правка: 22:37) 22:30, 14 фев. 2019

werasaimon
> Не буду вдаваться в пдробности
Ты говоришь о матрице, а тут значение угла - это разные понятия.

werasaimon
> Какого черта автор алгоритма пишет что у него рабоатет , если нафиг ни чего не
> работает ...!?
Видимо он точно также как и ты:
werasaimon
> Я уже перепробовал все возможные комибинации
но у него работает.

Перевод с сарказма:
От тебя и он него конкретики ноль.

#17
(Правка: 2:52) 2:48, 15 фев. 2019

Ну короfoxes
> Перевод с сарказма:
> От тебя и он него конкретики ноль.
>
>
Ну короче , мне на работе дали задания сделать устройство с камерой и стабилизацией , сама платформа уже готовая  http://gyrolab.ru/product/girostabilizirovannyy-podves/.
На даном этапе мне надо сделать емуляцию устройства на своем движке . Но проблема в том что в самом  устройве стабилизация должна происходить по показаниям гироскопа , а значить по углам вокруг таких осей как в реальном гироскопе , а сейчас стабилизация происходит по базисным осям мира сцены , ну то есть по XYZ
Примерно вот так как  с 0:55

P.S : Не знаю как ещё уточнить что мне надо !

#18
(Правка: 17:19) 17:18, 15 фев. 2019

werasaimon
> а значить по углам вокруг таких осей как в реальном гироскопе
И какие же это такие мифические реальные оси? Цифровой гироскоп (реальное устройство) выдает те же XYZ.

#19
21:20, 15 фев. 2019

foxes
Нет..! гироскоп во-первых цифровой , и поэтому он выдает только момент вращения . Ну с помощю аксилерометра и алогоритма фильтра калмана , получаем какбы углы реального гироскопа . А эти углы как бы вращаються вместе с устройством , верней не углы , а оси вокруг которых получаем углы . Поэтому естествено что гироскоп не может выдавать углы вокруг XYZ ибо эти оси тоже вращаються Q * XYZ  , и это просто не возможно чтоб гироскоп выдавал углы вокруг статических осей XYZ  , такое возможно только для аксилирометра но не для гироскопа !

#20
(Правка: 0:52) 0:27, 16 фев. 2019

werasaimon
Тогда объясни мне, каким образом ты пытаешься применить алгоритм, который работает строго на XYZ (разница лишь в последовательности поворотов YXZ) к твоей не стабильной системе гироскопа и удивляешься что он не работает?

На Unity гироскоп выдает строгое YXZ - от XYZ отличается только направлением осей, поэтому там все и работает.

werasaimon
> А эти углы как бы вращаються вместе с устройством , верней не углы , а оси
> вокруг которых получаем углы .
То есть система получается такая:

XYZ[i+1] = XYZ[i] * Giroscop.rotate;
Нет ни каких проблем получить от XYZ[i+1] эйлера. Их даже считать не нужно через мудреж. У тебя просто есть текущее состояние, которое ты вращаешь на углы полученные от гироскопа и потом уже получаешь эти углы XYZ не от гироскопа, а от текущего состояния стандартным методом.
#21
(Правка: 21:13) 20:50, 16 фев. 2019

foxes
> Нет ни каких проблем получить от XYZ[i+1] эйлера. Их даже считать не нужно
> через мудреж. У тебя просто есть текущее состояние, которое ты вращаешь на углы
> полученные от гироскопа и потом уже получаешь эти углы XYZ не от гироскопа, а
> от текущего состояния стандартным методом.
Ну так правильно , я так и делаю с реальным устройством ! Ну то бишь матрица вращения гироскопа берет углы с реального устройства . Ну дело в том что ето реальное уйстройство надо симулировать . Ну то есть помещаем его виртуальную модель  в физичискию симуляцию , и оно там под воздействиям разных физических сил движеться , а с кватерниона физического твердого тела , надо сщитать углы так будуто мы в устройстве есть гироскоп . Ну то есть сделать виртуальный гироскоп над телом кватерниона в физическом мире симуляции ..


Сейчас внимательно читай что я напишу :
.
Смотри например мы получаем угол поворота вокруг оси X  , назовем его a°
, и как бы все хорошо . Но потом мы поврачиваем устройство на угол b° вокруг оси Y . А дело в том что и гироскоп тоже повернулся вместе с утройством , и теперь 
угол a° должен сщитиваться не просто вокруг оси X , а вокру X повернутой на угол b° вокргу оси Y , 'a°= (M * Rotate(Y,b°))->a° видь гироскоп движеться вместе с устройством
, в отличии от базисных XYZ сцены .
А если говорить человеческим языком мне нужны углы Roll Pitch Yaw в ориентации устройства

#22
21:33, 16 фев. 2019

facepalm

#23
4:06, 17 фев. 2019

foxes
> facepalm
Нет тут ни какого facepalm . Скорей всего ты не понимаешь инверсную кинематику кватерниона , или просто не понимаешь что я пишу, ибо там все правильно я написал 100% !
-——————————————————————————————-

Короче решения нашлось !
Может кому пригодиться :

1 )  Сделал в кватернионе задания углов Эйлера по всем 12 возможным комбинациям , на самом деле нам нужна только одна !

+ Показать


2 ) Беру углы Эйлера с кватерниона в ортогональной последовательности от последовательности XYZ . То есть в последовательности ZXY  . И потом для обратных углов делаю так :
EulerAngle = Gyroscop.GetEulerAngleGimbalLock(IEngine::IQuaternion::RotSeq::yxz);
float invAngleX = -EulerAngle.y;
float invAngleY = -EulerAngle.z;
float invAngleZ = -EulerAngle.x;
IEngine::IQuaternion Q;
Q = Q.Euler(invAngleX, invAngleY, invAngleZ );

P>S: IEngine::IQuaternion::RotSeq::yxz == ZXY . По определённым причинам в RotSeq оси считаються с права на лева 

работает на Ура , ни каких шарнирных замков , стабилизация дает 100% точность ,,,,

#24
(Правка: 21:29) 20:37, 17 фев. 2019

werasaimon
> Скорей всего ты не понимаешь инверсную кинематику кватерниона , или просто не
> понимаешь что я пишу, ибо там все правильно я написал 100% !
Я тебе твое решение написал чуть ли не с первого поста, и все последующие только разжевываю его.

foxes
> Я бы начал плясать от имеющейся реализации IQuaternion::GetEulerAngles. Там по
> идеи надо "x и y" местами поменять чтобы получить требуемый результат.
foxes
> который работает строго на XYZ (разница лишь в последовательности поворотов
> YXZ)
foxes
> Нужно просто взять обратный поворот или обратную матрицу вращения и от этого
> получить Эйлера - вот это решение.

werasaimon
> Поэтому естествено что гироскоп не может выдавать углы вокруг XYZ ибо эти оси
> тоже вращаються Q * XYZ
werasaimon
> 1 )  Сделал в кватернионе задания углов Эйлера по всем 12 возможным комбинациям
> , на самом деле нам нужна только одна !
werasaimon
> 2 ) Беру углы Эйлера с кватерниона в ортогональной последовательности от
> последовательности XYZ . То есть в последовательности ZXY
werasaimon
> float invAngleX = -EulerAngle.y;
> float invAngleY = -EulerAngle.z;
> float invAngleZ = -EulerAngle.x;

еще раз facepalm.

werasaimon
> P>S: IEngine::IQuaternion::RotSeq::yxz == ZXY
Плюс отрицательные углы - это обратная или транспонированная матрица!

#25
(Правка: 21:55) 21:46, 17 фев. 2019

foxes
> Я тебе твое решение написал чуть ли не с первого поста, и все последующие
> только разжевываю его.
Да. Ну ты не написал что надо сами углы надо перевернуть в самом кватернионе . Ну тобишь там где мы вытягиваем углы ейлера с кватерниона . А я мысли читать не умею .! А потому что я вытягивал углы как обычно . А потом для каждого угла делал матрицу и перемножал эти матрицы  в той последовальности как ты сказал , и оно не работало !
P.S: Просто тебя надо было писать более подробно !

foxes
> werasaimon
> > float invAngleX = -EulerAngle.y;
> > float invAngleY = -EulerAngle.z;
> > float invAngleZ = -EulerAngle.x;
>
> еще раз facepalm.
Почему,  обясни аргументировано ?
P.S : Углы же меняються местами при ZXY

#26
(Правка: 22:40) 21:55, 17 фев. 2019

werasaimon
> Почему,  обясни аргументировано ?

берем тот пример который ты сам же показал от Unity. следующим образом, меняя x y местами

    Vector3 getRollTiltPan(Quaternion rotation)
    {
        Vector3 rez;
        rez.z = rotation.eulerAngles.z;
        rotation = rotation * Quaternion.Euler(0, 0, -rez.z);
        rez.y = rotation.eulerAngles.x;
        rotation = rotation * Quaternion.Euler(-rez.y, 0, 0);
        rez.x = rotation.eulerAngles.y;
        return rez;
    }

Берем некий кватернион как обратный, как я и предлагал, и сравниваем значения с "case zxy:".

getRollTiltPan(Quaternion.Inverse(transform.localRotation))

Получаем:
case zxy (прямой)
(35.6, 25.0, 25.1)
Этим значениям нужно еще обратить знак

getRollTiltPan (обратный)
(324.4, 335.0, 334.9)
Этим не нужно обращать знак, они уже равны (-35.6, -25.0, -25.1)

Еще аргументы?
Что еще более подробнее нужно было написать?

Почему меняем местами X Y для примера? - Потому что этот пример написан для XYZ, а не для YXZ. Поэтому он у тебя и не работал.

#27
22:03, 17 фев. 2019

foxes
Так легче просто поставить минус перед  углам , чем делать инверсию . Инверсия кватерниона или даже траспонированая матрица куда дороже по сложности алгоритма O(..) . Поставить минусы дешевле намного .!
P.S: А там ещё физика релетивиская , и мтарица не унитарная , ну то есть M.transpose != M.inverse .

#28
(Правка: 22:37) 22:04, 17 фев. 2019

werasaimon
> Так легче просто поставить минус перед  углам , чем делать инверсию .
Я отталкивался от имеющегося кода. А инверсия в кватернионе это еще легче q.w=-q.w.

werasaimon
> А там ещё физика релетивиская , и мтарица не унитарная , ну то есть M.transpose
> != M.inverse .
Для матрицы поворотов, без масштаба и переноса, инверсная равна транспонированной, то есть унитарная.

#29
(Правка: 22:59) 22:55, 17 фев. 2019

foxes
> Для матрицы поворотов, без масштаба и переноса, инверсная равна
> транспонированной, то есть унитарная.
Да! Ну там есть масштаб , видь в релетивской физике тело сжымаеться в доль оси скорости , то есть матрица поворота 3×3 включает не только поворот в 3D , а также сжатие тела в доль оси скорости "часть електромагнитного тензор 3×3". Поэтому матрица поворота у меня не унитарная .!
P.S : В реальном коде у меня там не кватернион, а бикватернион !

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумФизика