设置机器人的轮廓

在本指南中,我们将讨论如何配置机器人的足迹,以便Nav2使用的导航算法能够正常运行。我们还将在这一系列设置指南中一直在构建的仿真机器人“sam_bot”上展示一个样本足迹配置。最后,我们还将在RViz中显示“sam_bot”的足迹可视化,以确保我们设置正确。

轮廓介绍

足迹描述了机器人在投射到地面时的二维形状,主要用于Nav2在规划过程中避免碰撞。参与此任务的算法确保机器人在计算路径或规划过程中不会与代价地图中的障碍物发生碰撞。

通过在全局和局部成本地图的``footprint``或``robot_radius``参数中设置机器人的轮廓,我们可以设置机器人的轮廓。在前面的教程中我们已经介绍了这两个参数(设置传感器指南)。``footprint``参数中定义的值是一个有序的二维点向量,用于定义以``base_link``帧为原点的机器人轮廓。向量中的第一个和最后一个点被连接成最后一个线段以闭合轮廓的形状。作为替代,您还可以使用``robot_radius``参数,其中圆形轮廓会自动生成,并以``base_link``为中心。如果配置中同时定义了``footprint``和``robot_radius``参数,则使用``footprint``参数。

参见

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

对于全局代价地图的轮廓,选择使用“robot_radius”(圆形)还是“footprint”(多边形)参数取决于机器人、其环境以及您将使用的路径规划算法。即使您使用的是非圆形机器人,也可能存在接受圆形轮廓的情况。例如,像`NavFn <https://navigation.ros.org/configuration/packages/configuring-navfn.html>`_ 这样的路径规划算法假设机器人是圆形的,因为它只在每个栅格单元格中检查碰撞,因此不需要为机器人的轮廓描绘出准确的形状。另一方面,如果可能和必要的话,像`Smac Planner's Hybrid-A* <https://navigation.ros.org/configuration/packages/configuring-smac-planner.html>`_ 这样的算法会对机器人的多边形轮廓进行碰撞检查。因此,使用多边形轮廓可能会很有用。另一个例子是有一个大小为小型遥控汽车的机器人在仓库里漫游。这个机器人非常小,不需要进行局限的机动操作,因此用最大的横截面半径来近似它是一个节省时间的优化方法。

对于局部代价地图足迹,非圆形机器人通常使用“足迹”(多边形)进行设置。不推荐使用多边形足迹的情况包括计算资源不足以实现多边形足迹上的碰撞避免算法,或者机器人相对其环境非常小以至于不需要精确的碰撞避免。然而,通常情况下,局部轨迹规划器应使用机器人的实际足迹多边形。

配置机器人的轮廓

在本节中,我们将配置“sam_bot”的足迹,以便局部代价地图使用“足迹”(多边形),而全局代价地图使用“机器人半径”(圆形)。我们将利用Nav2的默认配置文件,并修改全局和局部代价地图的足迹参数。

注解

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

在“config”目录下,创建一个名为“nav2_params.yaml”的新文件。然后,将`config/nav2_params.yaml <https://github.com/ros-planning/navigation2_tutorials/blob/master/sam_bot_description/config/nav2_params.yaml>`_的内容复制并粘贴到新创建的文件中。`config/nav2_params.yaml <https://github.com/ros-planning/navigation2_tutorials/blob/master/sam_bot_description/config/nav2_params.yaml>`_的内容是从Nav2的默认配置文件复制而来,但对“足迹”和“机器人半径”参数进行了修改,以匹配“sam_bot”的形状。

参见

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

以下是来自“nav2_params.yaml”的代码片段,定义了局部代价地图的足迹。在此配置文件中,局部代价地图

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 窗口左下角的添加按钮。在``按主题``选项卡下,选择``/local_costmap/published_footprint`` 主题下的 Polygon,如下所示。

../../_images/add_topic_local_costmap.png

将RViz中的固定坐标系设置为 odom,您应该看到 sam_bot 的矩形足迹:

../../_images/polygon_footprint.png

另一方面,要在全局代价地图中进行可视化,请单击 RViz 窗口左下角的添加按钮。转到``按主题``选项卡,然后选择 /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中可视化并确认了局部和全局代价地图的足迹。