ROS laser_filters

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_chainscan_to_cloud_filter_chain节点(示例)。

过滤器链从参数服务器进行配置。他们期望一个参数是一个由重复滤波器配置块组成的列表。这些应该几乎总是在.yaml文件中被指定,并被推送到参数服务器。链中指定的每个过滤器将按顺序应用。

各个滤波器配置包含一个名称,其用于调试目的,类型,其用于定位插件,和一个PARAMS这是额外的变量的字典。请查阅特定过滤器插件的文档以查看可以在params字段中设置哪些变量。

例如,在一个包,MYPKG,推出scan_to_scan_filter_chain有两个过滤器:LaserFilterClass1LaserFilterClass2,你可以使用文件:

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(laser_pipeline-0.5中的新增功能)

scan_to_scan_filter_chain是一个非常小的节点,它封装了一个filters :: FilterChain <sensor_msgs :: LaserScan>的实例在传入的激光扫描中,此节点可用于在此软件包中运行任何过滤器。如果设置了〜tf_message_filter_target_frame参数,它将在运行过滤器链之前等待激光器和target_frame之间的变换可用。

scan_to_scan_filter_chain.png

ROS参数

〜scan_filter_chain(列表)

  • [必需]要加载的激光过滤器列表。

〜tf_message_filter_target_frame(字符串)

  • 在filter_chain执行前,当前时间必须存在变换的target_frame。这是内部传递给tf :: MessageFilter的target_frame 如果没有设置此参数,那么在每次新扫描到达时,链将立即执行。

订阅的主题

扫描sensor_msgs / LaserScan

  • 传入的激光扫描进行过滤

发布的主题

scan_filteredsensor_msgs / LaserScan

  • 传出的过滤激光扫描

示例启动文件

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: 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

scan_to_cloud_filter_chain是一个包含filters :: FilterChain <sensor_msgs :: LaserScan>filters :: FilterChain <sensor_msgs :: PointCloud>实例的非常小的节点在传入的激光扫描中,此节点可用于在此软件包中运行任何过滤器。执行激光滤波之后,它将使用激光投影laser_geometry变换每个扫描到的点云。然后它将运行任何基于云的过滤,并最终发布生成的云。

scan_to_cloud_filter_chain.png

ROS参数

〜scan_filter_chain(列表)

  • [必需]要加载的激光过滤器列表。

〜cloud_filter_chain(列表)

  • [必需的]要加载的云过滤器列表。

〜target_frame(字符串)

  • [必需的]将point_cloud转换为的帧。

〜high_fidelity(布尔,默认:false)

  • 是否执行高保真度转换。这种方法假定激光扫描仪在捕获激光扫描时正在移动。如果目标帧设置为固定帧,则高保真度变换只能正确工作。

订阅的主题

扫描sensor_msgs / LaserScan

  • 传入的激光扫描进行过滤。

发布的主题

cloud_filteredsensor_msgs / PointCloud

  • 传出的过滤点云。

示例启动文件

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: 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

激光滤波器插件

LaserArrayFilter

该过滤器内部使用浮点数组过滤器过滤器实现。它会提取范围和强度值,并将它们视为通过内部过滤器链传递的独立浮点数组。

参数

range_filter_chainFilterChain

  • 嵌套的过滤器链描述,描述MultiChannelMedianFilterFloat类型过滤器的适当链

intensity_filter_chainFilterChain

  • 嵌套的过滤器链描述,描述MultiChannelMedianFilterFloat类型过滤器的适当链

确保使用两个参数(range_filter_chainintensity_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

ScanShadowsFilter

该滤镜可以去除扫描物体边缘时最有可能由遮盖效应引起的激光读数。对于任何两个点$$ P_1 $$$$ P_2 $$,我们通过计算垂直的角度做到这一点。也就是说,假设激光的原点是$$Ø$$,形成的角度$$ \ angle OP_1P_2 $$如果垂直角度小于特定的最小值或大于特定的最大值,则我们移除距离该点更远的所有邻居。

参数

min_angle

  • 最小垂直角度(度)

max_angle

  • 最大垂直角度(度)

窗口int

  • 考虑内部角度的连续测量次数

邻居int

  • 要移除的远端邻居的数量

示例配置

  • scan_filter_chain:
    - name: shadows
      type: ScanShadowsFilter
      params:
        min_angle: 10
        max_angle: 170
        neighbors: 20
        window: 1

InterpolationFilter

对于扫描中无效的任何测量,插值会出现一个测量值,它是周围良好值之间的插值。

参数

没有

示例配置

  • scan_filter_chain:
    - name: interpolation
      type: InterpolationFilter

LaserScanIntensityFilter

此过滤器将删除sensor_msgs / LaserScan中强度大于upper_threshold或小于lower_threshold的所有测量值通过将相应的范围值设置为range_max + 1(这被假定为错误情况)来“移除”这些点

参数

lower_threshold精度

  • 低于读数的强度值将被降低。

upper_threshold精度

  • 高于读数的强度值将被降低。

disp_histogramint

  • 是否将强度直方图写入标准输出。(0或1)

示例配置

  • scan_filter_chain:
    - name: intensity
      type: LaserScanIntensityFilter
      params:
        lower_threshold: 8000
        upper_threshold: 100000
        disp_histogram: 0

LaserScanRangeFilter

此过滤器将删除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_minrange_max值作为阈值。默认为false

lower_replacement_value

  • 所有测量值< lower_threshold使用此值默认值:NaN

upper_replacement_valuedouble

  • 对所有测量> 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

LaserScanAngularBoundsFilter

这个过滤器通过改变最小和最大角度去除sensor_msgs / LaserScan中某些角度范围之外的

参数

lower_angle

  • 最小角度(弧度)

upper_angle

  • 最大角度(弧度)

示例配置

  • scan_filter_chain:
    - name: angle
      type: LaserScanAngularBoundsFilter
      params:
        lower_angle: -1.57
        upper_angle: 1.57

LaserScanAngularBoundsFilterInPlace

此滤镜可消除某些角度范围内的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

LaserScanBoxFilter

此过滤器可消除笛卡尔盒内sensor_msgs / LaserScan中的点通过将相应的范围值设置为假定为错误情况的NaN来“移除”这些点。

参数

box_frame字符串

  • tf frame_id

min_x

  • 最小笛卡尔x

max_x

  • 最大笛卡尔x

min_y

  • 最小笛卡尔y

max_y

  • 最大笛卡尔y

min_z

  • 最小笛卡尔z

max_z

  • 最大笛卡尔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

猜你喜欢

转载自blog.csdn.net/fantasysolo/article/details/80732014
ROS