Eigen:矩阵转四元数与反向操作结果不同

4

我使用Eigen库将矩阵转换为四元数,但当我将其中一个矩阵转换为四元数并重新转换回去时,它变成了另一个矩阵,即单位矩阵。我使用的旋转矩阵是从变换矩阵分解而来的。

    Eigen::Matrix3f R3d = R.topLeftCorner<3,3>();
    *Rquat = R3d;

    R3d = (*Rquat).normalized().toRotationMatrix();

出现这个问题的原因可能是什么? 这是转换为四元数之前的矩阵

以及这是从四元数转换回来的矩阵


1
您传递的矩阵是一个反射矩阵,因此无法从中获取有效的四元数。不过,您使用的Eigen版本是哪个? - chtz
我正在使用Eigen 3。 - JOYD
那么版本3.0?它已经被弃用一段时间了... - chtz
1
请确保源旋转矩阵是真正的旋转矩阵。 - minorlogic
2个回答

2

刚刚检查了Eigen矩阵转四元数的实现。它基于Ken Shoemake的“四元数微积分和快速动画”。

当分析源代码时,可以看到它假设矩阵确实是旋转矩阵(或接近旋转矩阵)。事实上,所有对称矩阵且M.trace()>0都将导致一个(缩放后的)单位四元数。如果您希望在无效旋转矩阵的情况下获得其他结果,则需要实现自己的转换方法。


1
正如之前的答案和评论所建议的那样,单位四元数只能表示3D旋转矩阵。
要使矩阵成为旋转矩阵,它必须位于SO(3)中,即特殊正交群,其定义为:

so3

所以您需要检查矩阵乘以其转置是否等于单位矩阵,以及它的行列式是否等于一(而不是减一,否则它只属于正交群,而不属于它的子群——特殊正交群)。
此时,用于从矩阵创建四元数的Eigen函数未检查传递的矩阵是否确实是旋转矩阵。可能需要修复或警告,因为这可能会导致意外行为,如您所描述的那样。
我发现自己处于同样的位置,因为我试图从基向量形成一个变换矩阵(由三个基向量组成),仅当该基是直接的时才有效。如果不是直接的,则从这个基向量到标准基(反之亦然)的转换不是旋转。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接