wiki : http://wiki.ros.org/laser_filters
laser_filters软件包的主要内容是一些用于处理sensor_msgs / LaserScan消息的通用过滤器。这些过滤器被导出为旨在与过滤器包配合使用的插件。目前,所有这些过滤器都直接在sensor_msgs / LaserScan上运行,但是将来可能会添加过滤器,它将处理sensor_msgs / PointCloud。请查看过滤器文档,了解过滤器和过滤器链如何工作的概述。
该软件包提供两个节点,可以在内部运行多个过滤器。使用这些节点运行过滤器被认为是最佳实践,因为它允许多个节点消耗输出,而只执行一次过滤计算。节点是指定类型过滤器链的最小包装。该scan_to_scan_filter_chain应用一系列的过滤器,以一个sensor_msgs /激光扫描。所述scan_to_cloud_filter_chain第一施加一系列的过滤器,以一个sensor_msgs /激光扫描,将其转换为sensor_msgs /点云,然后应用一系列的过滤器到sensor_msgs /点云。
每个激光过滤器都是由laser_filters软件包导出的独立插件。这允许它们在配置文件中指定,该文件可以加载到传感器_msgs / LaserScan上模板化的任意filter_chain中。您可以在C ++(例子)中将激光滤镜实例化为filter_chain ,或者您可以在内部使用包含适当滤镜链的scan_to_scan_filter_chain和scan_to_cloud_filter_chain节点(示例)。
过滤器链从参数服务器进行配置。他们期望一个参数是一个由重复滤波器配置块组成的列表。这些应该几乎总是在.yaml文件中被指定,并被推送到参数服务器。链中指定的每个过滤器将按顺序应用。
各个滤波器配置包含一个名称,其用于调试目的,类型,其用于定位插件,和一个PARAMS这是额外的变量的字典。请查阅特定过滤器插件的文档以查看可以在params字段中设置哪些变量。
例如,在一个包,MYPKG,推出scan_to_scan_filter_chain有两个过滤器:LaserFilterClass1和LaserFilterClass2,你可以使用文件:
my_laser_config.yaml:
scan_filter_chain: - name: unique_name1 type: LaserFilterClass1 params: param1: a param2: b - name: unique_name2 type: LaserFilterClass2 params: param1: a param2: b
然后,您可以使用rosparam将此配置推送到参数服务器,方法是运行:
$ rosparam load my_laser_config.yaml scan_to_scan_filter_chain
然后启动scan_to_scan_filter_chain:
$ rosrun laser_filters scan_to_scan_filter_chain
scan_to_scan_filter_chain是一个非常小的节点,它封装了一个filters :: FilterChain
〜scan_filter_chain(列表)
[必需]要加载的激光过滤器列表。
〜tf_message_filter_target_frame(字符串)
在filter_chain执行前,当前时间必须存在变换的target_frame。这是内部传递给tf :: MessageFilter的target_frame 。如果没有设置此参数,那么在每次新扫描到达时,链将立即执行。
扫描(sensor_msgs / LaserScan)
scan_filtered(sensor_msgs / LaserScan)
my_laser_filter.launch:
name="laser_filter">
my_laser_config.yaml:
scan_filter_chain: - name: shadows type: ScanShadowsFilter params: min_angle: 10 max_angle: 170 neighbors: 20 window: 1 - name: dark_shadows type: LaserScanIntensityFilter params: lower_threshold: 100 upper_threshold: 10000 disp_histogram: 0
scan_to_cloud_filter_chain是一个包含filters :: FilterChain
〜scan_filter_chain(列表)
[必需]要加载的激光过滤器列表。
〜cloud_filter_chain(列表)
[必需的]要加载的云过滤器列表。
〜target_frame(字符串)
[必需的]将point_cloud转换为的帧。
〜high_fidelity(布尔,默认:false)
扫描(sensor_msgs / LaserScan)
cloud_filtered(sensor_msgs / PointCloud)
my_laser_cloud_filter.launch:
name="tilt_shadow_filter">
my_laser_config.yaml:
scan_filter_chain: - name: shadows type: ScanShadowsFilter params: min_angle: 10 max_angle: 170 neighbors: 20 window: 1 - name: dark_shadows type: LaserScanIntensityFilter params: lower_threshold: 100 upper_threshold: 10000 disp_histogram: 0
my_cloud_config.yaml:
cloud_filter_chain: - type: PR2PointCloudFootprintFilter name: footprint_filter params: inscribed_radius: 0.325
该过滤器内部使用浮点数组过滤器的过滤器实现。它会提取范围和强度值,并将它们视为通过内部过滤器链传递的独立浮点数组。
range_filter_chain(FilterChain)
嵌套的过滤器链描述,描述MultiChannelMedianFilterFloat类型过滤器的适当链。
intensity_filter_chain(FilterChain)
嵌套的过滤器链描述,描述MultiChannelMedianFilterFloat类型过滤器的适当链。
确保使用两个参数(range_filter_chain和intensity_filter_chain)
scan_filter_chain: - type: laser_filters/LaserArrayFilter name: laser_median_filter params: range_filter_chain: - name: median_5 type: filters/MultiChannelMedianFilterFloat params: number_of_observations: 5 unused: 10 intensity_filter_chain: - name: median_5 type: filters/MultiChannelMedianFilterFloat params: number_of_observations: 5 unused: 10
该滤镜可以去除扫描物体边缘时最有可能由遮盖效应引起的激光读数。对于任何两个点和,我们通过计算垂直的角度做到这一点。也就是说,假设激光的原点是,形成的角度。如果垂直角度小于特定的最小值或大于特定的最大值,则我们移除距离该点更远的所有邻居。
min_angle(双)
max_angle(双)
窗口(int)
邻居(int)
scan_filter_chain: - name: shadows type: ScanShadowsFilter params: min_angle: 10 max_angle: 170 neighbors: 20 window: 1
对于扫描中无效的任何测量,插值会出现一个测量值,它是周围良好值之间的插值。
没有
scan_filter_chain: - name: interpolation type: InterpolationFilter
此过滤器将删除sensor_msgs / LaserScan中强度大于upper_threshold或小于lower_threshold的所有测量值。通过将相应的范围值设置为range_max + 1(这被假定为错误情况)来“移除”这些点。
lower_threshold(双精度)
upper_threshold(双精度)
disp_histogram(int)
scan_filter_chain: - name: intensity type: LaserScanIntensityFilter params: lower_threshold: 8000 upper_threshold: 100000 disp_histogram: 0
此过滤器将删除sensor_msgs / LaserScan中大于upper_threshold或小于lower_threshold的所有测量值。通过将相应的范围值设置为NaN(假定为错误情况或lower_replacement_value / upper_replacement_value)来“移除”这些点。如果use_message_range_limits为true,则使用laserscan消息内的范围。
lower_threshold(双精度)
upper_threshold(双精度)
use_message_range_limits(布尔)
使用laserscan消息中的range_min和range_max值作为阈值。默认为false
lower_replacement_value(双)
所有测量值< lower_threshold使用此值。默认值:NaN
upper_replacement_value(double)
对所有测量> upper_threshold使用此值。默认值:NaN
scan_filter_chain: - name: range type: LaserScanRangeFilter params: use_message_range_limits: false lower_threshold: 0.3 upper_threshold: .inf lower_replacement_value: -.inf upper_replacement_value: .inf
这个过滤器通过改变最小和最大角度去除sensor_msgs / LaserScan中某些角度范围之外的点。
lower_angle(双)
upper_angle(双)
scan_filter_chain: - name: angle type: LaserScanAngularBoundsFilter params: lower_angle: -1.57 upper_angle: 1.57
此滤镜可消除某些角度范围内的sensor_msgs / LaserScan中的点。通过将相应的范围值设置为range_max + 1(这被假定为错误情况)来“移除”这些点。
lower_angle(双)
upper_angle(双)
scan_filter_chain: - name: angle type: LaserScanAngularBoundsFilterInPlace params: lower_angle: 0.685398163 upper_angle: 0.885398163
此过滤器可消除笛卡尔盒内sensor_msgs / LaserScan中的点。通过将相应的范围值设置为假定为错误情况的NaN来“移除”这些点。
box_frame(字符串)
tf frame_id
min_x(双)
max_x(双)
min_y(双)
max_y(双)
min_z(双)
max_z(双)
scan_filter_chain: - name: box type: LaserScanBoxFilter params: box_frame: scan_link min_x: -1.0 max_x: 1.0 min_y: -1.0 max_y: 1.0 min_z: -1.0 max_z: 1.0