Skip to content

设置足迹(Footprint)

本指南介绍如何为 Nav2 的导航算法配置机器人足迹(footprint),并在 sam_bot(本系列设置指南中构建的仿真机器人)上演示足迹配置示例。最后,在 RViz 中展示 sam_bot 足迹的可视化效果,以确认配置正确。

足迹描绘了机器人投影到地面上的 2D 形状,Nav2 主要用它来在规划过程中避免碰撞。相关算法确保机器人在计算路径或规划时不会与代价地图中的障碍物发生碰撞。

足迹通过全局和局部代价地图的 footprint 或 robot_radius 参数进行设置,这些参数在之前的教程(传感器设置指南)中已有涉及。footprint 参数中定义的值是一个有序的 2D 点向量,以 base_link 坐标系为原点来描述机器人的足迹。向量中的第一个点和最后一个点会自动连接,以闭合足迹形状。也可以使用 robot_radius 参数替代,它会自动生成以 base_link 为中心的圆形足迹。如果同时定义了 footprint 和 robot_radius 参数,则以 footprint 为准。

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

对于全局代价地图,选择 robot_radius(圆形)还是 footprint(多边形)参数取决于机器人本身、运行环境以及所使用的路径规划算法。即使机器人不是圆形的,在某些场景下使用圆形足迹也可以接受。例如,NavFn 等路径规划算法假设机器人为圆形,因为它们仅按网格单元检查碰撞,无需为足迹描绘机器人的精确形状。而 Smac Planner 的 Hybrid-A* 等算法在条件允许时会对机器人的多边形足迹进行碰撞检查,此时使用多边形足迹更有意义。另一个例子:一个小型遥控车大小的机器人在仓库中巡游时,由于体型很小、无需进行受限的机动操作,用其最大横截面半径来近似足迹可以节省计算开销。

对于局部代价地图,非圆形机器人通常使用 footprint(多边形)进行设置。不建议这样做的情况是:计算资源不足以在多边形足迹上实现避碰算法。局部代价地图使用 robot_radius(圆形)的另一个可能原因是机器人相对于环境来说非常小,不需要精确的避碰。不过,通常情况下局部轨迹规划器应使用机器人的实际足迹多边形。

需要注意的是,足迹也可以通过代价地图的 ~/footprint 话题随时间动态调整,该话题会根据机器人状态的变化(例如所附机械臂的运动、拾起托盘或其他改变机器人形状的动作)更新多边形。规划器和控制器随后将自动使用更新后的多边形。

本节为 sam_bot 配置足迹:局部代价地图使用 footprint(多边形),全局代价地图使用 robot_radius(圆形)。基于 Nav2 的默认配置文件,修改全局和局部代价地图的足迹参数。

注意:sam_bot 的完整源代码可在 navigation2_tutorials 仓库中找到。

在 config 目录下创建一个名为 nav2_params.yaml 的新文件,然后将 config/nav2_params.yaml 的内容复制粘贴到该文件中。config/nav2_params.yaml 的内容取自 Nav2 的默认配置文件,但修改了 footprint 和 robot_radius 参数,以匹配 sam_bot 的形状。

注意:Nav2 的默认配置文件可在官方的 Navigation2 仓库 中找到。

下面是 nav2_params.yaml 中定义局部代价地图足迹的代码片段。在此配置文件中,局部代价地图的 footprint 参数已设置为矩形足迹,该矩形以 sam_bot 的 base_link 坐标系为中心。

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

对于全局代价地图,已设置 robot_radius 参数来创建一个与 sam_bot 尺寸匹配、以 base_link 为中心的圆形足迹。修改的参数如下面的代码片段所示。

robot_radius: 0.3
resolution: 0.05

现在确认 sam_bot 的足迹设置是否正确。

首先启动 launch/display.launch.py,启动机器人状态发布器、在 Gazebo 中生成 sam_bot,并在 RViz 中可视化 sam_bot 及其足迹。机器人状态发布器发布 sam_bot 的 URDF 中定义的 base_link => sensors 变换,Gazebo 的差速驱动插件发布 odom => base_link 变换。打开一个新终端,执行以下命令。

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

启动 display.launch.py 后,RViz 和 Gazebo 应该会打开。RViz 应显示 sam_bot、各部分的坐标系和 odom 坐标系,且没有错误。Gazebo 应显示 sam_bot,以及 sam_bot 的激光雷达传感器可检测到的一个球体和一个立方体。

接下来,使用 static_transform_publisher 发布 map => odom 变换。本指南以静态方式发布该变换,作为一种简便的发布变换并可视化足迹的手段。打开一个新终端,执行以下命令。

Terminal window
ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 map odom

此时应正在发布 map => odom 变换,map 坐标系应已添加到 RViz 中且没有错误。

最后,使用刚创建的 nav2_params.yaml 配置文件,通过 nav2_bringup 自带的启动文件 navigation_launch.py 启动 Nav2。打开一个新终端,执行以下命令:

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

此时应能在 RViz 中可视化足迹,下一节将详细说明。

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

add_topic_local_costmap

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

polygon_footprint

对于全局代价地图,同样点击 RViz 窗口左下角的 Add 按钮,切换到 By topic 选项卡,选择 /global_costmap/published_footprint 话题下的 Polygon,如下所示。

add_topic_global_costmap

将 RViz 中的固定坐标系设置为 map,即可看到 sam_bot 的圆形足迹:

circular_footprint

本指南介绍了如何为机器人配置圆形和多边形足迹。足迹在 Nav2 的寻路算法中发挥着重要作用。

作为演示,本指南配置了 sam_bot 的代价地图足迹参数:局部代价地图使用贴合 sam_bot 形状的多边形足迹,全局代价地图使用圆形足迹。最后在 RViz 中可视化并确认了局部和全局代价地图的足迹。