行为树#

行为树代码小部件是控制 GXF 中任务流程的机制之一。 它们遵循与经典行为树相同的通用行为,并为机器人应用添加了一些有用的功能。 本文档概述了通用概念、可用的行为树节点类型,以及如何单独或结合使用它们的示例。

通用概念#

行为树由 n 元树组成,树的实体可以有零个或多个子实体。 父实体的条件执行基于子实体的执行状态。 行为树在图形上表示为有向树,其中节点分类为根节点、控制流节点或执行节点(任务)。 对于每对连接的节点,输出节点称为父节点,输入节点称为子节点。

行为树的执行从根节点开始,根节点以一定的频率向其子节点发送滴答信号。 当允许执行行为树中的节点时,如果其执行尚未完成,则向父节点返回状态“running”(运行中);如果已实现其目标,则返回“success”(成功);否则返回“failure”(失败)。 行为树还使用控制器组件来控制实体的终止策略和执行状态。 当前为行为树实施的控制器行为之一是 EntityCountFailureRepeatController,它在停用实体之前,最多重复实体 repeat_count 次(如果失败)。

GXF 支持多种行为树代码小部件,将在以下部分中进行说明。

行为树代码小部件#

每个行为树代码小部件都可以有一组参数,用于定义其行为方式。 请注意,在下面给出的所有示例中,配置根代码小部件的 children 参数的命名约定是 [child_codelet_name\child_codelet_scheduling_term]

常量行为#

在每个滴答周期后,将其自身状态切换为配置的所需常量状态。

参数

描述

s_term

用于调度实体自身的调度项

constant_status

在每个滴答时间切换到的所需状态。

下图显示了与为根实体定义的序列行为结合使用的常量行为的示例图

../../../../_images/constant_behavior.png

在此示例中,child1 配置为返回常量状态“success”(GXF_BEHAVIOR_SUCCESS),child2 返回“failure”(GXF_BEHAVIOR_FAILURE),导致根节点(配置为表现出序列行为)返回 GXF_BEHAVIOR_FAILURE。

可以配置每个子节点的控制器,以便在失败时重复执行。 下面显示了配置所描述示例的代码片段。

name: root
components:
- name: root_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: root_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: true
- name: root_codelet
  type: nvidia::gxf::SequenceBehavior
  parameters:
    children: [ child1/child1_st, child2/child2_st ]
    s_term: root_st
---
 name: child2
 components:
 - name: child2_controller
   type: nvidia::gxf::EntityCountFailureRepeatController
   parameters:
     max_repeat_count: 3
     return_behavior_running_if_failure_repeat: true
 - name: child2_st
   type: nvidia::gxf::BTSchedulingTerm
   parameters:
     is_root: false
 - name: child2_codelet
   type: nvidia::gxf::ConstantBehavior
   parameters:
     s_term: child2_st
     constant_status: 1

并行行为#

并行运行其子节点。 默认情况下,当所有子节点都成功时成功,当所有子节点都失败时失败。 可以使用以下参数自定义此行为。

参数

描述

s_term

用于调度实体自身的调度项

children

子实体

success_threshold

成功所需的子节点数。 值 -1 表示此节点要成功,所有子节点都必须成功。

failure_threshold

失败所需的子节点数。 值 -1 表示此节点要失败,所有子节点都必须失败。

下图显示了配置了 failure_threshold 为 -1 的并行行为的图形表示。 因此,即使一个子节点返回失败状态,根节点也返回 GXF_BEHAVIOR_SUCCESS。

../../../../_images/parallel_behavior.png

下面显示了配置所描述示例的代码片段。

name: root
components:
- name: root_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: root_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: true
- name: root_codelet
  type: nvidia::gxf::ParallelBehavior
  parameters:
    children: [ child1/child1_st, child2/child2_st ]
    s_term: root_st
    success_threshold: 1
    failure_threshold: -1

重复行为#

重复其唯一的子实体。 默认情况下,当子实体失败时不会重复。 可以使用以下参数自定义此行为。

参数

描述

s_term

用于调度实体自身的调度项

repeat_after_failure

