第3章:激光雷达数据基础

大家好,我是你们的老朋友。今天咱们来聊聊激光雷达最基础的东西——点云数据。

说实话,我刚开始接触激光雷达那会儿,拿到第一包数据时整个人是懵的。一堆数字,密密麻麻,完全不知道从哪下手。后来踩了不少坑,才慢慢摸清楚这里面的门道。今天就把这些经验分享给你。

3.1 点云数据格式:PCD / PLY / BIN

点云数据存成什么格式?这个问题看似简单,但选错了格式,后面会吃大亏。我见过不少新手,拿着PLY格式的数据做SLAM,结果读写速度慢得让人抓狂。

目前主流的格式有三种:PCDPLYBIN。咱们一个一个说。

3.1.1 PCD格式

PCD是Point Cloud Data的缩写,由PCL库推广。我个人最喜欢用这个格式,原因很简单——它自带文件头,能清楚告诉你点云有多少点、每个点有哪些字段。

一个典型的PCD文件长这样:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 640
HEIGHT 480
VIEWPOINT 0 0 0 1 0 0 0
POINTS 307200
DATA ascii
0.123 0.456 0.789 128
0.234 0.567 0.890 255
...

看到没?文件头里清清楚楚写着每个字段的类型和大小。这在调试时特别有用。我曾经在项目里遇到过数据对齐问题,就是靠看PCD文件头才找到原因的。

我的习惯:开发阶段用PCD格式,方便调试。部署阶段转成BIN,追求速度。

3.1.2 PLY格式

PLY是Polygon File Format的简称。它比PCD多一个优势——可以存储网格信息。如果你做三维重建,最后要生成模型,PLY是首选。

但说实话,PLY在SLAM领域用得不多。为什么呢?因为它读写速度比PCD慢,而且文件体积偏大。我有个朋友做实时SLAM,一开始用PLY,结果每帧数据要存30毫秒,直接导致系统掉帧。后来换成BIN格式,问题就解决了。

3.1.3 BIN格式

BIN就是二进制文件,没有文件头,没有格式说明,就是纯数据。听起来很原始对吧?但它的优势就是

举个例子:一个100万点的点云,PCD格式存成ASCII大概要50MB,BIN格式只要15MB。读写速度更是差了一个数量级。

注意:BIN格式没有文件头,你必须事先知道数据排布方式。我曾经接手过一个项目,前同事留下的BIN文件,没人知道里面存的是(x,y,z,intensity)还是(x,y,z,r,g,b)。最后只能靠猜,折腾了两天。

三种格式的对比,我整理了一张表:

格式 文件大小 读写速度 可读性 适用场景
PCD 中等 中等 开发调试
PLY 较大 较慢 三维重建、模型存储
BIN 最小 最快 实时系统、嵌入式

3.2 点云的基本属性

一个点云点,到底包含哪些信息?这取决于你的激光雷达型号和配置。但最核心的属性就三个:xyz坐标强度时间戳

3.2.1 xyz坐标

这个不用多说,就是点在三维空间中的位置。单位通常是米。但要注意,不同雷达的坐标系定义可能不一样。有的雷达z轴朝上,有的朝前。我刚开始做多传感器融合时,就因为这个坐标系不一致,折腾了好几天。

所以拿到数据的第一件事:确认坐标系。怎么确认?用可视化工具看一眼就知道了。

3.2.2 强度(Intensity)

强度值反映了目标物体对激光的反射能力。白色物体反射强,黑色物体反射弱。这个属性在目标识别中特别有用。

举个例子:车道线通常是白色的,强度值就高;沥青路面是黑色的,强度值就低。利用这个差异,可以轻松分割出车道线。

但要注意,强度值受距离影响很大。同样一个物体,放在10米处和50米处,强度值可能差好几倍。所以做强度相关的算法时,一定要做距离补偿。

避坑指南:我曾经做过一个项目,直接用原始强度值做分类,结果模型在近处表现很好,远处一塌糊涂。后来加了距离补偿,准确率从72%提升到了91%。

3.2.3 时间戳

时间戳记录了每个点被采集的时刻。对于静态场景,时间戳用处不大。但对于动态场景——比如自动驾驶——时间戳就至关重要了。

为什么?因为激光雷达是逐点扫描的。一个点云帧里,第一个点和最后一个点的时间差可能有100毫秒。如果车辆在运动,这100毫秒内车辆已经移动了好几米。不做时间戳补偿,点云就会变形。

这就是所谓的运动畸变问题。后面讲SLAM时会详细说,这里先留个印象。

3.3 点云可视化工具

光看数字是看不出门道的。你得把点云画出来,用眼睛看。我推荐两个工具:CloudComparePCL Visualizer

3.3.1 CloudCompare

CloudCompare是我最常用的可视化工具。它开源、免费、跨平台,功能还特别强大。

它能做什么?

  • 加载各种格式的点云(PCD、PLY、LAS、TXT...)
  • 点云编辑、裁剪、滤波
  • 点云配准、距离计算
  • 颜色渲染、强度显示
  • 剖面查看、统计信息

我建议你花半小时熟悉一下CloudCompare的界面。快捷键记几个常用的:Ctrl+R重置视角,Ctrl+D显示点云信息,Ctrl+Shift+P拾取点坐标。

小技巧:在CloudCompare里,按住Shift键再拖动鼠标,可以旋转视角。按住Ctrl键拖动,可以平移。滚轮缩放。这些操作很顺手。

3.3.2 PCL Visualizer

PCL Visualizer是PCL库自带的可视化模块。它不像CloudCompare那样有图形界面,而是通过代码来控制。适合集成到你的算法流程中。

一个简单的示例:

#include <pcl/visualization/cloud_viewer.h>

pcl::visualization::CloudViewer viewer("点云查看器");
viewer.showCloud(cloud);

while (!viewer.wasStopped())
{
    // 主循环
}

这段代码就能弹出一个窗口,显示你的点云。你可以旋转、缩放、拾取点。虽然界面简陋,但胜在轻量、可控。

我个人习惯是:开发调试用CloudCompare,快速看数据;算法集成用PCL Visualizer,自动化处理。

3.4 本章知识体系

说了这么多,咱们来梳理一下。下面这张图展示了本章的核心知识结构:

激光雷达数据基础 数据格式 PCD PLY BIN 基本属性 xyz坐标 强度 时间戳 可视化工具 CloudCompare PCL Visualizer 三个核心维度:格式选择、属性理解、工具使用 掌握这些,你就拿到了点云处理的入场券

嗯,这一章的内容就到这里。数据格式、基本属性、可视化工具,这三块是点云处理的基石。你想想看,如果连数据长什么样都不知道,后面的算法怎么跑得起来?

下一章咱们会深入点云滤波,到时候这些基础知识就用得上了。记住我今天说的那些坑,别重蹈我的覆辙。


公众号:蓝海资料掘金营,微信deep3321