0

我正在处理一些浊点数据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);
  1. 为什么它们是不同的结果,而前者似乎是错误的?
  2. 齐次矩阵的逆转换刚体不计算如下:

R_inv = R.转置;

t_inv = -1.0 * R_inv * t

其中 R an t 代表齐次矩阵的旋转和平移部分。

4

0 回答 0