一、点云滤波概述
1.1 什么是点云滤波
点云滤波,说白了就是给原始点云数据「洗个澡」。
你想想看,激光雷达扫出来的点云,里面啥都有——有真实的物体点,也有噪声点、离群点、甚至飞点。我刚开始做SLAM那会儿,就吃过这个亏。有一次在停车场跑数据,结果地图里全是飘在半空中的「幽灵点」,后来才发现是雨滴反射造成的。
点云滤波的核心任务,就是把这些不干净的东西去掉,保留我们真正需要的结构信息。它不是一个花哨的技术,但绝对是点云处理流水线里的第一道关卡。
1.2 为什么需要滤波
我见过不少新手,拿到点云就直接往上跑算法,结果效果一塌糊涂。为什么会这样?
原因其实很简单——原始点云有三个「硬伤」:
- 数据量大:64线激光雷达一秒钟能产生上百万个点,直接处理,CPU直接冒烟
- 噪声多:传感器本身有误差,环境反射也有干扰,尤其是玻璃、水面这些「坑爹」材质
- 分布不均:近处点密,远处点稀,直接做特征提取会出问题
我记得有一次做园区自动驾驶项目,车在玻璃幕墙大楼旁边跑,雷达扫出来的点全偏了。当时排查了半天,最后发现是滤波参数没调好,把有效点给滤掉了。嗯,这里要注意——滤波不是越狠越好,过犹不及。
1.3 滤波在SLAM/自动驾驶中的角色
滤波在SLAM和自动驾驶里,扮演的是「守门员」的角色。
在SLAM里,滤波直接影响两个关键环节:
- 前端配准:ICP、NDT这些配准算法,对噪声非常敏感。我见过有人用原始点云跑ICP,迭代了50次还不收敛,一滤波,5次就搞定了
- 后端建图:地图里如果残留了大量噪声点,后续的定位和路径规划都会出问题
在自动驾驶里,滤波更是基础中的基础:
- 障碍物检测:不滤波,聚类出来的障碍物全是假的
- 地面分割:地面点不滤干净,后续的障碍物检测就没法做
- 定位:点云地图的质量,直接取决于滤波做得好不好
1.4 常见滤波算法概览
市面上常见的滤波算法,我按用途分成了三类。你想想看,这样分类是不是更清晰?
| 类别 | 算法 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| 降采样 | 体素滤波 | 大规模点云压缩 | 体素大小设太大,把墙都滤没了 |
| 去噪 | 统计滤波 | 去除离群点 | 标准差阈值设太小,把有效点也删了 |
| 去噪 | 半径滤波 | 去除孤立点 | 半径和点数阈值要配合调 |
| 直通滤波 | 范围裁剪 | 提取ROI区域 | 坐标系搞反,把目标区域切掉了 |
| 条件滤波 | 多条件组合 | 复杂场景筛选 | 条件写太复杂,性能扛不住 |
这里我重点说一下体素滤波——它是我用得最多的算法。原理很简单:把空间划分成小立方体(体素),每个体素里只保留一个点(通常是重心或中心点)。
代码实现也很直接:
// PCL中的体素滤波示例
pcl::VoxelGrid<pcl::PointXYZ> voxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.1f, 0.1f, 0.1f); // 体素大小10cm
voxel_filter.filter(*cloud_filtered);
统计滤波和半径滤波,我一般配合使用。先统计滤波去掉明显的离群点,再用半径滤波做精细去噪。顺序不能反——我试过先半径后统计,效果差很多。
直通滤波最简单,就是按坐标轴切一刀。比如只保留前方20米内的点,或者去掉地面以下的部分。但要注意坐标系——我见过有人把Z轴方向搞反,结果把车顶以上的点全留下了,地面点全切掉了。
1.5 滤波算法的选择策略
说了这么多,到底该怎么选?我个人的经验是:
- 数据量大:先体素降采样,再考虑其他滤波
- 噪声明显:统计滤波 + 半径滤波组合拳
- 只关注特定区域:直通滤波先切一刀
- 场景复杂:条件滤波做精细筛选
记住一个原则:滤波的目的是「保留有用信息,去除无用噪声」,不是把数据变得越少越好。我见过有人为了追求速度,把点云从100万滤到1万,结果特征全丢了,得不偿失。
好了,这一章的内容就到这里。滤波是点云处理的第一步,也是最重要的一步。后面我们会深入每个算法的原理和实现细节,到时候再细聊。