转换 PCL 点云时精度丢失

Precision getting lost when transforming the PCL pointcloud

我正在使用 PCL 中的 this 来转换我拥有的点云。基本上,我只是通过一些偏移来翻译云。

问题是我在应用此转换后失去了精度。下图更清楚。

我看到只有当我的偏移量值很大(>6 位)时才会发生这种情况,云会由此平移。

下面是使用 pcl 库的代码

 Eigen::Matrix4d translationMatrix = Eigen::Matrix4d::Identity();

 //translation
 translationMatrix(0,3) = 1000000;
 translationMatrix(1,3) = 1000000;

 pcl::PointCloud<pcl::PointXYZ>::Ptr translatedCloud;
 translatedCloud.reset(new pcl::PointCloud<pcl::PointXYZ>());

 pcl::transformPointCloud(*cloud,*translatedCloud,translationMatrix);

 pcl::io::savePCDFileASCII ("translatedCloud.pcd",*translatedCloud);

原云

变形的云

我怀疑问题可能出在所使用的数据类型的范围上。

有关此的任何信息都会有所帮助。

问题在于使用的偏移量范围。 pcl::PointXYZ 有浮点数,所以当提供超出范围的偏移量时,它会四舍五入结果,这会导致精度损失。一个明显的解决方案是尽可能标准化范围。另一种解决方案是在 PCL 中添加自定义点类型。 PCL.

对此提供了很好的 document

您可以直接使用PCDWriter class精确输入。

按照建议,在 PCL 中创建了自定义点类型并以 ASCII 格式保存。只有 ASCII 格式具有这种精度输入。不知道其他格式。

注意: 对于这个新的双类型自定义点云,可用的 PCL 工具将不起作用,因为 PCL 使用浮点数。 更多信息:Link