碰撞监控

碰撞监视器是一个提供额外机器人安全级别的节点。它使用传感器的输入数据执行几个与避碰相关的任务,绕过代价地图和轨迹规划器,监视并防止紧急停止级别的潜在碰撞。

这类似于安全传感器和硬件功能;从实时认证的安全扫描仪获取激光扫描数据,检测是否存在即将发生的碰撞,并通过紧急停止认证的机器人控制器或减速机器人来避免此类碰撞。但是,此节点是在CPU级别上使用任何形式的传感器完成的。因此,它不提供硬实时的安全认证,但对于没有安全等级激光传感器、安全等级控制器或希望使用任何类型的数据输入(例如深度或立体或距离传感器的点云)的用户,它使用相同类型的技术和数据。

这是大型重型工业机器人或以高速移动的机器人与人员或其他动态实体(例如其他机器人)之间的安全机制的有用且必要的一部分。代价地图/轨迹规划器将处理大多数情况,但该节点用于处理几乎突然出现的障碍物(从机器人的角度来看),或者以如此高的速度接近机器人,以至于需要立即停止以防止碰撞。

请参阅软件包的“README”以获取更完整的信息。

特点

碰撞监控使用相对于机器人的基本框架原点的多边形来定义“区域”。落入这些区域的数据将触发相应的操作,具体取决于所使用的模型。一个给定的碰撞监控实例可以同时具有多个具有不同模型的区域。当多个区域同时触发时,使用最激进的区域(例如停止 > 减速 50% > 减速 10%)

碰撞监测器使用以下安全行为模型:

  • 停止模型:定义一个区域和一个点阈值。如果在该区域内出现``min_points``或更多的障碍点,则停止机器人直到障碍物消失。

  • 减速模型:在机器人周围定义一个区域,并根据区域内出现的点数是否达到``min_points``或更多来降低最大速度的``slowdown_ratio``。

  • 限制模型:定义一个围绕机器人的区域,并将最大线性速度和最大角速度限制为``linear_limit``和``angular_limit``的值,如果在该区域内出现``min_points``或更多点。

  • 接近模型:根据当前机器人速度,估算与传感器数据的碰撞时间。如果时间小于``time_before_collision``秒(例如0.5、2、5等),机器人将减速,以确保与碰撞的时间至少为``time_before_collision``秒。其效果是使机器人始终与任何碰撞保持``time_before_collision``秒的距离。

围绕机器人的区域可以采用以下形状:

  • 机器人基准坐标系下的任意用户定义多边形,可以在配置文件中静态定义,也可以通过主题接口进行动态变化。

  • 机器人足迹多边形,仅在接近行为模型中使用。将使用静态用户定义的多边形或足迹主题,以便随时间动态调整。

  • 圆形:为了获得最佳性能,可以在区域或机器人外形可以近似为圆形的情况下使用。

所有形状(Polygon``和``Circle)都是从基本的``Polygon``类派生而来,所以不失一般性地可以称为“多边形”。订阅的足迹也具有与其他多边形相同的属性,但它通过足迹主题获得用于接近模型。

数据可以从不同的数据源获取:

  • 激光扫描仪(``sensor_msgs::msg::LaserScan``消息)

  • 点云(``sensor_msgs::msg::PointCloud2``消息)

  • 红外/声纳(``sensor_msgs::msg::Range``消息)

参数

base_frame_id

类型

默认

string

"base_footprint"

描述:

机器人基准坐标系。

odom_frame_id

类型

默认

string

"odom"

描述:

用于里程计的帧。

cmd_vel_in_topic

类型

默认

string

"cmd_vel_raw"

描述:

输入期望机器人速度的``cmd_vel``主题。

cmd_vel_out_topic

类型

默认

string

"cmd_vel"

描述:

输出带有碰撞监视器生成的速度的"cmd_vel"主题。

状态主题

类型

默认

string

""

描述:

输出当前激活的多边形动作类型和名称。可选参数。如果未指定,将不会创建发布者。

transform_tolerance

类型

默认

双精度

0.1

描述

发布变换时用于后期日期的时间,以表明该变换在未来是有效的。

源超时

类型

默认

双精度

2.0

描述:

源数据被视为有效的最大时间间隔。

基准位移校正

类型

默认

布尔值

True

描述:

是否根据当前时间和最新源时间的差异,将源数据校正为基准框架运动。如果启用,会在机器人基准框架中产生更准确的源位置,但性能会减慢。这将导致每个"cmd_vel"计算周期平均延迟约为"~1/(2*odom_rate)"。然而,对于高速移动的机器人,不推荐禁用此选项以获得更好的性能,因为在典型的数据源速率下,机器人可能移动得不可接受远。因此,建议使用合理的里程计速率(~100 Hz)。

停止发布超时

类型

默认

双精度

1.0

描述:

超时时间,超过此时间,零速度将停止发布。它可以用于在Nav2之外的其他被覆盖系统试图将机器人从接近碰撞状态中解救出来,或者允许一个静止的机器人进入睡眠模式。

多边形

类型

默认

字符串向量

N/A

描述:

区域列表(停止/减速/限制边界框,足迹,接近圆等)。如果未进行专门设置,将导致错误。

观测源

类型

默认

字符串向量

N/A

描述:

数据源列表(激光扫描仪,点云等)。如果未进行专门设置,将导致错误。

多边形参数

<polygon name> 是为此类型选择的相应多边形名称ID。

<polygon_name>.type

类型

默认

string

N/A

描述:

多边形形状的类型。可用的值为 polygoncircle。如果未进行专门设置,将导致错误。

<polygon_name>.points

类型

默认

vector<double>

N/A

描述:

