3. 点云数据表示与预处理

点云数据是LiDAR感知系统的原始输入,其质量与组织方式直接决定后续分割、检测与SLAM算法的性能上限。原始点云往往包含数十万至数百万个三维点,且伴随噪声、离群点、地面点以及非均匀密度分布等问题。本章围绕点云的数据表示(格式与结构)、体素化(Voxelization)、降采样(Downsampling)、去噪(Denoising)与地面去除(Ground Removal)五大核心操作展开,建立一套从原始数据到可用特征的标准化预处理流水线。

LiDAR点云预处理流水线 原始点云 XYZI + 强度 + 时间 数据表示 PCD/PLY/BIN/ROS 体素化 Voxel Grid 结构 降采样 体素/均匀/随机 去噪 统计滤波 / 半径滤波 地面去除 RANSAC / 平面拟合 预处理后点云 均匀、干净、无地面 分割 / 检测 / SLAM 输入

上图展示了点云预处理的完整链路:原始点云经过数据表示转换、体素化结构建立、降采样稀疏化、去噪净化、地面去除五个环节后,输出可供下游任务直接使用的干净点云。每个环节都有其特定的算法选择与参数调优策略,下面逐一深入剖析。

3.1 点云数据格式与表示方法

核心原理:LiDAR传感器输出的原始数据通常为距离-角度-强度信息,需转换为三维笛卡尔坐标。常见点云格式包括PCD(Point Cloud Data)、PLY(Polygon File Format)、BIN(二进制裸数据)以及ROS的sensor_msgs/PointCloud2消息格式。不同格式在存储效率、读写速度、属性扩展性上各有取舍。

格式特点适用场景典型文件大小(100万点)
PCD支持自定义字段,ASCII/二进制混合PCL库处理、算法调试~15-30 MB
PLY支持顶点与面片,可含颜色三维重建、网格生成~20-40 MB
BIN纯二进制,无头信息,紧凑KITTI等自动驾驶数据集~12 MB
PointCloud2ROS标准消息,支持动态字段机器人系统集成内存映射

判断方法:选择格式时需考虑三个维度:存储效率(BIN最优)、字段扩展性(PCD/PLY支持自定义属性如法向量、颜色、时间戳)、生态兼容性(ROS环境优先PointCloud2)。实际工程中,KITTI数据集采用BIN格式存储,每帧包含约12万个点,字段为XYZI(三维坐标+反射强度),读取时需按float32数组解析。

实战场景:在自动驾驶感知模块中,原始64线LiDAR每帧产生约130万点。若直接存储为ASCII格式的PCD,文件大小可达80MB,严重影响实时性。工程上通常采用BIN格式存储原始数据,预处理后转换为PCD进行算法验证,最终在部署阶段使用PointCloud2消息进行进程间通信。

常见误区:初学者常忽略点云数据的坐标系定义。LiDAR坐标系通常为右前上(RFU)或前左上(FLU),不同传感器厂商定义不同。若未统一坐标系,后续的SLAM位姿估计和地面去除将产生系统性偏差。建议在数据加载阶段即完成坐标系标准化,并记录传感器安装外参。

3.2 体素化:从无序点到规则网格

核心原理:体素化是将连续的三维空间划分为固定尺寸的立方体网格(Voxel),每个体素内包含若干点。体素化并非简单的降采样,而是建立空间索引结构,为后续的邻域搜索、特征计算和分割算法提供规则化支持。体素尺寸的选择直接影响分辨率与计算开销的平衡。

操作流程:

  1. 确定体素边长 leaf_size(通常为0.05m-0.2m,取决于场景尺度与LiDAR线数)
  2. 计算每个点所属体素索引:idx = floor(coord / leaf_size)
  3. 对同一体素内的点进行聚合:可保留重心点、第一个点或所有点
  4. 输出体素中心点或保留点集,同时记录体素索引用于快速邻域查询
// PCL体素化降采样示例
pcl::VoxelGrid<pcl::PointXYZI> voxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.1f, 0.1f, 0.1f); // 10cm体素
voxel_filter.filter(*cloud_filtered);

案例拆解:在园区无人配送车的感知系统中,原始32线LiDAR点云约30万点/帧。采用0.2m体素降采样后,点数降至约8万点,处理耗时从45ms降至12ms,而下游的障碍物检测精度仅下降1.2%。体素化同时消除了近处点密集、远处点稀疏的非均匀性问题,使后续特征提取更加稳定。

风险提示:体素尺寸过大会导致细小物体(如电线、行人手臂)被滤除;过小则无法有效降低计算量。建议根据LiDAR线数动态调整:16线LiDAR建议0.2-0.3m,64线建议0.1-0.15m。同时注意体素化会引入轻微的位置偏移(重心代替原始点),对高精度SLAM可能产生厘米级误差。

3.3 降采样策略对比与选择

核心原理:降采样旨在减少点云规模的同时保留关键几何特征。除体素降采样外,常用方法包括均匀采样(每N个点取1个)、随机采样、曲率自适应采样(保留高曲率区域更多点)。不同方法对后续处理的影响差异显著。

