我使用特征库将矩阵转换为四元数,但是当我将其中一个矩阵转换为四元数并将其烧回时,它变成了另一个矩阵,它是单位矩阵。我使用的旋转矩阵是从变换矩阵中分解出来的。
Eigen::Matrix3f R3d = R.topLeftCorner<3,3>();
*Rquat = R3d;
R3d = (*Rquat).normalized().toRotationMatrix();
可能导致此问题的原因是什么? This is the matrix before change to quaternion
答案 0 :(得分:1)
刚检查了Eigen's matrix to quaternion conversion的实施情况。它基于Ken Shoemake的“Quaternion Calculus and Fast Animation”。
正如人们在分析源时所看到的那样,这假定矩阵确实是一个旋转矩阵(或接近一个)。事实上,所有具有M.trace()>0
的对称矩阵都将产生(缩放的)同一性四元数。如果您对无效旋转矩阵有任何其他要求,则需要实现自己的转换方法。
答案 1 :(得分:1)
正如先前的答案和评论所建议的那样,单位四元数只能表示3D旋转矩阵。
要使矩阵成为旋转矩阵,它必须位于SO(3)the special orthogonal group中,其定义为:
因此,您需要检查矩阵乘以其转置乘以是否等于同一性,以及行列式是否等于一(而不是减一,否则,它仅位于orthogonal group中,而不位于其子组中,即特殊正交)。
这时,用于从矩阵创建四元数的Eigen function不会检查传递的矩阵是否确实是旋转矩阵。如您所描述的,可能需要修复或警告,因为这可能导致意外的行为。
我发现自己处于同一位置,是因为我试图从变化的基矩阵(由三个基向量组成)形成四元数,并且仅在所述基是直接基时才起作用。如果不是直接的,则从此基础到standard basis的转换(反之亦然)不是旋转。