在 Eigen 中显示仿射变换
Displaying an affine transformation in Eigen
我正在尝试做一些简单的事情:
std::cout << e << std::endl;
其中 e
的类型为 Eigen::Affine3d
。但是,我收到无用的错误消息,例如:
cannot bind 'std::ostream {aka std::basic_ostream<char>}'
lvalue to 'std::basic_ostream<char>&&'
解释的原因很有帮助here,但答案不适用。
official documentation 很简短,仅暗示 Affine3d 和 Affine3f 对象是矩阵。 std::cout
可以毫无问题地打印本征矩阵和向量。那么问题是什么?
令人讨厌的是,<<
运算符没有为 Affine
对象定义。您必须调用 matrix()
函数来获取可打印表示:
std::cout << e.matrix() << std::endl;
如果您不喜欢齐次矩阵:
Eigen::Matrix3d m = e.rotation();
Eigen::Vector3d v = e.translation();
std::cout << "Rotation: " << std::endl << m << std::endl;
std::cout << "Translation: " << std::endl << v << std::endl;
希望有人能省去几分钟的烦恼。
PS:Another lonely SO question 顺便提到了这个解决方案。
老实说,我更愿意重载流运算符。这使得重复使用更加方便。你可以这样做
std::ostream& operator<<(std::ostream& stream, const Eigen::Affine3d& affine)
{
stream << "Rotation: " << std::endl << affine.rotation() << std::endl;
stream << "Translation: " << std::endl << affine.translation() << std::endl;
return stream;
}
int main()
{
Eigen::Affine3d l;
std::cout << l << std::endl;
return 0;
}
注意 l 未初始化
我正在尝试做一些简单的事情:
std::cout << e << std::endl;
其中 e
的类型为 Eigen::Affine3d
。但是,我收到无用的错误消息,例如:
cannot bind 'std::ostream {aka std::basic_ostream<char>}'
lvalue to 'std::basic_ostream<char>&&'
解释的原因很有帮助here,但答案不适用。
official documentation 很简短,仅暗示 Affine3d 和 Affine3f 对象是矩阵。 std::cout
可以毫无问题地打印本征矩阵和向量。那么问题是什么?
令人讨厌的是,<<
运算符没有为 Affine
对象定义。您必须调用 matrix()
函数来获取可打印表示:
std::cout << e.matrix() << std::endl;
如果您不喜欢齐次矩阵:
Eigen::Matrix3d m = e.rotation();
Eigen::Vector3d v = e.translation();
std::cout << "Rotation: " << std::endl << m << std::endl;
std::cout << "Translation: " << std::endl << v << std::endl;
希望有人能省去几分钟的烦恼。
PS:Another lonely SO question 顺便提到了这个解决方案。
老实说,我更愿意重载流运算符。这使得重复使用更加方便。你可以这样做
std::ostream& operator<<(std::ostream& stream, const Eigen::Affine3d& affine)
{
stream << "Rotation: " << std::endl << affine.rotation() << std::endl;
stream << "Translation: " << std::endl << affine.translation() << std::endl;
return stream;
}
int main()
{
Eigen::Affine3d l;
std::cout << l << std::endl;
return 0;
}
注意 l 未初始化