2.2.2 雷达过滤器应用

本节我们将通过两个案例来演示laser_filters功能包的基本使用。

1.准备工作

首先请创建一个功能包,指令如下:

ros2 pkg create mycar_laser_filters --dependencies laser_filters

然后在功能包下新建launch与params目录,并修改功能包下的CMakeLists.txt文件,添加如下代码:

install(DIRECTORY params launch DESTINATION share/${PROJECT_NAME})

准备工作完毕,接下来就可以进入案例部分了。

2.过滤无效数据

(1)需求

请过滤在激光雷达扫描过程中由于车身遮挡产生的无效数据,已知围绕雷达,车身上安装有四个支柱,四个支柱的扫描结果应视为无效。过滤前,如下图所示,雷达附近包含四个支柱的扫描数据。过滤后,如下图所示,去除了四个支柱的扫描数据。

(2)实现

该需求可以借助于LaserScanBoxFilter 插件实现,具体步骤如下。

①.编写launch文件,在功能包的launch目录下,新建mycar_laser_box_filter.launch.py文件,并输入如下内容:

from launch import LaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory


def generate_launch_description():
    # 去除一个立方体内扫描到的数据。
    return LaunchDescription([
        Node(
            package="laser_filters",
            executable="scan_to_scan_filter_chain",
            parameters=[
                PathJoinSubstitution([
                    get_package_share_directory("mycar_laser_filters"),
                    "params", "box_filter.yaml",
                ])],
        )
    ])

②.再编写配置文件,在功能包的params目录下,新建box_filter.yaml文件,并输入如下内容:

scan_to_scan_filter_chain:
  ros__parameters:
    filter1:
      name: box_filter
      type: laser_filters/LaserScanBoxFilter
      params:
        box_frame: base_footprint #参考坐标系
        max_x: 0.20
        max_y: 0.15
        max_z: 0.5
        min_x: -0.20
        min_y: -0.15
        min_z: 0.0
        # max_x、max_y、max_z、min_x、min_y、min_z声明了不同维度上的最大取值与最小取值,可用于标注立方体。
        invert: false # 是否反转,如果设置为 true,那么会只保留立方体内的数据。

③.最后构建并执行,执行时,需要先执行底盘与雷达相集成launch文件,再执行当前自实现的launch文件。启动rviz2添加两个laser_scan插件,一个订阅的话题为/scan,它会显示原生的雷达消息,另一个订阅的话题为/scan_filtered,它会显示过滤后的雷达消息(为了不混淆,两个插件不建议同时启用)。

3.设置雷达有效范围

(1)需求

请根据范围区间过滤雷达数据,雷达有效采集范围为0.2到4.0米,超出此范围视为无效。过滤前的数据如下图所示。

过滤后,去除了指定范围外的数据。

(2)实现

该需求可以借助于LaserScanRangeFilter 插件实现,具体步骤如下。

①.首先,编写launch文件,在功能包的launch目录下,新建mycar_laser_scan_range_filter.launch.py文件,并输入如下内容:

from launch import LaunchDescription
from launch.substitutions import PathJoinSubstitution
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory


def generate_launch_description():
    # 去除超出指定范围的数据。
    return LaunchDescription([
        Node(
            package="laser_filters",
            executable="scan_to_scan_filter_chain",
            parameters=[
                PathJoinSubstitution([
                    get_package_share_directory("mycar_laser_filters"),
                    "params", "scan_range_filter.yaml",
                ])],
        )
    ])

②.然后,再编写配置文件,在功能包的params目录下,新建scan_range_filter.yaml文件,并输入如下内容:

scan_to_scan_filter_chain:
  ros__parameters:
    filter1:
      name: range_filter
      type: laser_filters/LaserScanRangeFilter
      params:
        use_message_range_limits: false   
        lower_threshold: 0.2              # 最小阈值,默认0.0
        upper_threshold: 4.0              # 最大阈值,默认100000.0
        lower_replacement_value: -.inf    # 小于最小阈值时的替换值,默认NaN
        upper_replacement_value: .inf     # 大于最大阈值时的替换值,默认NaN

③.最后构建并执行,执行时,同案例1一样,需要先执行底盘与雷达相集成launch文件,再执行当前自实现的launch文件。启动rviz2添加两个laser_scan插件,一个订阅的话题为/scan,它会显示原生的雷达消息,另一个订阅的话题为/scan_filtered,它会显示过滤后的雷达消息(为了不混淆,两个插件不建议同时启用)。

results matching ""

    No results matching ""