一、点云滤波概述

1.1 什么是点云滤波

点云滤波,说白了就是给原始点云数据「洗个澡」。

你想想看,激光雷达扫出来的点云,里面啥都有——有真实的物体点,也有噪声点、离群点、甚至飞点。我刚开始做SLAM那会儿,就吃过这个亏。有一次在停车场跑数据,结果地图里全是飘在半空中的「幽灵点」,后来才发现是雨滴反射造成的。

点云滤波的核心任务,就是把这些不干净的东西去掉,保留我们真正需要的结构信息。它不是一个花哨的技术,但绝对是点云处理流水线里的第一道关卡。

一句话总结:滤波 = 去噪 + 降采样 + 提取感兴趣区域

1.2 为什么需要滤波

我见过不少新手,拿到点云就直接往上跑算法,结果效果一塌糊涂。为什么会这样?

原因其实很简单——原始点云有三个「硬伤」:

  • 数据量大:64线激光雷达一秒钟能产生上百万个点,直接处理,CPU直接冒烟
  • 噪声多:传感器本身有误差,环境反射也有干扰,尤其是玻璃、水面这些「坑爹」材质
  • 分布不均:近处点密,远处点稀,直接做特征提取会出问题

我记得有一次做园区自动驾驶项目,车在玻璃幕墙大楼旁边跑,雷达扫出来的点全偏了。当时排查了半天,最后发现是滤波参数没调好,把有效点给滤掉了。嗯,这里要注意——滤波不是越狠越好,过犹不及。

1.3 滤波在SLAM/自动驾驶中的角色

滤波在SLAM和自动驾驶里,扮演的是「守门员」的角色。

在SLAM里,滤波直接影响两个关键环节:

  1. 前端配准:ICP、NDT这些配准算法,对噪声非常敏感。我见过有人用原始点云跑ICP,迭代了50次还不收敛,一滤波,5次就搞定了
  2. 后端建图:地图里如果残留了大量噪声点,后续的定位和路径规划都会出问题

在自动驾驶里,滤波更是基础中的基础:

  • 障碍物检测:不滤波,聚类出来的障碍物全是假的
  • 地面分割:地面点不滤干净,后续的障碍物检测就没法做
  • 定位:点云地图的质量,直接取决于滤波做得好不好
个人经验:我建议在搭建点云处理流水线时,先把滤波模块单独拎出来测试。用一组标准数据跑通,再集成到主系统里。这样排查问题会快很多。

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);
避坑指南:我曾经在高速场景下把体素设成0.5m,结果远处的车只剩两三个点,聚类直接失败。体素大小的选择,一定要结合传感器距离和场景需求来定。近处用0.1m,远处可以放宽到0.3m。

统计滤波和半径滤波,我一般配合使用。先统计滤波去掉明显的离群点,再用半径滤波做精细去噪。顺序不能反——我试过先半径后统计,效果差很多。

直通滤波最简单,就是按坐标轴切一刀。比如只保留前方20米内的点,或者去掉地面以下的部分。但要注意坐标系——我见过有人把Z轴方向搞反,结果把车顶以上的点全留下了,地面点全切掉了。

1.5 滤波算法的选择策略

说了这么多,到底该怎么选?我个人的经验是:

  • 数据量大:先体素降采样,再考虑其他滤波
  • 噪声明显:统计滤波 + 半径滤波组合拳
  • 只关注特定区域:直通滤波先切一刀
  • 场景复杂:条件滤波做精细筛选

记住一个原则:滤波的目的是「保留有用信息,去除无用噪声」,不是把数据变得越少越好。我见过有人为了追求速度,把点云从100万滤到1万,结果特征全丢了,得不偿失。

小技巧:调试滤波参数时,建议用可视化工具实时看效果。PCL的CloudViewer或者Open3D的可视化都行。肉眼一看,参数合不合适,心里就有数了。

好了,这一章的内容就到这里。滤波是点云处理的第一步,也是最重要的一步。后面我们会深入每个算法的原理和实现细节,到时候再细聊。

可可精品资料库