1

我正在开发一个使用 .las 激光雷达文件的项目。

我google了一下,发现PDAL可以用来把.las转换成.pcd文件,这样我就可以使用PCL库了。

我使用 PDAL 将文件从 .las 转换为 .pcd。

当我尝试使用以下代码读取 pcd 文件时:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("C:/Users/hedey/OneDrive/Documents/Research_papers/STDF/10_4231_MFQF-Q141/I-65/LiDAR/RoadSurface/PCD/20180524_I65_NB_RoadSurface_7_53.5.pcd", *cloud) == -1) //* load the file
{
    PCL_ERROR("Couldn't read file test_pcd.pcd \n");
    return (-1);
}
std::cout << "Loaded "
    << cloud->width * cloud->height
    << " data points from test_pcd.pcd with the following fields: "
    << std::endl;
for (const auto& point : *cloud)
    std::cout << "    " << point.x
    << " " << point.y
    << " " << point.z << std::endl;
return (0);

结果如下,我很惊讶转换后的文件中所有的坐标都是(0,0,0)。这可能有什么问题? 在此处输入图像描述

4

1 回答 1

1

我建议您仔细查看PCD 编写器文档,以获取有关此特定转换的一些有用的指示。

这里的问题是,虽然双精度浮点数是有效的 PCD,但 PCL 的默认点类型不支持它们。您可以手动编辑已转换的 PCD 文件,将 x、y 和 z 维度的大小从 8 更改为 4。或者您可以重新运行pdal translate,确保在选择要转换的字段时设置数据类型和精度与order选项。一个例子看起来像

pdal translate input.las output.pcd --writers.pcd.order="X=Float:2,Y=Float:2,Z=Float:2"

此外,您可能不需要像“ScanAngleRank”这样的额外字段。如果这样做,则需要提供 PCL 点类型支持才能单独处理它们。要删除额外的字段,您可以追加

--writers.pcd.keep_unspecified=false

到之前建议的命令。

最后要记住的是,处理像 UTM 中的大坐标(它看起来是你的)并将它们存储在单精度中可能会导致一些精度损失。您应该考虑在转换为 PCD 之前偏移数据(可能使用 PDAL 的转换过滤器)。

于 2020-10-29T14:57:25.520 回答