设置机器人的足迹

在本指南中,我们将讨论如何为 Nav2 使用的导航算法配置机器人的足迹。我们还将展示 sam_bot 的示例足迹配置,这是我们在本系列设置指南中构建的模拟机器人。最后,我们还将在 RViz 中展示“sam_bot”足迹的可视化,以确保我们已正确设置它。

足迹介绍

足迹勾勒出机器人投射到地面时的 2D 形状,主要用于 Nav2 在规划期间避免碰撞。此任务中涉及的算法确保机器人在计算机器人的路径或计划时不会与代价地图中的障碍物发生碰撞。

使用我们在之前的教程中处理的全局和局部代价地图的“footprint”或“robot_radius”参数设置足迹(设置传感器指南)。 footprint 参数中定义的值是一个有序的二维点向量,以 base_link 框架为原点定义机器人的足迹。向量中的第一个点和最后一个点连接到最后一个线段以闭合足迹的形状。或者,您也可以使用 robot_radius 参数,其中会自动生成圆形足迹并以 base_link 为中心。如果在配置中同时定义了 footprintrobot_radius 参数,则使用 footprint

See also

上一指南中的一节 配置 nav2_costmap_2d 解释了如何配置基本的代价地图参数。有关代价地图配置的更多详细信息,请参阅该指南。

对于全局代价地图覆盖区,在 ``robot_radius``(圆形)或 ``footprint``(多边形)参数之间进行选择的决定取决于机器人、其环境以及您将使用的路径规划算法。即使您使用的是非圆形机器人,也可能存在可以接受圆形覆盖区的情况。例如,路径规划算法(如 NavFn)假设机器人是圆形的,因为它只检查每个网格单元的碰撞,因此无需为其覆盖区勾勒出机器人的确切形状。另一方面,如果可能且必要,诸如 Smac Planner 的 Hybrid-A* 之类的算法会在机器人的多边形覆盖区上执行碰撞检查。因此,使用多边形覆盖区可能会很有用。另一个例子是让一个小型遥控车大小的机器人在仓库里漫游。这个机器人非常小,不需要进行狭窄的机动——因此用最大的横截面半径来近似它是一种很好的省时优化。

对于局部代价地图覆盖区,非圆形机器人通常设置“覆盖区”(多边形)。在某些情况下不建议这样做,例如当您没有足够的计算资源在多边形覆盖区上实施防撞算法时。使用 ``robot_radius``(圆形)作为局部代价地图的另一个可能原因是,机器人相对于其环境非常小,因此不需要精确的碰撞避免。但是,通常局部轨迹规划器应使用机器人的实际足迹多边形。

请注意,这也可以使用代价地图的 ~/footprint 主题随时间进行调整,该主题将根据机器人状态的变化(例如连接的机械手的移动、拾起托盘或其他调整机器人形状的操作)随时间更新多边形。然后,规划器和控制器将自动使用该多边形。

配置机器人的足迹

在本节中,我们将配置 sam_bot 的足迹,以便 ``footprint``(多边形)用于局部代价地图,``robot_radius``(圆形)用于全局代价地图。我们将利用 Nav2 的默认配置文件,并修改全局和局部代价地图的覆盖参数。

Note

sam_bot 的完整源代码可以在 navigation2_tutorials 存储库中找到。

config 目录下,创建一个名为 nav2_params.yaml 的新文件。接下来,复制 config/nav2_params.yaml 的内容并将其粘贴到新创建的文件中。 config/nav2_params.yaml 的内容是从 Nav2 的默认配置文件复制而来,但 footprintrobot_radius 参数有所变化,以匹配 sam_bot 的形状。

See also

Nav2 的默认配置文件可以在官方 Navigation2 存储库 中找到。

以下是来自 nav2_params.yaml 的代码片段,用于定义本地 costmap 足迹。在这个配置文件中,局部代价地图的 footprint 参数已经设置了一个矩形的足迹。这个框以 sam_botbase_link 框架为中心。

188resolution: 0.05
189footprint: "[ [0.21, 0.195], [0.21, -0.195], [-0.21, -0.195], [-0.21, 0.195] ]"
190plugins: ["voxel_layer", "inflation_layer"]

对于全局代价地图,我们已经设置了 robot_radius 参数,以创建一个与 sam_bot 大小匹配并以 base_link 为中心的圆形覆盖区。修改后的参数显示在下面的代码片段中。

232use_sim_time: True
233robot_radius: 0.3
234resolution: 0.05

构建、运行和验证

我们现在将确认我们已正确设置 ``sam_bot``的足迹。

首先,我们启动 launch/display.launch.py​​ 以启动机器人状态发布者,在 Gazebo 中生成 sam_bot ,并在 Rviz 中可视化 sam_bot 及其足迹。机器人状态发布者发布在“sam_bot”的 URDF 中定义的 base_link => sensors 变换,而 Gazebo 的差分驱动插件发布 odom => base_link 变换。打开一个新终端并执行以下几行。

colcon build
. install/setup.bash
ros2 launch sam_bot_description display.launch.py

启动 display.launch.py 后,RViz 和 Gazebo 应该会打开。RViz 应该会显示 sam_botsam_bot 部件的框架和 odom 框架,并且不会出现错误。Gazebo 应该会显示 sam_bot ,其中包含一个球体和一个立方体,可被 sambot 的激光雷达传感器检测到。

接下来,我们将使用 static_transform_publisher 发布 map => ``odom``变换。在本指南中,我们将“map”=>“odom”变换发布为静态,这是发布变换和可视化足迹的简单方法。打开一个新终端并执行以下几行。

ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map odom

现在应该发布 map => odom 转换,并且应该在 RViz 中添加 map 框架而不会出现错误。

最后,我们将使用刚刚创建的 nav2_params.yaml 配置文件和 nav2_bringup 内置启动文件 navigation_launch.py 启动Nav2。打开一个新终端并执行以下操作:

ros2 launch nav2_bringup navigation_launch.py params_file:=<full/path/to/config/nav2_params.yaml>

我们现在应该能够在 RViz 中可视化足迹,这将在下一节中讨论。

在 RViz 中可视化足迹

要可视化局部代价地图的足迹,请点击 RViz 窗口左下方的添加按钮。在 By topic``选项卡下,选择 ``/local_costmap/published_footprint 主题下的 Polygon ,如下所示。

../../_images/add_topic_local_costmap.png

将 RViz 中的固定框架设置为 odom ,您应该会看到 ``sam_bot``的矩形足迹:

../../_images/polygon_footprint.png

另一方面,对于全局成本地图,单击 RViz 窗口左下方的添加按钮。转到 By topic 选项卡,然后选择 /global_costmap/published_footprint 主题下的 Polygon ,如下所示。

../../_images/add_topic_global_costmap.png

将 RViz 中的固定框架设置为 map ,您应该会看到 sam_bot 的圆形足迹:

../../_images/circular_footprint.png

结论

在本指南中,我们展示了如何为您的机器人配置圆形和多边形的足迹。此足迹非常重要,因为它在 Nav2 的寻路算法功能中起着重要作用。

作为演示,我们配置了“sam_bot”的成本地图足迹参数。我们将本地成本地图设置为使用遵循 sam_bot 形状的多边形足迹,同时将全局成本地图设置为使用圆形足迹。最后,我们在 RViz 中可视化并确认了本地和全局成本地图的足迹。