详细的行为树演练

概述

本文作为Nav2中主要行为树 (BT) 的参考指南。 [校准@123---向佐转]

nav2_bt_navigator/behavior_trees 中提供了行为树示例,但是这些示例必须基于机器人的应用进行重新配置。以下文档将详细介绍当前主要默认的BT navigate_to_pose_w_replanning_and_recovery.xml[校准@123---向佐转]

前提条件

恢复(Recovery)子树

这个 Recovery 子树是Nav2默认 navigate_to_pose_w_replanning_and_recovery.xml 树的第二大 "half" 。简而言之,当 Navigation 子树返回 FAILURE 控制系统级别的恢复时,就会触发这个子树 (在这种情况下, Navigation 子树中的上下文恢复是不够的)。 [待校准@147]


../../_images/recovery_subtree.png

以及XML片段: [待校准@148]

<ReactiveFallback name="RecoveryFallback">
    <GoalUpdated/>
    <RoundRobin name="RecoveryActions">
        <Sequence name="ClearingActions">
            <ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
            <ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
        </Sequence>
        <Spin spin_dist="1.57"/>
        <Wait wait_duration="5"/>
        <BackUp backup_dist="0.15" backup_speed="0.025"/>
    </RoundRobin>
</ReactiveFallback>

最顶级的父级, ReactiveFallback 控制系统范围内其余恢复之间的流程,并异步检查是否收到新目标。如果在任何时候目标被更新,这个子树将停止所有的子节点并返回 SUCCESS 。这样就支持对新目标的快速反应和抢占当前正在执行的恢复。对于 Navigation 子树的上下文恢复部分来说,这应该是常用的。这是处理这种情况的常见BT模式,“除非发生'某种情况',否则正常执行某动作”。 [校准@Excitingship]

这些条件节点非常强大,通常与 ReactiveFallback 配对。可以很容易地想象用 isBatteryLow 条件将整个 navigate_to_pose_w_replanning_and_recovery 树包裹在 ReactiveFallback 中 -- 这意味着 navigate_to_pose_w_replanning_and_recovery 树将执行 * 除非 * 电池电量变低 (然后新的一整个不同的子树来表示对接充电)。 [校准@Excitingship]

如果目标从未更新,行为树将继续到 RoundRobin 节点。以下是BT中默认的四个系统级恢复: [待校准@151]

  • 清除两个成本图 (本地和全局) 的序列 [待校准@152]

  • Spin recovery action

  • Wait recovery action

  • BackUp recovery action

SUCCESS 的四个孩子父 RoundRobin ,机器人将尝试renavigate在 Navigation 子树。如果重新隔离不成功, RoundRobin 的下一个孩子将被勾选。 [待校准@156]

例如,假设机器人卡住, Navigation 子树返回 FAILURE :( 为了这个例子,让我们假设目标从未更新)。 [校准@小鱼]

  1. 尝试使用 Recovery 子树中的代价地图清除序列,并返回 SUCCESS 。机器人现在再次移动到 Navigation 子树 [待校准@158]

  2. 让我们假设清除两个成本图是不够的,并且 Navigation 子树再次返回 FAILURE 。机器人现在滴答 Recovery 子树 [待校准@159]

  3. Recovery 子树中, Spin 的作用将被勾选。如果这返回 SUCCESS ,那么机器人将返回到主 Navigation 子树 * 但是 * 让我们假设 Spin 的恢复返回 FAILURE 。在这种情况下,树将 * 保留 * 在 Recovery 子树中 [待校准@160]

  4. 假设下一个恢复行动, Wait 返回 SUCCESS 。然后机器人将移动到 Navigation 子树 [待校准@161]

  5. 假设 Navigation 子树返回 FAILURE (清除成本图,尝试旋转,等待仍然不足以恢复系统。机器人将移动到 Recovery 子树上并尝试 BackUp 行动。假设机器人尝试了 BackUp 动作,并且能够成功完成动作。 BackUp 动作节点返回 SUCCESS ,所以现在我们再次进入导航子树。 [待校准@162]

  6. 在这个假设的场景中,让我们假设 BackUp 的动作允许机器人在 Navigation 子树中成功导航,并且机器人到达目标。在这种情况下,整个BT仍将返回 SUCCESS[校准@Excitingship]

如果 BackUp 的作用不足以让机器人不卡住,上述逻辑将无限期地继续下去,直到 Navigate 子树和 Recovery 子树的母树中的 number_of_retries 被超越,或者如果 Recovery 子树中的所有系统范围的恢复都返回 FAILURE (这不太可能,并且可能指向其他一些系统故障)。 [待校准@164]