多边形的顶点,以 {p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, ...} 的格式列出(例如,正方形的格式为 {0.5, 0.25, 0.5, -0.25, 0.0, -0.25, 0.0, 0.25})。用于``polygon``类型。三角形多边形至少需要3个顶点。如果未指定,则碰撞监视器将使用动态多边形订阅``polygon_sub_topic``中的顶点,用于``stop``/slowdown/``limit``操作类型,或者使用足迹订阅器``footprint_topic``中的顶点,用于``approach``操作类型。

<polygon_name>.polygon_sub_topic

类型

默认

string

N/A

描述:

从中接收多边形顶点的主题。仅适用于``polygon``类型和``stop``/slowdown/limit``操作类型。如果未指定**且**顶点也未指定,将导致错误。如果同时指定了``points``和``polygon_sub_topic,则静态``points``优先级较高。

<polygon_name>.footprint_topic

类型

默认

string

"local_costmap/published_footprint"

描述:

从中接收机器人足迹的主题。仅适用于``polygon``类型和``approach``操作类型。如果同时指定了``points``和``footprint_topic``,则静态``points``优先级较高。

<polygon_name>.radius

类型

默认

双精度

N/A

描述:

圆的半径。用于``circle``类型。如果未指定,将导致错误。

<polygon_name>.action_type

类型

默认

string

N/A

描述:

区域行为模型。可用的值为``stop``、slowdownlimitapproach。如果未指定,将导致错误。

<polygon_name>.min_points

类型

默认

int

4

描述:

在区域内触发动作所需的最少数据读数。之前的``max_points``参数是指在区域内不触发动作所需的最大数据读数。``min_points``等于``max_points + 1``的值。

<polygon_name> 的减速比

类型

默认

双精度

0.5

描述:

机器人减速(相对于其实际速度的比例)。适用于``slowdown``动作类型。

<polygon_name> 的线性限制

类型

默认

双精度

0.5

描述:

机器人线速度限制。适用于``limit``动作类型。

<polygon_name> 的角度限制

类型

默认

双精度

0.5

描述:

机器人角速度限制。适用于“限制”动作类型。

<polygon_name> 的碰撞前时间

类型

默认

双精度

2.0

描述:

碰撞前的时间,以秒为单位。用于碰撞预测的最大仿真时间。较大的值意味着较低的性能。适用于“接近”动作类型。

<polygon_name> 的模拟时间步长

类型

默认

双精度

0.1

描述:

用于碰撞预测期间机器人移动仿真的时间迭代步长。较小的值意味着较低的预测准确性但更好的性能。适用于“接近”动作类型。

<polygon_name> 的可视化

类型

默认

布尔值

False

描述:

是否将多边形发布到单独的主题中。

<polygon_name>.polygon_pub_topic

类型

默认

string

<多边形名称>

描述:

发布多边形的主题名称。仅在``visualize``为true时使用。

观测源参数

``<source name>``是为此类型选择的相应数据源名称ID。

<源名称>.type

类型

默认

string

"scan"

描述:

多边形形状的类型。可以是``scan``,pointcloud``或``range

<source name>.topic

类型

默认

string

"scan"

描述:

要监听源数据的主题。

<source name>.min_height

类型

默认

双精度

0.05

描述:

将PointCloud投影到2D空间的起始最小高度。适用于``pointcloud``类型。

<source name>.max_height

类型

默认

双精度

0.5

描述:

将PointCloud投影到2D空间的结束最大高度。适用于``pointcloud``类型。

<source name>.obstacles_angle

类型

默认

双精度

PI / 180(1度)

描述:

在距离弧线上的附近障碍点之间的角度增量(以弧度表示)。不考虑视野范围内的两个最外层点(无论该值如何,它们总是存在)。适用于“range”类型。

示例

下面是Collision Monitor的配置YAML示例。要了解如何启动自己的Collision Monitor节点的更多信息,请参考:ref:`collision_monitor_tutorial`教程。

collision_monitor:
  ros__parameters:
    base_frame_id: "base_footprint"
    odom_frame_id: "odom"
    cmd_vel_in_topic: "cmd_vel_raw"
    cmd_vel_out_topic: "cmd_vel"
    state_topic: "collision_monitor_state"
    transform_tolerance: 0.5
    source_timeout: 5.0
    base_shift_correction: True
    stop_pub_timeout: 2.0
    polygons: ["PolygonStop", "PolygonSlow", "FootprintApproach"]
    PolygonStop:
      type: "circle"
      radius: 0.3
      action_type: "stop"
      min_points: 4  # max_points: 3 for Humble
      visualize: True
      polygon_pub_topic: "polygon_stop"
    PolygonSlow:
      type: "polygon"
      points: [1.0, 1.0, 1.0, -1.0, -0.5, -1.0, -0.5, 1.0]
      action_type: "slowdown"
      min_points: 4  # max_points: 3 for Humble
      slowdown_ratio: 0.3
      visualize: True
      polygon_pub_topic: "polygon_slowdown"
    PolygonLimit:
      type: "polygon"
      points: [0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5]
      action_type: "limit"
      min_points: 4  # max_points: 3 for Humble
      linear_limit: 0.4
      angular_limit: 0.5
      visualize: True
      polygon_pub_topic: "polygon_limit"
    FootprintApproach:
      type: "polygon"
      action_type: "approach"
      footprint_topic: "/local_costmap/published_footprint"
      time_before_collision: 2.0
      simulation_time_step: 0.02
      min_points: 6  # max_points: 5 for Humble
      visualize: False
    observation_sources: ["scan", "pointcloud"]
    scan:
      type: "scan"
      topic: "/scan"
    pointcloud:
      type: "pointcloud"
      topic: "/intel_realsense_r200_depth/points"
      min_height: 0.1
      max_height: 0.5