Behavior-tree模块化编程简明教程

本文详述了行为树的模块化编程,包括Tick、Control flow nodes、Execution nodes及带有记忆的节点。讲解了Fallback、Sequence、Parallel、Decorator等控制流节点的工作原理,以及Action和Condition执行节点的实现。通过实例展示了如何使用C++创建行为树,并实现Action和Condition节点功能。
摘要由CSDN通过智能技术生成

写在前面的话

本文立足于行为树的《user manual》,将对行为树模块化编程做一些较为细致的介绍。《user manual》可从此处下载获得。
且由于《user manual》较为简洁,本文将对于行为树的基础概念以及模块化编程等方面做一些额外的补充。

Behavior-tree的模块化编程

行为树(Behavior trees)优于有限状态机(FSMs)的方面在于行为树引入了模块化编程以及具有反馈性质的ticks()函数。而组成行为树的主要模块结构可分为:控制流结点(control flow nodes)以及执行结点(execution nodes)。其中控制流结点主要包括:Fallback, Sequence, Parallel, 以及 Decorator;执行结点主要包括:condition以及action。行为树实现其特殊功能主要就是通过根节点->控制流结点->执行结点,这样的模式来实现其功能。
下面将就这些结点做一些简单的介绍。

(一)Behavior-tree基本模块介绍

Tick

在执行行为树时,行为树的控制循环的基础是tick。tick将从行为树的根节点(root node)出发,不断向下,最终到达叶子结点(leaf nodes),而叶子结点通常由action nodes 与 condition nodes 组成。一旦tick到达了上述的两种结点,将激活该结点,使其行驶其功能,并且将视结点的运行情况返回 SUCCESS , FAILURE , RUNNING 的其中一种状态。返回的状态将沿着行为树逆向上升,最终到达根节点。同时,由于结点类型的不同,对于tick的处理与反馈也不尽相同。要注意的是,如果一个正在运行的结点将被处理为不再接收到tick,它必须被停止。我们将通过 halt 程序来使其强制停止。下面,我们将阐述不同结点对tick的不同处理方式以及对不同返回方式的处理,即每个结点的特性。

Control flow nodes

  1. Fallback
    Fallback 节点用于查找和执行不失败的第一个子节点。Fallback将从左到右依次运行其子节点,直到其子节点返回SUCCESS或者RUNNING。Fallback结点将立即返回SUCCESS或RUNNING至其父结点,且不会tick下一个子节点。当且仅当其所有的子节点均返回FAILURE时,Fallback结点才返回FAILURE。
  2. Sequence
    Sequence 用于查找和执行尚未成功的第一个子节点。Sequence将从左到右依次运行其子节点,直到其子节点返回FAILURE或者RUNNING。Sequence结点将立即返回FAILURE或RUNNING至其父节点,且不会tick下一个子节点。当且仅当其所有的子节点均返回SUCCESS时,Fallback结点才返回SUCCESS。
  3. Parallel
    Parallel结点将同时 tick其所有的子节点,当其中有M个子节点返回SUCCESS时,Parallel返回SUCCESS;当有N-M+1个子节点返回FAILURE时,Parallel返回FAILURE;除此之外将返回RUNNING。其中,N为其子结点个数,M<=N且为用户自定义数。
  4. Decorator
    Decorator结点将根据用户定义的策略操作其子节点的返回状态。在Behavior-tree.cpp中所给的Decorator类型为:Decorator retry(重新尝试运行FAILURE的子结点)以及Decorator Negation(逆转子节点所传回的SUCCESS或FAILURE)。

Execution nodes

  1. Action
    Action结点执行动作,如果操作完成,则返回SUCCESS,如果无法完成则返回FAILURE,如果正在完成则RUNNING。
  2. Condition
    Condition节点将判断是否满足了用户定义的条件C。Condition结点理论上来说可以被视作Action结点的一个子集,但是在行为树系统中依然加入了Condition结点,提高了程序的可读性。

Node with Memory

在Execution nodes与Control flow nodes之外还存在着一类带有“记忆”的结点。带有记忆的结点在执行时无需从头开始依次执行子节点,而是从上一次执行中断处继续依照从左至右的顺序依次执行,从而解决了Sequence与Fallback结点必须此次执行其前馈结点的弊端。此类结点主要包括SequenceMem与FallbackMem两类。

(二)Behavior-tree基本模块编程实例

在对各个模块编程前,首先要将行为树的结构建立起来。而建立一棵行为树与二叉树在思路上极为相似,即先声明创建新的结点,之后再使用指针的方式将其传递入树,,并在最后调用Execute函数激活所要运行的结点。但不同的是由于behavior_tree.h库的存在,使得行为树的创建较为简洁,如BT::FallbackNode()函数等。使用了behavior_tree.h库,建立一棵行为树就变得较为方便了。关于behavior_tree.h库具体的使用方法可以查看ROS官方所给出的代码。对于编译后生成这些.h文件的 .cpp文件 也可以从这里查看。
下面给出了古月居中小明工坊中创建一棵行为树的具体案例:

#include <behavior_tree.h>

int main(int argc, char *argv[])
{
   
    ros::init(argc, argv, "BehaviorTree");
    try
    {
   
    
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值