方法保留特征计算复杂度适用场景
体素降采样均匀密度,保留整体形状O(N)通用预处理、SLAM前端
随机采样无偏但可能丢失细节O(N)快速测试、可视化
曲率自适应保留边缘与角点O(N log N)特征匹配、配准
法向量空间采样保留表面变化剧烈区域O(N)分割前预处理

判断方法:若下游任务是SLAM里程计,推荐体素降采样(0.1-0.2m),保证帧间一致性;若任务是目标检测,可采用随机采样配合强度阈值过滤;若任务是精细三维重建,必须使用曲率自适应采样以保留物体棱边。

经验总结:在实际工程中,建议采用级联降采样策略:先粗体素(0.3m)快速减少点数,再细体素(0.1m)保留关键细节。这种两阶段方法比单次细体素降采样快3-5倍,且精度损失可忽略。

3.4 点云去噪:统计滤波与半径滤波

核心原理:LiDAR点云噪声主要来源于传感器电子噪声、多路径反射、雨雾散射和运动畸变。去噪的目标是剔除离群点(Outlier)和飞点(Flying Point),同时保留真实物体表面点。最常用的两种方法为统计滤波(Statistical Outlier Removal, SOR)和半径滤波(Radius Outlier Removal, ROR)。

操作流程:

  • 统计滤波:计算每个点到其K个近邻的平均距离,若该距离超过全局均值+标准差×倍数(通常为1.0-2.0),则判定为离群点剔除。适用于去除稀疏离群点。
  • 半径滤波:统计每个点在指定半径(如0.5m)内的邻点数量,若少于阈值(如5个),则剔除。适用于去除孤立飞点。
// 统计滤波参数设置
pcl::StatisticalOutlierRemoval<pcl::PointXYZI> sor;
sor.setInputCloud(cloud);
sor.setMeanK(20);          // 近邻点数
sor.setStddevMulThresh(1.5); // 标准差倍数
sor.filter(*cloud_filtered);

案例拆解:在雨天场景下,某测试车辆采集的点云中约8%的点为雨滴反射噪声。单独使用统计滤波(K=30, 阈值=1.0)可去除60%的噪声点,但误删了2%的远距离真实点。改用半径滤波(半径=0.3m, 最少点数=3)后,噪声去除率提升至85%,误删率降至0.5%。实际工程中建议两种方法串联使用:先统计滤波去除大范围离群点,再半径滤波清理局部飞点。

风险说明:去噪参数过强会削弱点云边缘细节,导致后续分割时物体边界收缩。建议在去噪后可视化对比处理前后的点云密度分布,确保目标物体(如行人、车辆)的轮廓完整性。对于SLAM系统,过度去噪可能造成特征点不足,建议在SLAM前端使用较温和的参数(K=10, 阈值=2.0)。

3.5 地面去除:RANSAC平面拟合与改进方法

核心原理:地面点通常占点云总量的30%-50%,去除地面可显著减少后续分割与检测的计算量。最经典的方法是RANSAC(随机采样一致性)平面拟合,假设地面为无限平面模型。但实际场景中地面可能存在坡度、颠簸,且LiDAR低线束扫描的地面点呈环状分布,简单平面拟合会产生较大误差。

操作流程:

  1. 设定平面模型 ax + by + cz + d = 0,随机选取3个点计算平面参数
  2. 计算所有点到该平面的距离,距离小于阈值(如0.2m)的点视为内点
  3. 迭代N次(通常50-100次),选择内点最多的平面作为地面
  4. 将内点从点云中移除,剩余点即为非地面点

改进方法:针对非平坦地面,可采用区域地面分割:将点云按方位角划分为多个扇形区域,每个区域独立拟合地面平面;或采用高度阈值法:先通过RANSAC估计大致地面高度,再结合Z轴直方图确定精确地面点。

方法精度计算耗时适用地形
全局RANSAC中等低(~10ms)平坦道路
区域RANSAC高中(~25ms)坡道、颠簸路面
射线坡度法高低(~8ms)越野地形
深度图法极高高(~50ms)结构化道路

实战场景:在高速公路场景中,采用全局RANSAC(距离阈值0.15m)即可有效去除路面点。但在园区减速带和坡道场景,全局RANSAC会将坡顶的车辆底部误判为地面。改用区域RANSAC(每15°一个扇形,共24个区域)后,误判率从12%降至1.8%,且处理耗时仅增加15ms,满足20Hz实时性要求。

调优建议:地面去除后应检查剩余点云中是否包含路沿、低矮障碍物(如锥桶)。若这些物体被误删,可降低距离阈值或引入强度信息——地面点通常反射强度较低,可结合强度阈值辅助判断。对于多线LiDAR,还可利用线束编号:地面通常由底部若干线束扫描得到,可先按线束分层再拟合地面。

常见误区总结:预处理环节的每个操作都需与下游算法协同设计。体素化尺寸影响SLAM特征提取的稳定性;去噪强度影响分割的边界精度;地面去除的残留点会干扰障碍物聚类。建议建立预处理参数与下游任务性能的映射关系表,通过离线数据集进行参数扫描,找到最优组合。同时注意,不同场景(城市、高速、园区)应使用不同的参数配置,可通过场景识别模块自动切换预处理参数。