我注意到在使用四元数计算时,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的位置是正确的。
谢谢
答案 0 :(得分:1)
使用Matlab,您正在计算direction cosine matrix。它确实是rotation matrix,就像你用Eigen C ++计算的那样,因此也是unitary(所有行和所有列的范数都是1,并且形成一组垂直向量)。
现在,碰巧酉矩阵的倒数等于其共轭转置(*),即:
U * U = UU * = I
换句话说,必须发生的是Matlab的约定与Eigen C ++的约定相反。
来自Wikipedia:
点P的坐标可能会因坐标系CS的旋转(别名)或点P的旋转(alibi)而发生变化。
在大多数情况下,模糊度的影响等同于旋转矩阵求逆的效果(对于这些正交矩阵等效矩阵转置)。