Несоответствие кватерниона Eigen C++/Matlab и матрицы вращения

Я заметил, что есть разница в Eigen C++ и Matlab при расчетах с кватернионами. В Eigen C++ код

Eigen::Quaterniond q;
q.x() = 0.270598;
q.y() = 0.653281;
q.z() = -0.270598;
q.w() = 0.653281;

Eigen::Matrix3d R = q.normalized().toRotationMatrix();
std::cout << "R=" << std::endl << R << std::endl;

дает матрицу вращения:

R=
-2.22045e-16     0.707107     0.707107
           0     0.707107    -0.707107
          -1            0 -2.22045e-16

Однако в Matlab (который использует wxyz) я получаю следующий результат:

q =

    0.6533    0.2706    0.6533   -0.2706

>> quat2dcm(q)

ans =
   -0.0000         0   -1.0000
    0.7071    0.7072         0
    0.7072   -0.7071   -0.0000

что такое транспонирование! Может кто-нибудь объяснить мне, что происходит? Я убедился, что позиции wxyz правильные.

Спасибо


person hitimo    schedule 15.08.2014    source источник


Ответы (1)


С помощью Matlab вы вычисляете матрицу направленного косинуса. Это действительно матрица вращения, подобная той, которую вы вычисляете с помощью Eigen C++, и поэтому она также унитарный (все строки и все столбцы имеют норму 1 и либо образуют перпендикулярный набор векторов) .

Так получилось, что обратная унитарная матрица равна ее сопряженной транспонированной (*), то есть:

U*U = UU* = I

Другими словами, что должно происходить, так это то, что соглашение Matlab противоположно соглашению Eigen C++.

Из Википедии:

Координаты точки P могут измениться либо за счет поворота системы координат CS (псевдоним), либо за счет поворота точки P (алиби).

В большинстве случаев эффект неоднозначности эквивалентен эффекту обращения матрицы вращения (для этих ортогональных матриц эквивалентно транспонирование матрицы).

person gsimard    schedule 18.08.2014