用于在使用sensor_msgs/LaserScan类型的2D平面激光扫描仪上运行的各种滤波器。
目录
scan_to_scan_filter_chain(laser_pipeline-0.5 中的新增功能)
概述
Laser_filters包的主要内容是一些用于处理sensor_msgs/LaserScan消息的通用过滤器。这些过滤器作为插件导出,旨在与过滤器包一起使用。目前,所有这些过滤器都直接在sensor_msgs/LaserScan上运行,但将来可能会添加过滤器来处理sensor_msgs/PointCloud。请查看过滤器文档,了解过滤器和过滤器链如何工作的概述。
该包提供了两个可以在内部运行多个过滤器的节点。使用这些节点来运行过滤器被认为是最佳实践,因为它允许多个节点使用输出,同时仅执行一次过滤计算。这些节点是给定类型的过滤器链的最小包装器。 scan_to_scan_filter_chain将一系列过滤器应用于sensor_msgs/LaserScan。 scan_to_cloud_filter_chain首先将一系列过滤器应用于sensor_msgs/LaserScan,将其转换为sensor_msgs/PointCloud ,然后将一系列过滤器应用于sensor_msgs/PointCloud。
使用激光滤镜
每个激光滤镜都是由 Laser_filters 包导出的单独插件。这允许它们在配置文件中指定,该配置文件可以加载到在sensor_msgs/LaserScan上模板化的任意filter_chain中。您可以将激光滤波器实例化为 C++ 中的 filter_chain(示例),也可以使用内部包含适当滤波器链的scan_to_scan_filter_chain和scan_to_cloud_filter_chain节点(示例)。
过滤器链是从参数服务器配置的。他们期望一个参数,该参数是由过滤器配置的重复块组成的列表。这些几乎应该总是在要推送到参数服务器的.yaml文件中指定。链中指定的每个过滤器将按顺序应用。
各个过滤器配置包含用于调试目的的名称、用于定位插件的类型以及作为附加变量字典的参数。请查阅特定过滤器插件的文档,了解可以在 params 字段中设置哪些变量。
请注意,类型应指定为pkg_name/FilterClass,因为如果仅使用FilterClass ,则在月球之前过滤器实现的匹配行为不一定与确切的名称匹配。
例如,在包mypkg中,要启动带有两个过滤器的scan_to_scan_filter_chain : LaserFilterClass1和LaserFilterClass2,您可以使用以下文件:
my_laser_config.yaml:
scan_filter_chain:
- name: unique_name1
type: mypkg/LaserFilterClass1
params:
param1: a
param2: b
- name: unique_name2
type: mypkg/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(laser_pipeline-0.5 中的新增功能)
scan_to_scan_filter_chain 是一个非常小的节点,它包装了filters::FilterChain<sensor_msgs::LaserScan>的实例。该节点可用于在传入的激光扫描上运行此包中的任何过滤器。如果设置了~tf_message_filter_target_frame参数,它将等待激光和target_frame之间的转换可用,然后再运行过滤器链。
ROS参数
~scan_filter_chain(列表)
-
[必需]要加载的激光滤镜列表。
~tf_message_filter_target_frame(字符串)
-
在执行 filter_chain 之前,当前时间必须存在一个 target_frame 的转换。这是内部传递给tf::MessageFilter 的target_frame 。如果未设置此参数,则链将在每次新扫描到达时立即执行。
订阅的主题
- 传入的激光扫描进行过滤
已发表的主题
扫描过滤(传感器消息/激光扫描)
- 输出过滤激光扫描
示例启动文件
my_laser_filter.launch:
<launch>
<node pkg="laser_filters" type="scan_to_scan_filter_chain"
name="laser_filter">
<rosparam command="load" file="$(find mypkg)/my_laser_config.yaml" />
<remap from="scan" to="base_scan" />
</node>
</launch>
my_laser_config.yaml:
scan_filter_chain:
- name: shadows
type: laser_filters/ScanShadowsFilter
params:
min_angle: 10
max_angle: 170
neighbors: 20
window: 1
- name: dark_shadows
type: laser_filters/LaserScanIntensityFilter
params:
lower_threshold: 100
upper_threshold: 10000
disp_histogram: 0
scan_to_cloud_filter_chain
scan_to_cloud_filter_chain 是一个非常小的节点,它包装了filters::FilterChain<sensor_msgs::LaserScan>和filters::FilterChain<sensor_msgs::PointCloud>的实例。该节点可用于在传入的激光扫描上运行此包中的任何过滤器。执行激光滤波后,它将使用Laser_geometry中的LaserProjection将每次扫描转换为点云。然后它将运行任何基于云的过滤,并最终发布生成的云。
ROS参数
~scan_filter_chain(列表)
-
[必需]要加载的激光滤镜列表。
~cloud_filter_chain(列表)
-
[必需]要加载的云过滤器列表。
〜目标帧(字符串)
-
[必需]将点云转换成的框架。
~high_fidelity(布尔值,默认值:false)
- 是否执行高保真变换。这种方法假设激光扫描仪在捕获激光扫描时正在移动。仅当目标帧设置为固定帧时,高保真变换才能正确工作。
订阅的主题
- 对传入的激光扫描进行过滤。
已发表的主题
cloud_filtered ( sensor_msgs/点云)
- 传出的过滤点云。
示例启动文件
my_laser_cloud_filter.launch:
<launch>
<node pkg="laser_filters" type="scan_to_cloud_filter_chain"
name="tilt_shadow_filter">
<rosparam command="load" file="$(find mypkg)/my_laser_config.yaml" />
<rosparam command="load" file="$(find mypkg)/my_cloud_config.yaml" />
<param name="high_fidelity" value="true" />
<param name="target_frame" type="string" value="base_link" />
<remap from="scan" to="tilt_scan" />
<remap from="cloud_filtered" to="tilt_scan_cloud_filtered" />
</node>
</launch>
my_laser_config.yaml:
scan_filter_chain:
- name: shadows
type: laser_filters/ScanShadowsFilter
params:
min_angle: 10
max_angle: 170
neighbors: 20
window: 1
- name: dark_shadows
type: laser_filters/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(过滤器链)
-
嵌套过滤器链描述,描述适当的MultiChannelMedianFilterFloat类型过滤器链。
强度过滤器链(过滤器链)
-
嵌套过滤器链描述,描述适当的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
扫描阴影过滤器
该过滤器消除了扫描物体边缘时很可能由遮蔽效应引起的激光读数。对于任意两点 p_1 和 p_2,我们通过计算垂直角来实现这一点。如果垂直角小于特定的最小值或大于特定的最大值,我们将删除比该点更远的所有邻居。
参数
最小角度(双精度)
- 最小垂直角(度)
最大角度(双精度)
- 最大垂直角度(度)
窗口(整数)
- 考虑内部角度的连续测量次数
邻居(整数)
- 要删除的较远邻居的数量
配置示例
scan_filter_chain:
- name: shadows
type: laser_filters/ScanShadowsFilter
params:
min_angle: 10
max_angle: 170
neighbors: 20
window: 1
插值滤波器
对于扫描中的任何无效测量,插值得出的测量结果是周围良好值之间的插值。
参数
没有任何
配置示例
scan_filter_chain:
- name: interpolation
type: laser_filters/InterpolationFilter
激光扫描强度滤光片
此过滤器从sensor_msgs/LaserScan中删除强度大于upper_threshold或小于lower_threshold的所有测量值。通过将相应的范围值设置为range_max + 1 来“删除”这些点,这被认为是错误情况。
参数
下限阈值(双精度)
- 强度值低于该值读数将会下降。
上限阈值(双精度)
- 强度值,高于该值读数将会下降。
显示直方图(int)
- 是否将强度直方图写入标准输出。 (0 或 1)
配置示例
scan_filter_chain:
- name: intensity
type: laser_filters/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,则使用激光扫描消息内的范围。
参数
下限阈值(双精度)
- 范围阈值下限
上限阈值(双精度)
- 范围上限
use_message_range_limits (布尔)
-
使用激光扫描消息中的range_min和range_max值作为阈值。默认为false
lower_replacement_value(双精度)
-
将此值用于所有 < lower_threshold的测量。默认值:NaN
upper_replacement_value(双精度)
-
将此值用于所有测量 > upper_threshold。默认值:NaN
配置示例
scan_filter_chain:
- name: range
type: laser_filters/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中某些角度范围之外的点。
参数
下角(双)
- 最小角度(弧度)
上角(双)
- 最大角度(弧度)
配置示例
scan_filter_chain:
- name: angle
type: laser_filters/LaserScanAngularBoundsFilter
params:
lower_angle: -1.57
upper_angle: 1.57
激光扫描角度边界过滤器就位
此过滤器删除sensor_msgs/LaserScan中某些角度范围内的点。通过将相应的范围值设置为range_max + 1 来“删除”这些点,这被认为是错误情况。
参数
下角(双)
- 最小角度(弧度)
上角(双)
- 最大角度(弧度)
配置示例
scan_filter_chain:
- name: angle
type: laser_filters/LaserScanAngularBoundsFilterInPlace
params:
lower_angle: 0.685398163
upper_angle: 0.885398163
激光扫描盒过滤器
此过滤器删除笛卡尔框内的sensor_msgs/LaserScan中的点。通过将相应的范围值设置为 NaN(假定为错误情况)来“删除”这些点。
参数
框框(字符串)
-
tf帧 ID
min_x(双精度)
- 最小笛卡尔 x
max_x(双精度)
- 最大笛卡尔 x
min_y(双精度)
- 最小笛卡尔 y
最大y(双)
- 最大笛卡尔 y
min_z(双精度)
- 最小笛卡尔 z
max_z(双精度)
- 最大笛卡尔 z
配置示例
scan_filter_chain:
- name: box
type: laser_filters/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
激光扫描散斑滤光片
此过滤器删除sensor_msgs/LaserScan中的异常值。此过滤器有两种可用的过滤方法。
通过将相应的范围值设置为 NaN 来“删除”这些点。
参数
过滤器类型(int)
- 过滤方式选择
- 0:基于范围的过滤(连续点之间的距离)
- 1:基于半径异常值搜索的欧氏过滤
最大范围(双精度)
- 仅考虑小于此范围的范围
最大范围差异(双精度)
-
距离:连续点之间的最大距离 - RadiusOutlier:点之间的最大距离
过滤器窗口(双)
- 最小邻居数
配置示例
scan_filter_chain:
- name: speckle_filter
type: laser_filters/LaserScanSpeckleFilter
params:
filter_type: 0
max_range: 2.0
max_range_difference: 0.1
filter_window: 2