为了测试 laser_filters 过滤效果,首先使用 CoppeliaSim 软件搭建了简单的测试场景,为了搞的跟真实相近,我在软件的基础上对前轮转向模型,sick laser 模型进行修改,添加四个支撑柱测试软件包对支撑柱的过滤效果,其中sick激光模型会发布 base_link 到 laser 的静态 tf 以及/scan
topic 到ros,laser_filters 包会订阅/scan
topic 过滤发布 /scan_filtered
,最终通过 rviz 同时显示/scan
(红色点标记)和/scan_filtered
(绿色点标记)topic 进行对比。废话不多说,直接上图:
如图2 蓝色圈中红色激光点为270度激光扫到的支撑柱,laser_filters 只进行了角度的过滤(其他过滤器可自行测试),可发现蓝圈内无绿色的激光点。launch 启动文件和 yaml 参数文件如下:
test.yaml
scan_filter_chain:
- name: angle
type: laser_filters/LaserScanAngularBoundsFilter
params: {
lower_angle: -2.0, upper_angle: 2.0} # filter -114.6 ~ 114.6deg
test.launch
<launch>
<node pkg="laser_filters" type="scan_to_scan_filter_chain" output="screen" name="front_laser">
<rosparam command="load" file="$(find laser_filters)/param/test.yaml" />
</node>
</launch>
通过插件可以配置下列滤波器:
- LaserScanRangeFilter 设定距离阈值,超出则设置为nan
- ScanShadowsFilter 针对物体边沿的扫描和识别
- LaserScanAngularBoundsFilter 将设定的角度外的扫描数据删除
- LaserScanBoxFilter 无视一个区块内的数据(常用于无视机器人本体对激光雷达数据的干扰)
- LaserScanAngularBoundsFilterInPlace 不会删除目标角度扇区外的数据,但会把对应扫描的距离值设为最大距离阈值+1
- InterpolationFilter 插值滤波
- LaserScanIntensityFilter 设定强度阈值,超出则设置为nan
- LaserArrayFilter 使用中值过滤器等对距离和强度进行过滤
另可参考: