【问题标题】:Precision getting lost when transforming the PCL pointcloud转换 PCL 点云时精度丢失
【发布时间】:2019-08-12 17:49:10
【问题描述】:

我正在使用来自 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);

原云

变形的云

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

任何有关这方面的信息都会有所帮助。

【问题讨论】:

    标签: matrix point-cloud-library coordinate-transformation lidar


    【解决方案1】:

    问题在于使用的偏移范围。 pcl::PointXYZ 将点作为浮点数,因此当提供超出范围的此类偏移时,它会将结果四舍五入,从而导致精度损失。一个明显的解决方案是尽可能标准化范围。另一种解决方案是在 PCL 中添加自定义点类型。 PCL 提供了一个很好的document

    【讨论】:

    【解决方案2】:

    您可以通过精确输入直接使用 PCDWriter 类。

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

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

    【讨论】:

    • 我也尝试使用上面链接中的代码,发现 PCL 通常无法处理具有双精度存储的自定义点云。我发现的第一件事是转换不起作用。可能还有很多其他组件不起作用。相反,我通过减去平均值将我的数据转换为单精度浮点表示。
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多