使用碰撞监视器
概述
本教程介绍如何使用碰撞监视器和 Nav2 堆栈。根据本教程,您可以根据自己的环境和需求进行设置。
要求
假设 ROS2 和 Nav2 依赖包已在本地安装或构建。 请确保 Nav2 项目也在本地构建,因为它是在 构建与安装 中构建的。
配置碰撞监视器
碰撞监测节点有自己的 collision_monitor_node.launch.py
启动文件,并在 collision_monitor_params.yaml
文件中预设参数以供演示,但如果在实践中使用,将其添加到 Nav2 的主启动文件中是微不足道的。
为了演示,将创建两个形状 - 一个内部停止和一个放置在机器人前面的更大的减速边界框:
如果减速框内出现 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"
Note
可以使用圆形代替多边形,例如对于全向机器人的情况,碰撞可以从任何方向发生。但是,出于教程的需要,我们将重点放在多边形上。出于同样的原因,我们将 Approach 模型排除在范围之外。这两种情况都可以通过参考 碰撞监测 配置指南轻松启用。
本教程中的两种多边形形状都是静态设置的。但是,可以使用包含多边形或轮廓顶点的主题消息随时间动态调整它们。有关更多信息,请参阅配置指南。
对于工作配置,至少应添加一个数据源。 在当前演示中,它使用激光扫描仪(尽管“PointCloud2”和Range/Sonar/IR传感器也是可能的),它由以下几行描述碰撞监视器节点:
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_smoothed"
cmd_vel_out_topic: "cmd_vel"
transform_tolerance: 0.5
source_timeout: 5.0
stop_pub_timeout: 2.0
enable_stamped_cmd_vel: False
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"
使用速度多边形配置碰撞监视器
在本教程的这一部分,我们将使用“VelocityPolygon”类型设置碰撞监视器,以执行“停止”操作。“VelocityPolygon”允许用户设置多个多边形以覆盖机器人的速度限制范围。例如,用户可以配置不同的多边形以进行旋转、向前移动或向后移动。碰撞监视器将根据每个子多边形检查机器人的速度,以确定用于碰撞检查的适当多边形。
一般来说,以下是使用“VelocityPolygon”类型配置碰撞监视器的步骤:
将“VelocityPolygon”添加到“polygons”参数列表
配置“VelocityPolygon”
指定多边形的“holonomic”属性(默认为“false”)
首先在“velocity_polygons”列表中添加一个“stopped”子多边形,以覆盖机器人速度限制的全部范围
在“velocity_polygons”列表的前面添加额外的子多边形,以覆盖机器人每种运动类型(例如旋转、向前移动、向后移动)的速度限制范围
在这个例子中,我们将考虑一个**非完整**机器人,其线速度限制为 -1.0
到 1.0
m/s,角速度限制为 -1.0
到 1.0
rad/s。子多边形的 linear_min
和 linear_max
参数应设置为机器人的线速度限制,而 theta_min
和 theta_max
参数应设置为机器人的角速度限制。
以下是使用 4 个子多边形覆盖机器人速度限制的全部范围的示例配置:
polygons: ["VelocityPolygonStop"]
VelocityPolygonStop:
type: "velocity_polygon"
action_type: "stop"
min_points: 6
visualize: True
enabled: True
polygon_pub_topic: "velocity_polygon_stop"
velocity_polygons: ["rotation", "translation_forward", "translation_backward", "stopped"]
holonomic: false
rotation:
points: "[[0.3, 0.3], [0.3, -0.3], [-0.3, -0.3], [-0.3, 0.3]]"
linear_min: 0.0
linear_max: 0.05
theta_min: -1.0
theta_max: 1.0
translation_forward:
points: "[[0.35, 0.3], [0.35, -0.3], [-0.2, -0.3], [-0.2, 0.3]]"
linear_min: 0.0
linear_max: 1.0
theta_min: -1.0
theta_max: 1.0
translation_backward:
points: "[[0.2, 0.3], [0.2, -0.3], [-0.35, -0.3], [-0.35, 0.3]]"
linear_min: -1.0
linear_max: 0.0
theta_min: -1.0
theta_max: 1.0
# This is the last polygon to be checked, it should cover the entire range of robot's velocities
# It is used as the stopped polygon when the robot is not moving and as a fallback if the velocity
# is not covered by any of the other sub-polygons
stopped:
points: "[[0.25, 0.25], [0.25, -0.25], [-0.25, -0.25], [-0.25, 0.25]]"
linear_min: -1.0
linear_max: 1.0
theta_min: -1.0
theta_max: 1.0
建议将“已停止”子多边形作为“velocity_polygons”列表中的最后一个条目,以覆盖机器人速度限制的整个范围。如果速度不在任何子多边形的范围内,碰撞监视器将记录一条警告消息并继续使用之前匹配的多边形。
当速度被多个子多边形覆盖时,将使用列表中的第一个子多边形。
For holomic robots:
对于全息机器人,holonomic
属性应设置为 true
。在这种情况下,linear_min
和 linear_max
参数应涵盖机器人的合成速度限制,而 theta_min
和 theta_max
参数应涵盖机器人的角速度限制。此外,还有 2 个参数 direction_start_angle
和 direction_end_angle
用于指定合成速度方向。覆盖的方向将始终以**逆时针**方向从 direction_start_angle
跨越到 direction_end_angle
。
下面显示了完整机器人的一些常见配置,这些配置涵盖了合成速度的多个方向:
演示执行
一旦调整了碰撞监控节点并调整了“cmd_vel”主题,碰撞监控节点就可以运行了。 为此,请按照 :ref:“getting_started” 中所述运行 Nav2 堆栈:
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
在并行控制台中,使用启动文件启动 Collision Monitor 节点:
ros2 launch nav2_collision_monitor collision_monitor_node.launch.py
由于“PolygonStop”和“PolygonSlow”多边形都有自己的发布者,因此可以将它们添加到可视化中,如下图所示:
设置初始姿势,然后将 Nav2 目标放在地图上。 机器人将开始移动,在障碍物附近运行时减速,并在靠近障碍物时停止: