如何在本征中表示紧致等距变换矩阵
How to represent Compact isometry transformation matrix in Eigen?
我有一堆等距[R | t]变换矩阵,即它们是三维刚性变换。目前我将它们存储为本征仿射变换,以紧凑形式表示,例如Eigen::AffineCompact3d
,它不存储冗余的最后一行[0 0 0 1]。
我也知道有一个Eigen::Isometry3d
,我猜是Transform<double, 3, AffineCompact, Isometry>
的类型定义。
我是在等距之后,因为逆变换比一般仿射逆便宜得多(转置)。我也知道我可以传递一个提示,当我使用逆()作为affine_mat.inverse(Eigen::Isometry);
但是我想获得等距逆行为,而不需要每次手动传递提示。换句话说,我想知道,复制Eigen::IsometryCompact3d
行为的最佳方法是什么,这在特征API中令人惊讶地缺席?
为了表示等距,我目前使用扭转。这个参数化可以用6个元素的向量来描述。
要来回转换为标准齐次矩阵公式,您将需要基于log()和exp()的几个函数(因此转换将是一个缓慢的操作)。
如果您在两个公式之间来回切换没有性能限制(或者您很少这样做),或者如果您想利用扭转的特性(例如在数值优化中),则此解决方案是有利的
我知道这个问题有点老了,你现在可能已经找到了解决方案。但这可能会引起其他也有这个问题的人的兴趣。
第一件事,你写:
我追求等距,因为逆变换更便宜(转置)>小于一般仿射逆。
澄清一下:不能只是转置得到逆:
/*
| R t|
T = |0 0 0 1|
| 0|
T' =| R' 0| not an affine transformation!
| 0|
| t 1|
// inverse of Isometric matrix without actual matrix inversion
T^(-1) = | R' -R'*t|
|0 0 0 1 |
*/
很遗憾,你可以定义你自己的函数:
void invertAffineCompact3d(Eigen::AffineCompact3d &m){
m.linear() = m.linear().transpose();
m.translation() = -m.linear()*m.translation();
}
并命名为:
Eigen::AffineCompact3d T1 = ...
invertAffineCompact3d(T1);
或者,如果您想要所有类型的一个解决方案:
template<size_t m, size_t n, size_t x, size_t y, typename Derived>
Eigen::Block<Derived, m, n>
getSubmatrix(MatrixBase<Derived>& data)
{
return Eigen::Block<Derived, m, n>(data.derived(), x, y);
}
template<typename Derived>
void invertAffine3d(Eigen::MatrixBase<Derived> &m){
getSubmatrix<3,3,0,0>(m).transposeInPlace();
getSubmatrix<3,1,0,3>(m) = -getSubmatrix<3,3,0,0>(m)*getSubmatrix<3,1,0,3>(m);
}
并命名为:
Eigen::AffineCompact3d T2 = ...
invertAffine3d(T2.matrix());
Eigen::Affine3f T3 = ...
invertAffine3d(T3.matrix());
Eigen::Isometry3d T4 = ...
invertAffine3d(T4.matrix());
如果你真的很喜欢你可以扩展MatrixBase使用EIGEN_MATRIXBASE_PLUGIN
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 int 表示浮点除法 C++
- 离散傅里叶变换中复数的c++表示
- 如何在本征中表示紧致等距变换矩阵