一、点云数据基础
做自动驾驶和机器人感知这些年,我接触最多的数据形式就是点云。说实话,刚入行那会儿,我对着密密麻麻的坐标点也是一头雾水。但搞懂了它的本质,你会发现——点云其实就是三维世界的「像素」。
1.1 什么是点云
点云,说白了就是一堆三维坐标点的集合。每个点用 (x, y, z) 表示它在空间中的位置。你想想看,激光雷达扫一圈,每个激光束碰到物体反弹回来,就记录一个点。成千上万个点拼在一起,就形成了周围环境的「轮廓素描」。
我在项目中遇到过一位同事,他总把点云想象成「三维照片」。普通照片每个像素有RGB颜色,点云每个点除了坐标,还可以带强度值、颜色值、甚至时间戳。嗯,这个比喻挺贴切的。
1.2 点云的数据结构
点云的数据结构其实不复杂。我习惯把它理解成一张表格——每一行是一个点,每一列是一种属性。
| 点索引 | x | y | z | 强度 | RGB |
|---|---|---|---|---|---|
| 0 | 1.23 | 4.56 | 7.89 | 128 | (255,0,0) |
| 1 | 2.34 | 5.67 | 8.90 | 200 | (0,255,0) |
| ... | ... | ... | ... | ... | ... |
实际工程中,我们常用两种数据结构:
- 无序点云:点之间没有拓扑关系,就是一堆散点。处理起来简单,但丢失了邻域信息。
- 有序点云:按扫描线顺序排列,类似图像的像素矩阵。比如Velodyne的64线激光雷达,每帧数据就是64×N的矩阵。这种结构能直接利用图像算法,效率高不少。
1.3 点云的存储格式
点云存成什么格式?这个问题我踩过坑。早期我用纯文本存点云,一个10万点的文件就几十MB,读写慢得要命。后来才摸清楚主流格式的门道。
PCD格式
PCD是Point Cloud Library(PCL)的亲儿子。它支持ASCII和二进制两种存储方式。我个人习惯用二进制格式,体积小、读写快。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 100000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 100000
DATA binary
...(二进制数据)
PLY格式
PLY(Polygon File Format)是图形学领域的常客。它比PCD多了一个优势——可以存储多边形网格。如果你做三维重建,PLY是首选。我记得有一次做高精地图项目,地图供应商给的就是PLY格式,里面包含了路面三角网格。
LAS格式
LAS是测绘和遥感领域的标准格式。它专门为激光雷达数据设计,支持分类标签(比如地面、建筑、植被)。做自动驾驶时,我经常用LAS格式存储标注好的训练数据。它的压缩率很高,一个1GB的原始点云,存成LAS可能只有200MB。
| 格式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| PCD | PCL处理、算法开发 | 读写快、PCL原生支持 | 不支持网格 |
| PLY | 三维重建、图形学 | 支持网格、颜色 | 文件较大 |
| LAS | 测绘、自动驾驶标注 | 压缩率高、带分类标签 | 解析库较少 |
1.4 点云可视化工具
做感知算法,可视化是刚需。你看不到点云,怎么调试?我常用的工具有这几个:
- PCL Visualizer:PCL自带的可视化工具,轻量级,适合快速查看点云。我写算法时经常用它做实时显示。
- CloudCompare:开源神器,支持点云编辑、配准、分割。做标注和数据分析时,我离不开它。
- Open3D:Python生态的宠儿。如果你用Python做算法原型,Open3D的可视化接口非常友好。
- RViz:ROS生态的标准可视化工具。做自动驾驶系统集成时,RViz是标配。
我个人最常用的是Open3D。为什么?因为它一行代码就能显示点云,还能交互旋转、缩放。你想想看,调试时能快速看到结果,效率提升不是一星半点。
import open3d as o3d
# 读取点云
pcd = o3d.io.read_point_cloud("scene.pcd")
# 可视化
o3d.visualization.draw_geometries([pcd])
知识体系总览
下面这张图,是我梳理的点云数据基础的知识结构。你可以把它当作本章的「地图」。
嗯,以上就是点云数据基础的全部内容。搞懂了这些,后面讲障碍物检测算法时,你就能更顺畅地跟上节奏。记住一句话:点云是三维感知的「原材料」,原材料处理不好,后面再牛的算法也白搭。