Eigen C ++ / Matlab四元数和旋转矩阵不匹配

时间:2014-08-15 20:04:40

标签: c++ matlab eigen quaternions

我注意到在使用四元数计算时,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的位置是正确的。

谢谢

1 个答案:

答案 0 :(得分:1)

使用Matlab,您正在计算direction cosine matrix。它确实是rotation matrix,就像你用Eigen C ++计算的那样,因此也是unitary(所有行和所有列的范数都是1,并且形成一组垂直向量)。

现在,碰巧酉矩阵的倒数等于其共轭转置(*),即:

U * U = UU * = I

换句话说,必须发生的是Matlab的约定与Eigen C ++的约定相反。

来自Wikipedia

  

点P的坐标可能会因坐标系CS的旋转(别名)或点P的旋转(alibi)而发生变化。

     

在大多数情况下,模糊度的影响等同于旋转矩阵求逆的效果(对于这些正交矩阵等效矩阵转置)。