使用碰撞监视器

../../_images/collision_monitor.gif

概述

本教程展示了如何在Nav2堆栈中使用碰撞监视器。基于本教程,您可以为您的环境和需求进行设置。

要求

假设已安装或在本地构建了 ROS2 和 Nav2 的依赖包。请确保 Nav2 项目也在本地构建,就像 构建和安装 中所述。

配置碰撞监视器

碰撞监视器节点具有自己的``collision_monitor_node.launch.py``启动文件和``collision_monitor_params.yaml``文件中的预设参数,用于演示,但如果在实际应用中使用,将其添加到Nav2的主启动文件中非常简单。在演示中,将创建两个形状-一个内部停止框和一个较大的减速框,放置在机器人的前方:

../../_images/polygons.png

如果在减速区域内出现超过3个点,机器人将将其速度降低到其值的``30%``。对于障碍物与机器人危险接近的情况,将启用内部停止区域。为了进行此设置,应将以下行添加到``collision_monitor_params.yaml``参数文件中。停止区域被命名为``PolygonStop``,减速包围盒被命名为``PolygonSlow``:

polygons: ["PolygonStop", "PolygonSlow"]
PolygonStop:
  type: "polygon"
  points: [0.4, 0.3, 0.4, -0.3, 0.0, -0.3, 0.0, 0.3]
  action_type: "stop"
  min_points: 4  # max_points: 3 for Humble
  visualize: True
  polygon_pub_topic: "polygon_stop"
PolygonSlow:
  type: "polygon"
  points: [0.6, 0.4, 0.6, -0.4, 0.0, -0.4, 0.0, 0.4]
  action_type: "slowdown"
  min_points: 4  # max_points: 3 for Humble
  slowdown_ratio: 0.3
  visualize: True
  polygon_pub_topic: "polygon_slowdown"

注解

圆形形状可以替代多边形,例如对于全向机器人的情况,碰撞可能发生在任何方向。然而,对于教程的需要,让我们将视野集中在多边形上。出于同样的原因,我们不讨论Approach模型。可以通过参考:ref:`configuring_collision_monitor`配置指南轻松启用这两种情况。

注解

教程中的两个多边形形状都是静态设置的。然而,可以通过包含多边形或足迹的顶点点的主题消息来动态调整它们的时间。有关更多信息,请参阅配置指南。

对于工作配置,至少应添加一个数据源。在当前演示中,使用激光扫描仪(虽然``PointCloud2``和范围/声纳/红外传感器也是可能的),它由以下行描述了碰撞监视器节点的情况:

observation_sources: ["scan"]
scan:
  type: "scan"
  topic: "scan"

设置主题名称、帧ID和超时时间,以便与默认的Nav2设置正确配合使用。在这种情况下,整个``nav2_collision_monitor/params/collision_monitor_params.yaml``文件将如下所示:

collision_monitor:
  ros__parameters:
    use_sim_time: True
    base_frame_id: "base_footprint"
    odom_frame_id: "odom"
    cmd_vel_in_topic: "cmd_vel_raw"
    cmd_vel_out_topic: "cmd_vel"
    transform_tolerance: 0.5
    source_timeout: 5.0
    stop_pub_timeout: 2.0
    polygons: ["PolygonStop", "PolygonSlow"]
    PolygonStop:
      type: "polygon"
      points: [0.4, 0.3, 0.4, -0.3, 0.0, -0.3, 0.0, 0.3]
      action_type: "stop"
      min_points: 4  # max_points: 3 for Humble
      visualize: True
      polygon_pub_topic: "polygon_stop"
    PolygonSlow:
      type: "polygon"
      points: [0.6, 0.4, 0.6, -0.4, 0.0, -0.4, 0.0, 0.4]
      action_type: "slowdown"
      min_points: 4  # max_points: 3 for Humble
      slowdown_ratio: 0.3
      visualize: True
      polygon_pub_topic: "polygon_slowdown"
    observation_sources: ["scan"]
    scan:
      type: "scan"
      topic: "scan"

准备Nav2堆栈

碰撞监视器被设计为在Nav2之下作为独立的安全节点运行。它作为对控制器服务器输出的``cmd_vel``主题的过滤器。如果没有触发这样的区域,则使用控制器的``cmd_vel``。否则,它将根据需要进行缩放或停止设置。为了使碰撞监视器与控制器正确运行,需要将``cmd_vel -> cmd_vel_raw``重映射添加到下面所示的``navigation_launch.py``启动脚本中:

Node(
    package='nav2_controller',
    executable='controller_server',
    output='screen',
    respawn=use_respawn,
    respawn_delay=2.0,
    parameters=[configured_params],
+   remappings=remappings + [('cmd_vel', 'cmd_vel_raw')]),
...
ComposableNode(
    package='nav2_controller',
    plugin='nav2_controller::ControllerServer',
    name='controller_server',
    parameters=[configured_params],
+   remappings=remappings + [('cmd_vel', 'cmd_vel_raw')]),

请注意,重新映射的``cmd_vel_raw``话题应与碰撞监视器节点的输入速度``cmd_vel_in_topic``参数值匹配,输出速度``cmd_vel_out_topic``参数值应为实际的``cmd_vel``以适应替换。

演示执行

一旦调整了碰撞监视器节点和``cmd_vel``话题的映射,碰撞监视器节点就准备好运行了。为此,请按照:ref:`getting_started`中的说明运行Nav2堆栈:

ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False

在并行控制台中,使用其启动文件启动碰撞监视器节点:

ros2 launch nav2_collision_monitor collision_monitor_node.launch.py

由于``PolygonStop``和``PolygonSlow``多边形将有自己的发布器,可以将它们添加到可视化中,如下图所示:

../../_images/polygons_visualization.png

设置初始姿态,然后将Nav2目标放在地图上。机器人将开始移动,在靠近障碍物时减速,并在接近障碍物时停止:

../../_images/collision.png