返回专辑
·Johan·3 分钟阅读

激光滤波:你在删噪声,也在删障碍

滤波改变世界模型;链路位置单一、可解释,窄门场景袋做前后对比。

激光滤波:你在删噪声,也在删障碍

1. 代价地图「干净多了」——窄道却过不去

调大 laser_filters 的 speckle 窗口后,RViz 里点云顺滑,运维点赞。两周后现场反馈:80 cm 窄道偶发拒行,回放 bag 发现真障碍被滤成缺口,costmap 在该处长期 free。滤波不是美颜滑条,是在改导航所见的世界模型——删的是噪声,也可能是合法障碍。

2. 链路位置:单一责任点

laser_filters 以 filter chain 形式挂在驱动与消费方之间,典型部署是独立 scan_to_scan_filter_chain 节点:

yaml
scan_to_scan_filter_chain:
  ros__parameters:
    filter1:
      name: range
      type: laser_filters/LaserScanRangeFilter
      params:
        lower_threshold: 0.15
        upper_threshold: 25.0
    filter2:
      name: shadows
      type: laser_filters/LaserScanShadowsFilter
      params:
        min_angle: 5.0
        max_angle: 175.0
        neighbors: 1
    filter3:
      name: speckle
      type: laser_filters/LaserScanSpeckleFilter
      params:
        filter_type: 1
        max_range: 2.0
        max_range_difference: 0.05

驱动滤一次、costmap 再滤一次会让现场无法解释「谁删了点」。契约:滤波输出 topic(如 /scan_filtered)是导航唯一激光源;costmap 不再叠魔法阈值。

3. 常见滤波与副作用

滤波作用误伤风险
Range近距杂点、超量程legit 近障被截
Shadows多径/拖影锐角障碍
Speckle孤立噪点细杆、窄柱
Mask本体遮挡配置错删前向

拖影/鬼影优先查 stamp 与 TF(运动补偿、时间同步),而不是再加一道中值把真障碍抹平。

4. 与 costmap 的责任切割

滤波输出应是「给导航用的激光语义」——已去本体、已压已知假障碍。costmap 负责空间聚合、膨胀、时间衰减。若 clear 不动,顺序查:观测 stamp → TF → 滤波是否把障碍删光。两模块 README 应写清接口 topic 与「不得重复删点」。

5. 参数变更:场景袋 + diff

改阈值必须带:同一段 bag 前后对比(点云 + costmap 截图)+ 参数 diff。验收场景至少含:窄门、反光柱、动态行人边缘。

bash
ros2 bag play narrow_door.db3
ros2 topic echo /scan_filtered --once   # 确认点数与 range 分布

「干净多了」的主观感受不能进 main;安全相关阈值走与限速类似的评审。Filter chain 顺序有语义:range 通常在前,speckle 在后——顺序颠倒可能先抹细特征再截距,表现因链而异,改顺序与改阈值同等对待,须重跑场景袋。

6. 定位 vs 导航:可分叉但需文档

AMCL 有时需要更「原始」的 scan 以保留特征,Nav2 costmap 用滤波后 scan。若分叉,必须显式两 topic,并验证 AMCL 不被 speckle 误伤特征点。默认 simpler:一条 filtered 走天下,除非定位证明需要分叉。

7. 验收

  • 窄门:可过且侧向余量符合预期
  • 已知假障碍(反光、桌腿多径)被压,真障碍连续
  • 滤波节点挂掉时:导航应 fail-safe(停或降级),而非静默用未滤波数据撞 unknown 行为
  • 参数与 filter chain yaml 进 git,与 robot 型号绑定

现场临时 bypass 滤波(直连 /scan)须有时限与工单,否则运维会永久绕过,窄道回归失去意义。

8. 案例:speckle 误删护栏

室外护栏在 scan 上呈稀疏点列,speckle 窗口按室内噪点标定,整段护栏被滤没。改为仅 indoor 配置启用强 speckle,outdoor 依赖 range + shadows,窄道袋与护栏袋分开回归。滤波参数是场景配方,不是全局常量。

9. 默认策略

宁可少滤、留噪点给 costmap 膨胀消化,也不要静默删障。滤波单一责任点;改参必带场景袋;安全阈值评审。世界模型被改写了,规划只是在改写后的世界上做正确计算。

10. 动态障碍与滤波

行人、叉车臂等动态物体不应靠 speckle「滤掉」,而应靠 costmap 时间衰减或语义层处理。若滤波把动态点当噪点删掉,局部规划会以为空间长期 free。动态场景验收袋必须进回归集,与静态窄门袋并列。本体 mask 随 URDF 变更须同步更新,否则新加传感器支架可能进入 scan 未被剔除,表现像「随机障碍」。

相关

也可以看看

← 全部文章

johan's blog