
1. 代价地图「干净多了」——窄道却过不去
调大 laser_filters 的 speckle 窗口后,RViz 里点云顺滑,运维点赞。两周后现场反馈:80 cm 窄道偶发拒行,回放 bag 发现真障碍被滤成缺口,costmap 在该处长期 free。滤波不是美颜滑条,是在改导航所见的世界模型——删的是噪声,也可能是合法障碍。
2. 链路位置:单一责任点
laser_filters 以 filter chain 形式挂在驱动与消费方之间,典型部署是独立 scan_to_scan_filter_chain 节点:
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。验收场景至少含:窄门、反光柱、动态行人边缘。
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 未被剔除,表现像「随机障碍」。
相关
也可以看看
- ·15 分钟阅读
ContentFilteredTopic:把过滤下推到中间件还是应用层
对比订阅端丢弃、应用层条件判断与 DDS 内容过滤的 CPU/带宽边界,说明表达式能力与发现时序限制;用高频率噪声话题与延迟尖峰验收过滤位置选择。
- ·16 分钟阅读
ROS 2 Action 取消语义:收到 cancel 不等于执行器已经停下
梳理 goal handle 状态机、取消回调与硬件停止之间的异步边界;用可中断执行循环、截止时间和终态发布构建契约并以注入验收。
- ·9 分钟阅读
ROS 2 大消息内存路径:intra-process、loaned message 与 shared memory 不是一回事
以 4K 图像和点云管线为例,逐段核对 rclcpp、RMW 与进程边界上的所有权、分配和真实拷贝。
johan's blog