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

在此,child1 配置为返回成功的恒定状态 (GXF\_BEHAVIOR\_SUCCESS
),child2 返回失败 (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
的并行行为的图形表示。因此,即使一个子节点返回 failure
状态,根节点也返回 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
成功返回,根实体将返回 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_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
返回 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
切换行为
运行索引定义为 desired\_behavior
的子实体。
参数 | 描述 |
---|---|
s_term | 用于调度实体自身的调度项 |
children | 子实体 |
desired_behavior | 当此实体运行时要切换到的子实体的索引 |
在下面显示的代码片段中,根实体的期望行为被指定为索引 1(scene)处的子节点。因此,这是要运行的实体。
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
---