4. 点云预处理

激光雷达输出的原始点云并不是“干净”的三维地图,它同时包含测量噪声、雨雾尘埃、反光伪点、地面点、动态物体以及大量冗余点。若直接把这些点送入SLAM前端,配准会变慢、误匹配会增多、位姿漂移也会加剧。因此,点云预处理是LiDAR SLAM中承上启下的关键环节:它把原始扫描整理成“几何结构清晰、规模可控、语义相对干净”的点集,为后续特征匹配、帧间配准和回环检测提供可靠输入。

一、核心原理:预处理是一条逐级“提纯”的流水线

点云预处理通常遵循“先剔除明显错误,再压缩数据规模,再分离语义结构,最后提取可匹配特征”的顺序。顺序不能随意颠倒:如果先去噪再降采样,可能把噪声点当作体素中心保留;如果先聚类再地面分割,地面会把所有物体连成一片,聚类结果几乎不可用。因此,合理的处理链是:去噪 → 滤波 → 降采样 → 地面分割 → 聚类 → 特征提取。

去噪针对的是孤立离群点和测量粗差,常用统计滤波或半径滤波;滤波用于限制感兴趣区域,例如只保留车体前方一定距离和高度范围内的点;降采样通过体素栅格减少点数,同时尽量保持几何形状;地面分割把地面点与障碍物点分离,常用RANSAC平面拟合或坡度/高度阈值法;聚类把相邻的非地面点分成独立目标;特征提取则从点云中计算法线、曲率、边缘点、平面点等,供配准使用。

LiDAR 点云预处理流水线 原始点云 含噪声/冗余 去噪 统计/半径滤波 滤波 ROI/高度裁剪 降采样 体素栅格 地面分割 RANSAC/坡度 聚类 欧氏/DBSCAN 特征提取 法线 · 曲率 · 边缘点 · 平面点 输出:干净点云 + 特征 供配准 / 建图 / 回环使用 关键参数提示 • 统计滤波:邻域点数 K、标准差倍数 σ • 体素降采样:体素边长 leaf_size • 地面分割:距离阈值 d、最大迭代次数 • 聚类:容差 tolerance、最小簇点数 • 特征:法线邻域半径、曲率阈值 参数需按雷达线数与场景调优 处理目标对照 去噪:剔除孤立离群点 滤波:限定有效感知区域 降采样:降低点数与计算量 地面分割:分离地面与障碍物 聚类:划分独立目标簇

二、方法流程与关键参数

在工程实现中,常用PCL或Open3D完成上述步骤。下面给出一个典型的C++/PCL处理片段,展示从读取点云到地面分割与聚类的核心调用方式:

// 1. 统计滤波去噪
pcl::StatisticalOutlierRemoval<pcl::PointXYZI> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);              // 邻域点数
sor.setStddevMulThresh(1.0);   // 标准差倍数
sor.filter(*cloud_filtered);

// 2. 体素降采样
pcl::VoxelGrid<pcl::PointXYZI> vg;
vg.setInputCloud(cloud_filtered);
vg.setLeafSize(0.2f, 0.2f, 0.2f);  // 体素边长 0.2m
vg.filter(*cloud_down);

// 3. RANSAC 地面分割
pcl::SACSegmentation<pcl::PointXYZI> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.15);    // 地面距离阈值
seg.setInputCloud(cloud_down);
seg.segment(*inliers, *coefficients);

// 4. 欧氏聚类
pcl::EuclideanClusterExtraction<pcl::PointXYZI> ec;
ec.setClusterTolerance(0.5);       // 聚类容差
ec.setMinClusterSize(10);
ec.setMaxClusterSize(2500);
ec.setInputCloud(cloud_non_ground);
ec.extract(clusters);

参数选择直接决定预处理质量。例如体素边长过大,路沿、杆状物会被“抹平”;地面距离阈值过小,缓坡会被误判为障碍物;聚类容差过小,同一辆车会被拆成多个簇。实际调试时,应结合雷达线数、安装高度和场景复杂度反复验证。

三、典型场景:城市道路与园区巡检

在城市道路场景中,16线或32线激光雷达每秒产生约30万点。若不做降采样,单帧配准耗时可能超过200ms,难以满足实时性。经过0.2m体素降采样后,点数可降至原来的20%~30%,配准速度显著提升。地面分割后,剩余的非地面点主要用于提取杆状物、车辆和建筑立面,这些结构在帧间配准中具有更强的几何约束。

在园区巡检场景中,地面较为平整但存在减速带和井盖。此时RANSAC平面模型可能把减速带误判为障碍物,导致聚类结果中出现大量小簇。解决方法是先做坡度滤波,或对地面点做二次拟合,保留缓变地形。对于动态行人,可在聚类后结合尺寸和高度过滤,避免其进入特征匹配环节。

四、常见误区与复盘

误区 现象 修正方法
先降采样再去噪 噪声点被体素保留,后续配准出现离群匹配 先去噪,再降采样
地面分割阈值过大 低矮障碍物被误删,漏检路沿 按雷达安装高度和坡度重新标定阈值
聚类容差过小 同一目标被拆成多个簇,特征碎片化 根据目标尺寸和点间距增大容差
忽略强度信息 反光板、车道线等特征未被利用 在特征提取中融合反射强度
参数一套用到底 换场景后性能骤降 按场景建立参数配置模板并在线切换
实战建议:预处理不是“越干净越好”,而是“保留对配准有用的结构”。过度滤波会削弱特征,过度降采样会丢失细节。建议先用RViz或CloudCompare可视化每一步结果,确认地面、障碍物和特征点的分布是否符合预期,再固化参数。
注意:地面分割与聚类之间存在顺序依赖。若先聚类再分割地面,地面点会把相邻障碍物连成一个大簇,导致聚类失效。务必先完成地面分割,再对非地面点做聚类。

综上,点云预处理的核心在于建立一条稳定、可复现的处理链,并针对雷达型号和场景特点调优参数。去噪保证数据干净,滤波限定感知范围,降采样控制计算规模,地面分割分离语义层次,聚类划分独立目标,特征提取则为后续配准提供几何依据。只有这条链路稳定,LiDAR SLAM的位姿估计和建图精度才有可靠保障。