2、点云基础与数据表示:点云数据获取方式(激光雷达、RGB-D、结构光)、常见格式(PCD、PLY、LAS)、坐标系与变换、点云属性(坐标、强度、法线、颜色)
点云(Point Cloud)是三维空间中一组离散点的集合,每个点通过三维坐标(X, Y, Z)描述物体表面的空间位置,并可附带强度、颜色、法线等附加属性。作为三维视觉与激光雷达感知的基础数据形态,点云在自动驾驶、机器人导航、工业检测、测绘建模等领域扮演着核心角色。理解点云的数据来源、存储格式、坐标体系与属性含义,是进行后续分割、聚类、配准与识别的前提。本章将从数据获取方式出发,系统梳理点云的数据表示体系,并结合工程实践给出选型建议与常见误区分析。
上图展示了点云数据表示的整体知识框架。从数据获取方式、存储格式、坐标系到点云属性,四个维度共同构成了点云处理的基础。下面逐一展开深入解析。
2.1 点云数据获取方式
2.1.1 激光雷达(LiDAR)
激光雷达通过发射激光束并测量反射光的时间差(ToF,Time of Flight)或相位差来计算目标距离,同时结合扫描角度得到三维坐标。根据扫描机制,可分为机械旋转式、固态式(MEMS、Flash、OPA)等类型。机械式LiDAR(如Velodyne VLP-16、HDL-64)通过电机带动激光阵列旋转,获得360°水平视场;固态式LiDAR则通过电子扫描或面阵闪光实现,体积更小、可靠性更高,但视场角通常受限。
核心原理:激光雷达输出的原始数据通常为每个激光束的测距值、水平角、垂直角以及反射强度。通过球坐标到直角坐标的转换公式:
X = R * cos(ω) * cos(α)
Y = R * cos(ω) * sin(α)
Z = R * sin(ω)
其中,R为测距值,ω为垂直角,α为水平角。转换后即可得到每个点的三维坐标。强度值(Intensity)反映了目标表面反射率,对道路标线、路沿、金属护栏等不同材质的区分具有重要价值。
2.1.2 RGB-D 相机
RGB-D相机(如Microsoft Kinect、Intel RealSense)通过红外结构光或ToF原理,同时输出彩色图像(RGB)和深度图像(Depth)。每个像素的深度值经过相机内参反投影,可生成对应的三维点云。RGB-D相机成本低、帧率高(30fps),适合室内场景的物体识别、人体姿态估计等应用。
操作流程:深度图转点云的核心步骤包括:
- 读取深度图,获取像素坐标(u, v)对应的深度值d;
- 利用相机内参矩阵K(fx, fy, cx, cy)进行反投影:
Z = d / scale_factor
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
- 将RGB图像与深度图对齐,为每个点赋予颜色信息。
RGB-D点云的缺点是有效距离较短(通常0.5m~5m),且易受环境光干扰,在强光下深度数据会出现大量空洞。
2.1.3 结构光
结构光技术通过投影仪向物体表面投射编码光栅(如正弦条纹、格雷码),相机拍摄变形后的光栅图像,通过相位解算得到物体表面的三维坐标。该技术精度高(可达亚毫米级),常用于工业检测、逆向工程、人脸识别等场景。结构光点云通常密度高、噪声低,但需要控制环境光照,且对高反光或透明物体效果较差。
| 获取方式 | 测距原理 | 典型距离 | 精度 | 适用场景 |
|---|---|---|---|---|
| 激光雷达 | ToF / 相位差 | 0.1m ~ 200m+ | ±2cm | 自动驾驶、测绘、机器人导航 |
| RGB-D | 红外结构光 / ToF | 0.5m ~ 5m | ±1cm @1m | 室内SLAM、人机交互 |
| 结构光 | 编码光栅相位解算 | 0.2m ~ 3m | ±0.1mm ~ 1mm | 工业检测、逆向工程 |
2.2 常见点云格式
2.2.1 PCD(Point Cloud Data)
PCD格式由PCL(Point Cloud Library)库定义,是点云处理中最常用的格式之一。PCD文件包含文件头(Header)和数据体(Data)两部分。文件头以ASCII文本形式存储,声明了点云的点数、字段(Field)、尺寸(Size)、类型(Type)和点数(Count)等元信息;数据体可以是ASCII或二进制存储。
# .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 123456
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 123456
DATA ascii
0.123 0.456 0.789 25.0
...
判断方法:解析PCD文件时,需先读取Header中的FIELDS和TYPE字段,确定每个点的属性布局。PCD支持自定义字段,例如增加法线(normal_x, normal_y, normal_z)或RGB值,灵活性高。
2.2.2 PLY(Polygon File Format)
PLY格式最初由斯坦福大学设计,支持点云和三角网格两种数据形态。PLY文件同样包含头部(Header)和元素数据(Element Data)。头部通过element vertex和property关键字定义顶点数量及属性类型。PLY支持二进制和ASCII两种编码,且可以存储面片(face)信息,适合用于三维重建后的模型输出。
ply
format ascii 1.0
element vertex 8
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
element face 6
property list uchar int vertex_indices
end_header
0 0 0 255 0 0
...
2.2.3 LAS / LAZ
LAS格式是ASPRS(美国摄影测量与遥感学会)制定的激光雷达标准数据格式,广泛用于测绘、林业、城市规划等领域。LAS文件采用二进制存储,包含公共头块(Public Header Block)、变长记录(VLR)和点数据记录(Point Data Record)。每个点记录可包含坐标、强度、回波次数、分类标签(如地面、植被、建筑)等丰富信息。LAZ是LAS的压缩版本,压缩比可达10:1以上,但需要LASzip库进行解压。
2.3 坐标系与变换
点云数据通常定义在传感器坐标系下,但在多传感器融合或全局建图时,需要统一到世界坐标系或车体坐标系。坐标系变换的核心是刚体变换(旋转+平移),数学表达为:
P_world = R * P_sensor + t
其中,R为3×3旋转矩阵,t为3×1平移向量。实际工程中,常使用齐次坐标形式:
[X_w] [r11 r12 r13 tx] [X_s]
[Y_w] = [r21 r22 r23 ty] [Y_s]
[Z_w] [r31 r32 r33 tz] [Z_s]
[1 ] [0 0 0 1 ] [1 ]
操作流程:坐标系标定通常采用以下步骤:
- 选择标定靶(如棋盘格、圆形标定板),采集多组对应点;
- 使用SVD分解或优化方法(如Levenberg-Marquardt)求解R和t;
- 验证变换精度,计算重投影误差或对应点距离均方根误差(RMSE)。
在自动驾驶中,LiDAR坐标系、相机坐标系、IMU坐标系和车体坐标系之间的外参标定是系统集成的关键环节。标定误差会导致点云与图像投影错位,直接影响后续的目标检测与融合。
2.4 点云属性
2.4.1 坐标(X, Y, Z)
坐标是点云最基本的属性,描述了点在三维空间中的位置。坐标的精度和密度直接影响分割与聚类算法的效果。例如,地面分割算法(如RANSAC平面拟合)依赖Z值的分布特征;欧式聚类则依赖点与点之间的空间距离。
2.4.2 强度(Intensity)
强度值反映了目标表面对激光的反射能力。不同材质(沥青、混凝土、金属、植被)的强度差异明显。在分割聚类中,强度可用于区分道路标线与普通路面,也可用于去除低反射率的噪声点。但需注意,强度值受距离、入射角影响,使用前最好进行归一化校正。
2.4.3 法线(Normal)
法线是点云表面的几何属性,表示该点所在局部平面的朝向。法线估计通常通过PCA(主成分分析)在邻域内计算协方差矩阵的最小特征值对应的特征向量得到。法线在区域生长分割、点云配准(如ICP)、表面重建中具有重要作用。
// PCL法线估计示例
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
ne.setRadiusSearch(0.05); // 搜索半径5cm
ne.compute(*normals);
2.4.4 颜色(RGB)
颜色信息通常由RGB-D相机或多光谱传感器提供。颜色有助于语义分割(如区分红色车辆与绿色植被),但在激光雷达点云中通常不包含颜色。当点云同时包含几何与颜色时,可结合两者进行更鲁棒的分割,例如颜色辅助的区域生长算法。
| 属性 | 来源 | 典型用途 | 注意事项 |
|---|---|---|---|
| 坐标 | 所有传感器 | 空间索引、距离计算 | 注意坐标系原点定义 |
| 强度 | LiDAR | 材质区分、噪声滤除 | 受距离和入射角影响 |
| 法线 | 计算得到 | 分割、配准、重建 | 邻域半径影响估计结果 |
| 颜色 | RGB-D / 相机 | 语义分割、可视化 | 光照变化影响大 |
2.5 案例拆解:自动驾驶LiDAR点云预处理与坐标系统一
背景与约束:某自动驾驶测试车辆搭载64线机械式LiDAR(安装在车顶)、前视相机和IMU。LiDAR输出点云频率为10Hz,每帧约12万个点。系统需要将LiDAR点云从传感器坐标系变换到车体坐标系(原点位于后轴中心),并与相机图像进行像素级对齐,用于后续的目标检测与可行驶区域分割。
初始现象与目标:原始点云在传感器坐标系下,Z轴朝上,X轴朝前,但车体坐标系要求X轴朝前、Y轴朝左、Z轴朝上。同时,LiDAR安装位置存在约1.2m的X向偏移和0.3m的Z向偏移,且存在约2°的俯仰角安装误差。目标是将点云准确变换到车体坐标系,并验证变换精度。
关键输入数据与参数:
- LiDAR内参:垂直角范围[-15°, +15°],水平角分辨率0.2°;
- 外参标定结果:平移向量 t = [1.2, 0.0, 0.3]m,旋转欧拉角 (roll=0°, pitch=2°, yaw=0°);
- 相机内参:fx=1200, fy=1200, cx=960, cy=540,图像分辨率1920×1080。
分析判断过程:首先,将欧拉角转换为旋转矩阵R。由于pitch=2°,对应的旋转矩阵为:
R = [cos(2°) 0 sin(2°)]
[0 1 0 ]
[-sin(2°) 0 cos(2°)]
然后,对每个点应用变换公式 P_vehicle = R * P_lidar + t。变换后,随机选取50个地面点,检查其Z值是否接近0(车体坐标系下地面Z≈0)。若Z值分布集中在[-0.05, 0.05]m范围内,则说明变换正确。
实际操作步骤:
- 读取一帧点云,提取每个点的X, Y, Z坐标;
- 构建齐次变换矩阵T(4×4),将R和t组合;
- 对每个点执行矩阵乘法,得到车体坐标系下的坐标;
- 将变换后的点云投影到相机图像平面,验证投影点是否与图像中的物体边缘对齐;
- 计算投影误差,若平均误差大于3像素,则需重新标定外参。
结果对比:变换前,地面点的Z值在[-1.5, -1.2]m范围(因为LiDAR高于地面1.5m);变换后,地面点Z值集中在[-0.03, 0.03]m,符合预期。投影到图像后,路沿、车辆边缘与图像轮廓对齐良好,平均投影误差为1.8像素,满足下游算法要求。
风险与代价:外参标定误差会直接导致点云与图像错位,影响融合精度。标定过程需要采集多帧数据并优化,耗时约30分钟。若车辆长期运行导致机械振动,外参可能发生漂移,需定期复标。
复盘经验:坐标系变换是点云处理的第一步,务必在算法开发前完成统一。建议将变换矩阵封装为独立模块,便于复用和调试。同时,在可视化调试时,应同时显示变换前后的点云,以便快速定位问题。