表示在子实体失败后是否重复子实体。

下图显示了重复行为的图形表示。 可以将根实体配置为在失败后重复唯一的子实体。 当子实体成功时,它会成功。

../../../../_images/repeat_behavior.png

下面显示了配置重复行为的代码片段 -

name: repeat_knock
components:
- name: repeat_knock_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: repeat_knock_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: false
- name: repeat_codelet
  type: nvidia::gxf::RepeatBehavior
  parameters:
    s_term: repeat_knock_st
    children: [ knock_on_door/knock_on_door_st ]
    repeat_after_failure: true
---

选择器行为#

按顺序运行所有子实体,直到其中一个成功,然后报告成功。 如果所有子实体都失败(或不存在子实体),则此代码小部件失败。

参数

描述

s_term

用于调度实体自身的调度项

children

子实体

下图显示了选择器行为的图形表示。 根实体按顺序启动 child_1、child_2 和 child_3。 尽管 child_1 和 child_2 失败,但由于 child_3 成功返回,根实体将返回成功。

../../../../_images/selector_behavior.png

下面显示了配置选择器行为的代码片段 -

name: root
components:
- name: root_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: root_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: true
- name: root_sel_codelet
  type: nvidia::gxf::SelectorBehavior
  parameters:
    children: [ door_distance/door_distance_st, door_detected/door_detected_st, knock/knock_st ]
    s_term: root_st
---
name: door_distance
components:
- name: door_distance_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: door_distance_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: false
- name: door_dist
  type: nvidia::gxf::SequenceBehavior
  parameters:
    children: []
    s_term: door_distance_st
---

序列行为#

按定义的顺序按顺序运行其子实体。 当所有子实体都成功时成功,或者只要一个子实体失败就失败。

参数

描述

s_term

用于调度实体自身的调度项

children

子实体

下图显示了序列行为的图形表示。 根实体按顺序启动 child_1、child_2 和 child_3。 尽管 child_1 和 child_2 通过,但由于 child_3 返回失败,根实体将返回失败。

../../../../_images/sequence_behavior.png

下面显示了配置序列行为的代码片段 -

name: root
components:
- name: root_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: root_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: true
- name: root_codelet
  type: nvidia::gxf::SequenceBehavior
  parameters:
    children: [ child1/child1_st, child2/child2_st ]
    s_term: root_st

切换行为#

运行索引定义为 desired_behavior 的子实体。

参数

描述

s_term

用于调度实体自身的调度项

children

子实体

desired_behavior

当此实体运行时要切换到的子实体的索引

在下面显示的代码片段中,根实体的所需行为被指定为索引 1 处的子实体。(场景)。 因此,这是运行的实体。

name: root
components:
- name: root_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: root_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: true
- name: root_switch_codelet
  type: nvidia::gxf::SwitchBehavior
  parameters:
    children: [ scene/scene_st, ref/ref_st ]
    s_term: root_st
    desired_behavior: 0
---
name: scene
components:
- name: scene_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 0
- name: scene_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: false
- name: scene_seq
  type: nvidia::gxf::SequenceBehavior
  parameters:
    children: [ pose/pose_st, det/det_st, seg/seg_st ]
    s_term: scene_st
---

计时器行为#

等待指定的延迟时间,然后切换到配置的结果 switch_status。

参数

描述

s_term

用于调度实体自身的调度项

clock

时钟

switch_status

配置的延迟后要切换到的结果

delay

配置的延迟

在下图所示的图中,子实体在配置的延迟时间后切换为失败。 因此,根实体返回失败。

../../../../_images/timer_behavior.png

下面显示了相同的代码片段 -

name: knock_on_door
components:
- name: knock_on_door_controller
  type: nvidia::gxf::EntityCountFailureRepeatController
  parameters:
    max_repeat_count: 10
- name: knock_on_door_st
  type: nvidia::gxf::BTSchedulingTerm
  parameters:
    is_root: false
- name: knock
  type: nvidia::gxf::TimerBehavior
  parameters:
    switch_status: 1
    clock: sched/clock
    delay: 1
    s_term: knock_on_door_st
 ---