NVIDIA Holoscan SDK v2.9.0

行为树

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

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

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

GXF 支持几个行为树代码小部件,将在以下部分中进行解释。

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

恒定行为

在每个滴答周期后,将其自身状态切换为配置的期望恒定状态。

参数

描述

s_term 用于调度实体自身的调度项
constant_status 在每个滴答时间要切换到的期望状态。

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

constant_behavior.png

在此,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

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 表示在子节点失败后是否重复子节点。

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

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\_1child\_2child\_3。虽然 child\_1child\_2 失败,但由于 child\_3 成功返回,根实体将返回 success

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\_1child\_2child\_3。虽然 child\_1child\_2 通过,但由于 child\_3 返回 failure,根实体将返回失败。

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(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 配置的延迟

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

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 ---

上一篇 GXF 调度器
下一篇 GXF Core C API
© 版权所有 2022-2024 NVIDIA。 上次更新于 2025 年 1 月 27 日。