首页 > 解决方案 > 特征::矩阵到 Eigen::Quaterniond

问题描述

Eigen::Matrix4d transformation_matrix; //assume this is initialized
Eigen::Matrix4d &matrix = transformation_matrix;   
Eigen::Quaterniond quat;
quat(matrix);

我试图从变换矩阵中找到一个旋转矩阵。Eigen::Quaterniondlibrary中已经有一个 API toRotationMatrix。但是要使用它,我需要一个 4x4 Quaterniond(如果这是错误的,请更正)。

获取编译错误为

error: no match for call to ‘(Eigen::Quaterniond {aka Eigen::Quaternion<double>}) (const Matrix4d&)’

请帮忙。 按照此链接进行转换

Eigen::Quaterniond quat;
quat(matrix);    

初始化时Quaterniond,我得到一个不同的错误:

Eigen::internal::quaternionbase_assign_impl<Eigen::Matrix<double, 4, 4>, 4, 4>’ used in nested name specifier
   internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());

标签: c++matrixeigen3

解决方案


你在这里做什么:

Eigen::Quaterniond quat;
quat(matrix);

正在创建一个四元数,然后operator()用矩阵调用它。但据我所知,四元数甚至没有operator()任何东西:文档

看看你提到的问题中 ggael 的第一个答案。您可以使用四元数的构造函数:

Eigen::Quaterniond quat(matrix);

或者它的赋值运算符:

Eigen::Quaterniond quat;
quat = matrix;

两者都是为矩阵定义的。但是,我不能告诉你,它们是否适用于 4x4 矩阵。如果不提取矩阵的 3x3 旋转部分。

编辑:

在我的计算机上进行快速测试后,您无法将 4x4 矩阵传递给四元数。要么使用 aEigen::Matrix3d代替,要么执行以下操作:

Eigen::Quaterniond quat(matrix.topLeftCorner<3, 3>());

编辑2:

我试图从变换矩阵中找到一个旋转矩阵。Eigen::Quaterniond 库中已经有一个 API toRotationMatrix。但要使用它,我需要一个 4x4 四元数(如果这是错误的,请更正)。

嗯,这并不正确。可以将旋转矩阵转换为四元数,将四元数转换为旋转矩阵。在 4x4 矩阵中,旋转部分包含在左上角的 3x3 子矩阵中。但是,在一般的变换矩阵中,这部分不一定只是旋转。它还可以包含其他转换,例如缩放。在这种情况下,我不确定是否可以直接将其转换为四元数而无需先提取旋转部分。我对此表示怀疑,但我不确定。但是,如果你有一个通用的变换矩阵,你可以通过计算它的行​​列式来测试上面的 3x3 部分是否是纯旋转。如果为 1,则表示纯旋转。如果不是这种情况,请查看此链接计算旋转部分。如果您的目标是仅提取 4x4 矩阵的旋转,则根本不需要四元数。旋转矩阵和四元数只是同一事物的不同表示。


推荐阅读