导航2特定节点介绍
警告
- 在刚开始时,词汇可能是一个令人困惑的重要问题。
在讨论BT时,``Node``与ROS 2上下文中的``Node``完全不同。
在BT的上下文中,
ActionNode不一定与ROS 2上下文中的Action服务器连接(但通常会连接)。
有许多定制的Nav2 BT节点可用于以Nav2特定方式使用。下面将介绍一些常用的Nav2节点。完整的定制BT节点列表可在 nav2_behavior_tree插件文件夹 中找到。配置指南 也可能非常有用。
动作节点
ComputePathToPose - 计算到位姿的行为服务器客户端(规划器接口)
FollowPath - FollowPath 动作服务器客户端(控制器接口)
Spin, Wait, Backup - 行为服务器客户端
ClearCostmapService - ClearCostmapService 服务器客户端
完成时,这些动作节点将返回 SUCCESS,如果动作服务器认为动作已正确完成,则返回 RUNNING,否则返回 FAILURE。请注意,在上面的列表中,ClearCostmapService 动作节点不是动作服务器客户端,而是服务客户端。
条件节点
GoalUpdated - 检查目标话题上的目标是否已更新
GoalReached - 检查是否已达到目标
InitialPoseReceived - 检查是否已收到
intial_pose话题上的姿态isBatteryLow - 通过监听电池主题来检查电池是否低
上述条件节点列表可用于探测系统的特定方面。通常情况下,如果条件为真,则它们将返回 SUCCESS,否则返回 FAILURE。在默认的Nav2 BT中使用的关键条件是 GoalUpdated,它在特定子树中以异步方式进行检查。此条件节点允许描述行为:“如果目标已更新,则我们必须重新规划”。条件节点通常与ReactiveFallback节点配对使用。
装饰节点
距离控制器 - 每当机器人行驶一定距离时,将对子节点进行触发
Rate Controller - 控制子节点以恒定频率进行刻度。刻度频率是一个公开端口
目标更新器 - 通过行为树上的端口更新子节点的目标
Single Trigger - 仅对子节点进行一次刻度,并在所有后续刻度中返回``FAILURE``
速度控制器 - 控制其子节点以与机器人速度成比例的频率触发
Control: PipelineSequence
当子节点返回“运行中”时,“PipelineSequence”控制节点将重新触发之前的子节点。该节点类似于“序列”节点,但其附加属性是在“当前”节点之前的子节点将被重新触发(类似于管道中的水流)。如果任何子节点返回“失败”,所有子节点都将停止运行,父节点也将返回“失败”。当序列中的**最后一个节点**返回“成功”时,该节点将停止运行并返回“成功”。
为了进一步解释,这里有一个使用PipelineSequence的示例BT。
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<PipelineSequence>
<Action_A/>
<Action_B/>
<Action_C/>
</PipelineSequence>
</BehaviorTree>
</root>
Action_A、``Action_B``和``Action_C``都处于“空闲”状态。当父PipelineSequence首次被执行时,假设``Action_A``返回``RUNNING``。父节点现在将返回``RUNNING``,而且不会执行其他节点。
现在,让我们假设``Action_A``返回“成功”,然后``Action_B``将被触发并返回“运行中”。``Action_C``尚未被触发,因此返回“空闲”。
Action_A``再次被执行并返回``RUNNING,Action_B``重新被执行并返回``SUCCESS,因此BT继续执行首次执行``Action_C``。假设``Action_C``返回``RUNNING``。重新执行``Action_A``是使PipelineSequence有用的关键。
序列中的所有动作都将被重新触发。假设``Action_A``仍然返回“运行中”,而``Action_B``再次返回“成功”,``Action_C``现在在此触发中返回“成功”。序列现已完成,因此即使``Action_A``仍处于“运行中”,也会停止``Action_A``的运行。
请注意,如果``Action_A``、Action_B``或``Action_C``在任何时候返回``FAILURE,则父节点也将返回``FAILURE``,并停止执行任何子节点。
有关 PipelineSequence 的详细信息,请参阅 PipelineSequence 配置指南。
控制:恢复
Recovery 控制节点只有两个子节点,仅当第一个子节点返回 SUCCESS 时它才返回 SUCCESS。如果第一个子节点返回 FAILURE,则会执行第二个子节点。这个循环将继续,直到出现以下情况之一:
第一个子节点返回``SUCCESS``(导致父节点返回``SUCCESS``)。
第二个子节点返回
FAILURE``(导致父节点返回 ``FAILURE)违反了``number_of_retries``输入参数的限制。
通常情况下,此节点用于连接一个操作和一个恢复操作,正如其名称所示。第一个操作通常是“主要”行为,第二个操作将在主要行为失败的情况下执行。通常,执行第二个子节点操作会提高第一个操作成功的机会。
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<RecoveryNode number_of_retries="1">
<ComputePathToPose/>
<ClearLocalCostmap/>
</RecoveryNode>
</BehaviorTree>
</root>
在上面的例子中,假设``ComputePathToPose``失败。作为响应,ClearLocalCostmap``将被激活并返回``SUCCESS。现在,既然我们已经清除了代价地图,假设机器人能够正确计算路径并且``ComputePathToPose``现在返回``SUCCESS``。然后,父级RecoveryNode也将返回``SUCCESS``,BT将完成。
有关 RecoveryNode 的详细信息,请参阅 RecoveryNode 配置指南。
控制:RoundRobin
RoundRobin 控制节点以循环方式执行其子节点,直到某个子节点返回 SUCCESS,此时父节点也将返回 SUCCESS。如果所有子节点返回 FAILURE,父节点 RoundRobin 也将返回 FAILURE。
这是一个我们将用来介绍概念的BT示例。
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<RoundRobin>
<Action_A/>
<Action_B/>
<Action_C/>
</RoundRobin>
</BehaviorTree>
</root>
所有节点都从
IDLE状态开始。
2. Upon tick of the parent node, the first child (Action_A) is ticked. Let's assume on tick the child returns RUNNING.
In this case, no other children are ticked and the parent node returns RUNNING as well.
3. Upon the next tick, let's assume that Action_A returns FAILURE.
This means that Action_B will get ticked next, and Action_C remains unticked.
Let's assume Action_B returns RUNNING this time. That means the parent RoundRobin node will also return RUNNING.
4. Upon this next tick, let's assume that Action_B returns SUCCESS. The parent RoundRobin will now halt all children and return SUCCESS.
The parent node retains this state information, and will tick Action_C upon the next tick rather than start from Action_A like Step 2 did.
在这个时钟周期中,假设
Action_C返回RUNNING,父级 RoundRobin 也返回RUNNING。其他节点都未执行。
在最后一次激活时,假设``Action_C``返回``FAILURE``。父节点将循环并再次激活``Action_A``。
Action_A``返回``RUNNING,父级RoundRobin节点也将返回``RUNNING``。除非所有子节点返回``FAILURE``,否则此模式将无限继续。
有关 RecoveryNode 的更多详细信息,请参阅 RoundRobin 配置指南。