从 .las 文件中读取点云

Reading Point Clouds from .las files

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

我用谷歌搜索发现 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)。这可能有什么问题?

我建议您仔细查看 PCD writer documentation 以获取针对此特定转换的一些有用指示。

这里的问题是,虽然双精度浮点数是有效的 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 的 transformation filter)。