【问题标题】:Eigen::Matrix<double,4,4> to Eigen::QuaterniondEigen::Matrix<double,4,4> 到 Eigen::Quaterniond
【发布时间】:2020-03-19 13:32:50
【问题描述】:
Eigen::Matrix4d transformation_matrix; //assume this is initialized
Eigen::Matrix4d &matrix = transformation_matrix;   
Eigen::Quaterniond quat;
quat(matrix);

我正在尝试从变换矩阵中找到一个旋转矩阵。 Eigen::QuaterniondtoRotationMatrix 中已经有一个 API。但要使用它,我需要一个 4x4 Quaterniond(如果有误,请更正)。

得到编译错误

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

请帮忙。 Followed this link for conversion

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++ matrix eigen3


【解决方案1】:

你在这里做什么:

Eigen::Quaterniond quat;
quat(matrix);

正在创建一个四元数,然后用一个矩阵将其称为operator()。但据我所知,四元数甚至没有任何 operator()documentation

看看question you referred to中ggael的第一个答案。您可以使用四元数的构造函数:

Eigen::Quaterniond quat(matrix);

或者是赋值运算符:

Eigen::Quaterniond quat;
quat = matrix;

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

编辑:

在我的计算机上进行快速测试后,您无法将 4x4 矩阵传递给四元数。请改用Eigen::Matrix3d 或执行以下操作:

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

编辑 2:

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

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

【讨论】:

  • 更正了初始化。做这个 Eigen::Quaterniond quat;季铵盐(矩阵);我在嵌套名称说明符 internal::quaternionbase_assign_impl::run(*this, xpr.derived());
  • 看看我的编辑。该错误与不支持 4x4 矩阵这一事实有关。提取旋转部分,如编辑所示。
  • 当心,有一个错误,因为我在另一台计算机上写了我的答案,而不是我测试代码的那台计算机。现在编辑应该没问题了。
  • 您好,感谢您的回答。我能够将矩阵转换为四元数。是的,你是对的。我想获得旋转矩阵,但它带有缩放因子,因此我没有得到正确的结果。您提到的链接非常好,但我无法理解。如果您能分享一些与此相关的其他链接或代码,那就太好了。
  • 链接中“imallett”提供的答案尽可能简单。不知道如何更好地解释它。我不知道你在挣扎什么,但也许这个链接可能会对你有所帮助:brainvoyager.com/bv/doc/UsersGuide/CoordsAndTransforms/… - 它解释了 3d 空间的 4x4 变换矩阵是如何组成的以及为什么。阅读并理解这一点后,请重新访问我的答案中的链接。那应该就清楚多了。
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多