本征:矩阵到四元数和后面有不同的结果
Eigen: matrix to quaternion and back have different result
我使用 Eigen 库将矩阵转换为四元数,但是当我将其中一个矩阵转换为四元数并将其烧回时,它变成了另一个矩阵,即单位矩阵。我用的旋转矩阵是从一个变换矩阵分解出来的
Eigen::Matrix3f R3d = R.topLeftCorner<3,3>();
*Rquat = R3d;
R3d = (*Rquat).normalized().toRotationMatrix();
什么可能导致这个问题?
This is the matrix before change to quaternion
和This is the matrix when I turn it back form the quaternion
刚刚检查了 Eigen's matrix to quaternion conversion 的实现。它基于 Ken Shoemake 的 "Quaternion Calculus and Fast Animation"。
正如在分析源代码时所见,这假设矩阵确实是一个旋转矩阵(或接近一个)。事实上,所有 M.trace()>0
的对称矩阵都会产生一个(缩放的)恒等四元数。如果您对无效旋转矩阵有任何其他期望,则需要实现自己的转换方法。
正如之前的答案和评论所建议的那样,单位四元数只能表示 3D 旋转矩阵。
要使矩阵成为旋转矩阵,它必须位于 SO(3),the special orthogonal group,其定义为:
%20%3D%20%5C%7B%20M%5Cin%5Cmathcal%7BM%7D_%7B33%7D(%5Cmathbb%7BR%7D)%5C%20%7C%20%5C%20M%5C%3AM%5ET%3DId%2C%5C%3A%20det(M)%20%3D%2B1%20%5C%7D)
所以你需要检查矩阵乘以它的转置是否等于恒等式以及它的行列式是否等于一(而不是减一,否则它只在 orthogonal group 中,而不在它的子组中, 特殊正交)。
此时,用于从矩阵创建四元数的Eigen function不会检查传递的矩阵是否确实是旋转矩阵。可能需要修复或警告,因为这可能会导致意外行为,如您所述。
我发现自己处于相同的位置,因为我试图通过改变基矩阵(由三个基向量形成)来形成四元数,并且它仅在所述基是直接基时才有效。如果不是直接的,从这个基础到 standard basis 的转换(反之亦然)不是旋转。
我使用 Eigen 库将矩阵转换为四元数,但是当我将其中一个矩阵转换为四元数并将其烧回时,它变成了另一个矩阵,即单位矩阵。我用的旋转矩阵是从一个变换矩阵分解出来的
Eigen::Matrix3f R3d = R.topLeftCorner<3,3>();
*Rquat = R3d;
R3d = (*Rquat).normalized().toRotationMatrix();
什么可能导致这个问题? This is the matrix before change to quaternion
和This is the matrix when I turn it back form the quaternion
刚刚检查了 Eigen's matrix to quaternion conversion 的实现。它基于 Ken Shoemake 的 "Quaternion Calculus and Fast Animation"。
正如在分析源代码时所见,这假设矩阵确实是一个旋转矩阵(或接近一个)。事实上,所有 M.trace()>0
的对称矩阵都会产生一个(缩放的)恒等四元数。如果您对无效旋转矩阵有任何其他期望,则需要实现自己的转换方法。
正如之前的答案和评论所建议的那样,单位四元数只能表示 3D 旋转矩阵。
要使矩阵成为旋转矩阵,它必须位于 SO(3),the special orthogonal group,其定义为:
所以你需要检查矩阵乘以它的转置是否等于恒等式以及它的行列式是否等于一(而不是减一,否则它只在 orthogonal group 中,而不在它的子组中, 特殊正交)。
此时,用于从矩阵创建四元数的Eigen function不会检查传递的矩阵是否确实是旋转矩阵。可能需要修复或警告,因为这可能会导致意外行为,如您所述。
我发现自己处于相同的位置,因为我试图通过改变基矩阵(由三个基向量形成)来形成四元数,并且它仅在所述基是直接基时才有效。如果不是直接的,从这个基础到 standard basis 的转换(反之亦然)不是旋转。