行为树#
行为树代码小部件是控制 GXF 中任务流程的机制之一。 它们遵循与经典行为树相同的通用行为,并为机器人应用添加了一些有用的功能。 本文档概述了通用概念、可用的行为树节点类型,以及如何单独或结合使用它们的示例。
通用概念#
行为树由 n 元树组成,树的实体可以有零个或多个子实体。 父实体的条件执行基于子实体的执行状态。 行为树在图形上表示为有向树,其中节点分类为根节点、控制流节点或执行节点(任务)。 对于每对连接的节点,输出节点称为父节点,输入节点称为子节点。
行为树的执行从根节点开始,根节点以一定的频率向其子节点发送滴答信号。 当允许执行行为树中的节点时,如果其执行尚未完成,则向父节点返回状态“running”(运行中);如果已实现其目标,则返回“success”(成功);否则返回“failure”(失败)。 行为树还使用控制器组件来控制实体的终止策略和执行状态。 当前为行为树实施的控制器行为之一是 EntityCountFailureRepeatController
,它在停用实体之前,最多重复实体 repeat_count
次(如果失败)。
GXF 支持多种行为树代码小部件,将在以下部分中进行说明。
行为树代码小部件#
每个行为树代码小部件都可以有一组参数,用于定义其行为方式。 请注意,在下面给出的所有示例中,配置根代码小部件的 children
参数的命名约定是 [child_codelet_name\child_codelet_scheduling_term]
。
常量行为#
在每个滴答周期后,将其自身状态切换为配置的所需常量状态。
参数 |
描述 |
---|---|
s_term |
用于调度实体自身的调度项 |
constant_status |
在每个滴答时间切换到的所需状态。 |
下图显示了与为根实体定义的序列行为结合使用的常量行为的示例图

在此示例中,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。

下面显示了配置所描述示例的代码片段。
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 |
表示在子实体失败后是否重复子实体。 |
下图显示了重复行为的图形表示。 可以将根实体配置为在失败后重复唯一的子实体。 当子实体成功时,它会成功。

下面显示了配置重复行为的代码片段 -
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 成功返回,根实体将返回成功。

下面显示了配置选择器行为的代码片段 -
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 返回失败,根实体将返回失败。

下面显示了配置序列行为的代码片段 -
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 |
配置的延迟 |
在下图所示的图中,子实体在配置的延迟时间后切换为失败。 因此,根实体返回失败。

下面显示了相同的代码片段 -
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
---