第3章:激光雷达数据基础
大家好,我是你们的老朋友。今天咱们来聊聊激光雷达最基础的东西——点云数据。
说实话,我刚开始接触激光雷达那会儿,拿到第一包数据时整个人是懵的。一堆数字,密密麻麻,完全不知道从哪下手。后来踩了不少坑,才慢慢摸清楚这里面的门道。今天就把这些经验分享给你。
3.1 点云数据格式:PCD / PLY / BIN
点云数据存成什么格式?这个问题看似简单,但选错了格式,后面会吃大亏。我见过不少新手,拿着PLY格式的数据做SLAM,结果读写速度慢得让人抓狂。
目前主流的格式有三种:PCD、PLY 和 BIN。咱们一个一个说。
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文件头才找到原因的。
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。读写速度更是差了一个数量级。
三种格式的对比,我整理了一张表:
| 格式 | 文件大小 | 读写速度 | 可读性 | 适用场景 |
|---|---|---|---|---|
| PCD | 中等 | 中等 | 好 | 开发调试 |
| PLY | 较大 | 较慢 | 好 | 三维重建、模型存储 |
| BIN | 最小 | 最快 | 差 | 实时系统、嵌入式 |
3.2 点云的基本属性
一个点云点,到底包含哪些信息?这取决于你的激光雷达型号和配置。但最核心的属性就三个:xyz坐标、强度、时间戳。
3.2.1 xyz坐标
这个不用多说,就是点在三维空间中的位置。单位通常是米。但要注意,不同雷达的坐标系定义可能不一样。有的雷达z轴朝上,有的朝前。我刚开始做多传感器融合时,就因为这个坐标系不一致,折腾了好几天。
所以拿到数据的第一件事:确认坐标系。怎么确认?用可视化工具看一眼就知道了。
3.2.2 强度(Intensity)
强度值反映了目标物体对激光的反射能力。白色物体反射强,黑色物体反射弱。这个属性在目标识别中特别有用。
举个例子:车道线通常是白色的,强度值就高;沥青路面是黑色的,强度值就低。利用这个差异,可以轻松分割出车道线。
但要注意,强度值受距离影响很大。同样一个物体,放在10米处和50米处,强度值可能差好几倍。所以做强度相关的算法时,一定要做距离补偿。
3.2.3 时间戳
时间戳记录了每个点被采集的时刻。对于静态场景,时间戳用处不大。但对于动态场景——比如自动驾驶——时间戳就至关重要了。
为什么?因为激光雷达是逐点扫描的。一个点云帧里,第一个点和最后一个点的时间差可能有100毫秒。如果车辆在运动,这100毫秒内车辆已经移动了好几米。不做时间戳补偿,点云就会变形。
这就是所谓的运动畸变问题。后面讲SLAM时会详细说,这里先留个印象。
3.3 点云可视化工具
光看数字是看不出门道的。你得把点云画出来,用眼睛看。我推荐两个工具:CloudCompare 和 PCL Visualizer。
3.3.1 CloudCompare
CloudCompare是我最常用的可视化工具。它开源、免费、跨平台,功能还特别强大。
它能做什么?
- 加载各种格式的点云(PCD、PLY、LAS、TXT...)
- 点云编辑、裁剪、滤波
- 点云配准、距离计算
- 颜色渲染、强度显示
- 剖面查看、统计信息
我建议你花半小时熟悉一下CloudCompare的界面。快捷键记几个常用的:Ctrl+R重置视角,Ctrl+D显示点云信息,Ctrl+Shift+P拾取点坐标。
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 本章知识体系
说了这么多,咱们来梳理一下。下面这张图展示了本章的核心知识结构:
嗯,这一章的内容就到这里。数据格式、基本属性、可视化工具,这三块是点云处理的基石。你想想看,如果连数据长什么样都不知道,后面的算法怎么跑得起来?
下一章咱们会深入点云滤波,到时候这些基础知识就用得上了。记住我今天说的那些坑,别重蹈我的覆辙。
公众号:蓝海资料掘金营,微信deep3321