Проблема при восстановлении поворота по углам Эйлера

У меня есть матрица вращения R:

R=[[-0.22247682, -0.32863132, -0.91788099],
   [-0.01426572, -0.94027818,  0.34010798],
   [-0.9748336 ,  0.08876037,  0.20450194]]

и я хочу разложить это на три вращения, р Z ( α ) р Икс ( β ) р Z ( γ ) , где я рассматриваю повороты по часовой стрелке. Затем матрица вращения в терминах этих углов Эйлера определяется выражением

р "="

[ потому что α потому что γ грех α потому что β грех γ грех γ потому что α грех α потому что β потому что γ грех α грех β грех α потому что γ + грех γ потому что α потому что β грех α грех γ + потому что α потому что β потому что γ потому что α грех β грех β грех γ грех β потому что γ потому что β ]

Затем я вычисляю β "=" арккос ( р 33 ) "=" 1,36 , α "=" арктический ( р 13 / р 23 ) "=" 1,22 , и γ "=" арктический ( р 31 / р 32 ) "=" 1,48 . В качестве двойной проверки я восстанавливаю матрицу R по этим углам Эйлера и нахожу следующее:

R'=[[ 0.22247682,  0.32863132, -0.91788099],
    [ 0.01426572,  0.94027818,  0.34010798],
    [ 0.9748336 , -0.08876037,  0.20450194]])

Все перепроверил, но не могу найти в чем проблема. Что я мог упустить?

Редактировать: оказывается, проблема с транспонированием была связана с тем, что в моем коде Python была проблема с индексацией. Однако проблемы со знаками все еще сохраняются. Я обновил матрицу R'выше.

Вы уверены в согласованности для направления CW/CCW?
@GCab Думаю, да, я вывел формулу для перепроверки. Но в любом случае решение углов Эйлера исходит из матрицы, которую я написал выше.
р "=" р Т , что говорит о том, что вы получили что-то задом наперед в своих вычислениях.
Использовать а т а н 2 ( у , Икс ) функция вместо этого.
@ ja72 Как определено в C/C++? Что он делает иначе, чем arctan numpy?
@sodiumnitrate, поэтому я привел аргументы. Иногда бывает atan2(dx, dy)и иногда atan2(dy, dx).

Ответы (2)

Я подтвердил выражение матрицы вращения, но я бы извлекал углы немного иначе, чем вы.

  • γ "=" а т а н 2 ( р 31 , р 32 ) "=" 1.4799948857740634
  • β "=" а т а н 2 ( р 31 2 + р 32 2 , р 33 ) "=" 1.3648414591977873
  • α "=" а т а н 2 ( р 13 , р 23 ) "=" 1,9256476493782756

где atan2(dy,dx)- арктангенс, охватывающий всю единичную окружность.

Реконструкция, таким образом,

R = RZ(1.2159450042115176)*RX(1.3648414591977873)*RZ(-1.4799948857740634)

1) Ваш расчет углов правильный, если не считать неопределенности в знаках.

От потому что β ты можешь вычесть ± β . От загар α ты можешь вычесть ( α , α π , α + π ) , и то же самое для γ .

Затем вы должны проверить предположения с другими элементами исходной матрицы.

Принимая β "=" 1,36 затем потому что β и грех β являются положительными. От р [ 1 , 3 ] и р [ 2 , 3 ] затем следует, что потому что α и грех α оба будут отрицательными: поэтому α "=" 1,22 π .

Для γ "=" 1,48 признаки р [ 3 , 1 ] и р [ 3 , 2 ] верны.

2) Матрицы элементарного вращения, определенные в соответствии с этой статьей Википедии, поэтому предварительно умножаются, в частности, против часовой стрелки и вправо, являются

р Икс ( α ) "=" ( 1 0 0 0 потому что α грех α 0 грех α потому что α ) р у ( β ) "=" ( потому что β 0 грех β 0 1 0 грех β 0 потому что β ) р г ( γ ) "=" ( потому что γ грех γ 0 грех γ потому что γ 0 0 0 1 )

3) Применяя эти матрицы и скорректированные углы, я получаю, что

р г ( α ) р Икс ( β ) р г ( γ )
правильно возвращает начальную матрицу.

Результат, который вы получаете, помимо знаков, представляет собой транспонированную исходную матрицу, что означает, что, вероятно, вы используете неправильные элементарные матрицы.

Спасибо. Разве не должно быть двух случаев: { α , α + π } ?
@sodiumnitrate: это зависит от соглашения, принятого для диапазона углов: я рассматриваю π < α π . Кстати, вы узнали, почему вы получаете транспонировать?
Не должен потому что ( α π ) "=" потому что ( α + π ) потому что потому что ( Икс ) является 2 π -периодический? Транспонирование было ошибкой индексации в моем коде Python, где я назначал элементы матрицы.
@sodiumnitrate: конечно потому что ( α π ) "=" потому что ( α + π ) . Сейчас арккос ( α ) (обычно) восстанавливается с 0 α π верно ? Если потому что ( α ) "=" 1 / 2 и грех ( α ) < 0 какой угол вы берете, 4 / 3 π или 2 / 3 π ? как сказано выше, я следую конвенции π < α π