hitimo
hitimo

Reputation: 31

Eigen C++ / Matlab quaternion and rotation matrix mismatch

I noticed that there's a difference in Eigen C++ and Matlab when calculating with quaternions. In Eigen C++, the code

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;

gives the rotation matrix:

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

In Matlab (which uses wxyz), however, I get the following result:

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

which is the transpose! Can somebody explain me what is going on? I made sure that the positions of wxyz are correct.

Thank you

Upvotes: 3

Views: 2033

Answers (1)

gsimard
gsimard

Reputation: 643

With Matlab, you are calculating the direction cosine matrix. It is indeed a rotation matrix like the one you are calculating with Eigen C++, and as such is also unitary (all rows and all columns have a norm of 1 and either form a perpendicular set of vectors).

Now, it so happens that the inverse of a unitary matrix is equal to its conjugate transpose (*), i.e.:

U*U = UU* = I

In other words, what must be happening is that the convention of Matlab is the opposite of that of Eigen C++.

From Wikipedia:

The coordinates of a point P may change due to either a rotation of the coordinate system CS (alias), or a rotation of the point P (alibi).

In most cases the effect of the ambiguity is equivalent to the effect of a rotation matrix inversion (for these orthogonal matrices equivalently matrix transpose).

Upvotes: 1

Related Questions