我正在处理一些浊点数据pcl
。我想用给定的齐次矩阵变换云,然后用该矩阵的逆矩阵将其变换回来。这是我所做的:
向前转变
// transform
// 0.995965 -0.00315886 -0.0074089 0
// 0.00315886 0.995992 -1.17255e-05 0
// 0.0074089 -1.17255e-05 0.99597 0
// 0 0 0 1
pcl::transformPointCloud(*cloudPtr, *cloudTransformed, transform);
变回
Eigen::Matrix4f invtransform = transform;
invtransform.block<3,3>(0,0).transposeInPlace(); // take effect in place
invtransform.block<3,1>(0,3) = -invtransform.block<3,3>(0,0)*invtransform.block<3,1>(0,3);
// here get invtransform
// 0.995965 0.00315886 0.0074089 -0
// -0.00315886 0.995992 -1.17255e-05 0
// -0.0074089 -1.17255e-05 0.99597 0
// 0 0 0 1
pcl::transformPointCloud(*cloudptr, *cloudback, invtransform);
不幸的是,我在cloudback中得到了错误的结果。但是当我尝试以下代码来计算矩阵的逆时,它可以工作:
// the transform gives
// 0.995965 -0.00315886 -0.0074089 0
// 0.00315886 0.995992 -1.17255e-05 0
// 0.0074089 -1.17255e-05 0.99597 0
// 0 0 0 1
Eigen::Matrix4f invtransform = transform.inverse();
// now invtransofrom gives
// 1.00399 0.0031843 0.00746857 -0
// -0.0031843 1.00401 -1.18674e-05 0
// -0.00746857 -1.18674e-05 1.00399 -0
-0 0 -0 1
pcl::transformPointCloud(*cloudPtr, *cloudback, invtransform);
- 为什么它们是不同的结果,而前者似乎是错误的?
- 齐次矩阵的逆转换刚体不计算如下:
R_inv = R.转置;
t_inv = -1.0 * R_inv * t
其中 R an t 代表齐次矩阵的旋转和平移部分。