【问题标题】:Eigen C++; Euclidean Transformation with Eigen::Transform特征 C++;欧几里得变换与 Eigen::Transform
【发布时间】:2018-01-22 13:56:31
【问题描述】:

给定一个由旋转矩阵 3x3 R 和一个 3 维平移向量 t 进行的欧几里得变换,欧几里得变换如何 使用Eigen::Transform 实现?

X = R * X + t

我目前的方法不起作用:

Eigen::Transform<Type, 3, Eigen::Projective>  transformation;
...

Eigen::AngleAxis           rotation(R);
Eigen::Translation<Type,3> translation(t);

transformation = translation * rotation;

现在,我想将它按列应用于更大的向量集,即 一个 3xN 矩阵 X 其中每一列代表一个向量 转换,即

 X = transformation * X

但是,这不起作用并产生一个断言:

test-depth.exe: /usr/include/eigen3/Eigen/src/Core/Product.h:133: Eigen::Product<Lhs, Rhs, Option>::Product(const Lhs&, const Rhs&) [with _Lhs = Eigen::Matrix<double, 4, 4>; _Rhs = Eigen::Matrix<double, -1, -1>; int Option = 0; Eigen::Product<Lhs, Rhs, Option>::Lhs = Eigen::Matrix<double, 4, 4>; Eigen::Product<Lhs, Rhs, Option>::Rhs = Eigen::Matrix<double, -1, -1>]: Assertion `lhs.cols() == rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.

【问题讨论】:

  • X 应该是同类型的 4*1 向量
  • 您的意思是,在内部,它会生成一个 4x3 矩阵来组合旋转和平移。但这真的会迫使我生成一个四维元素吗?有没有一种优雅的方法?
  • 了解齐次坐标。顺便说一句,你真的需要Projective而不是Affine吗?

标签: c++ geometry linear-algebra eigen eigen3


【解决方案1】:

MBo 的评论是对的,您使用了一个 Projective 变换,该变换涉及要使用的全齐次坐标。如果您想在后台使用3x4 矩阵,则需要使用Affine 转换或AffineCompact

【讨论】:

  • 我希望,有一种方法可以在要转换的向量中使用第四维。它始终为“1”。我认为,它可以在内部有效地添加。
  • 在 3D 中,射影变换由任意 4x4 矩阵表示,因此输出的第 4 个分量无法猜测,我们不想默默执行透视除法,也可以是除以零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2021-10-17
  • 2013-12-08
  • 2011-07-30
  • 2021-04-03
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多