行为树保姆级教程(以机器人的任务规划为例

行为树

目录

  • 什么是行为树(behavior tree)?
  • 行为树的相关术语
    • 行为节点和控制节点
    • 不同类型的控制结点:
      • 顺序节点
      • 选择节点
      • 并行节点
      • 装饰结点
  • 机器人的例子:物体搜索
    • 1:如果只存在一个地点A,那么行为树很简单,到A处,找到物体。如下图所示:
    • 2:接下来我们使用一个条件结点,用来判断机器人是否找到了物体(具体实现可以通过相机拍摄照片,然后进行图像识别)。
    • 3:我们的机器人工作的环境可能包含了多个地点,我们期望它可以尝试到所有已知的地点搜寻物体,在搜寻到物体后结束搜索。这可以通过添加一个选择结点作为根节点来实现,如下图所示:
    • 4:如果我们期望机器人可以同时搜寻多个不同的物体(比如苹果和橘子),可以通过添加并行结点实现。
  • 装饰器(decorator)和黑板(blackboard)
  • 行为树和有限状态机的比较
    • 1:以机器人捡起一个物体的任务为例,这需要机器人先移动到物体附近,然后夹起物体,最后再移动回机器人原来所处的位置。我们分别用行为树和状态机实现它们,如下图所示:
    • 2:如果我们想要进一步修改行为,比如检测夹子是否处于可以抓起物体的位置,然后再夹紧夹子。对于行为树,我们只需要插入一个子树就能完成期望的修改。但对于状态机,我们需要重写多个转换操作。也就是说行为树更便于进行组合(modularity)和模块化。下图给出了修改后的行为树和状态机图示:
    • 3:对于反应式行为,比如机器人低电量时需要马上回到电源处,即使它还在执行某个任务的过程中。如果使用行为树来实现,这会非常麻烦,我们需要在任意任务的子树中支持充电行为。但对于状态机来说,实现起来就很简单,只需要从所有其它动作连线到充电动作即可。
    • 状态机和行为树联合使用

参考原文:https://robohub.org/introduction-to-behavior-trees/

参考翻译:https://zhuanlan.zhihu.com/p/463182588

什么是行为树(behavior tree)?

行为树(behavior tree)是用来实现非人工角色复杂行为的工具,它具有下面这些特征:

  1. 行为树是树: 执行时从根结点开始按照指定的顺序遍历,直到到达终结状态
  2. **叶子结点都是可执行的行为:**叶子结点会进行具体的操作,可以是一个简单的检测操作,也可以是一个更复杂的操作,结点会返回状态信息(成功,失败,运行中)。
  3. 内部结点控制树的遍历:内部结点会根据孩子结点返回的状态信息,按照特定的规则确定下一个执行的结点。

在这里插入图片描述

行为树的相关术语

行为节点和控制节点

下图给出了行为树的不同结点类型及其对应的图示:

  1. tick:行为树从根节点开始按照预定义的顺序遍历各个节点并执行他们的行为的过程称为一次tick,会返回成功(success)失败(failure)运行中(running) 的状态信息给它的父结点。
  2. 行为结点(execution node):行为树的叶子结点,可以是动作结点(action node)或条件结点(condition node)。对于条件结点(condition node)会在一次tick后立马返回成功或失败的状态信息。对于动作结点(action node)则可以跨越多个tick执行,直到到达它的终结状态。一般来说,条件结点用于简单的判断(比如钳子是否打开?),动作结点用于表示复杂的行为(比如打开房门)。
  3. 控制结点(control node):控制结点是行为树的内部结点,它们定义了遍历其孩子结点的方式。控制结点的孩子可以是行为结点,也可以是控制结点顺序(Sequence)备选(Fallback)并行(Parallel)这3种类型的控制结点可以有任意数量的孩子结点,它们的区别在于对其孩子结点的处理方式。而装饰(Decorator)结点只能有一个孩子结点,用来对孩子结点的行为进行自定义修改。

不同类型的控制结点:

顺序节点

按顺序执行孩子结点直到其中一个孩子结点返回失败状态或所有孩子结点返回成功状态。

在这里插入图片描述

选择节点

按顺序执行孩子结点直到其中一个孩子结点返回成功状态或所有孩子结点返回失败状态。一般用来实现角色的选择行为。

并行节点

“并行执行”所有孩子结点。直到至少M个孩子(M的值在1到N之间)结点返回成功状态或所有孩子结点返回失败状态。

在这里插入图片描述

装饰结点

装饰结点:以自定义的方式修改孩子结点的行为。比如Invert类型的装饰结点,可以反转其孩子结点返回的状态信息。为了方便他人理解,应该尽可能使用比较常见的装饰结点。

机器人的例子:物体搜索

接下来我们通过一个机器人搜索物体的例子来理解行为树的执行过程。

在这里插入图片描述

1:如果只存在一个地点A,那么行为树很简单,到A处,找到物体。如下图所示:

上图中我们使用了一控制结点表示到A处这一动作。在机器人还没有移动到A处前,这一动作结点会返回运行中(running)状态。

2:接下来我们使用一个条件结点,用来判断机器人是否找到了物体(具体实现可以通过相机拍摄照片,然后进行图像识别)。

行为树的一个很常用的设计规则就是使用显式成功条件(explicit success condition)。简单来说,就是在执行动作前总是先进行条件检测。比如,先检测机器人是否已经在A处,如果在就不执行去A处的动作,直接返回成功状态。如下图所示:

3:我们的机器人工作的环境可能包含了多个地点,我们期望它可以尝试到所有已知的地点搜寻物体,在搜寻到物体后结束搜索。这可以通过添加一个选择结点作为根节点来实现,如下图所示:

在这里插入图片描述

我们可以使用选择结点(fallback node)定义角色的反应行为。当一种反应行为无法工作后,自动尝试下一种。

4:如果我们期望机器人可以同时搜寻多个不同的物体(比如苹果和橘子),可以通过添加并行结点实现。

下图给出了在多个地点,同时搜寻苹果和橘子的行为树图示:

我们可以使用并行结点组合多个动作,比如:让机器人原地打转直到连续5个tick识别到一个人为止。

装饰器(decorator)和黑板(blackboard)

📌装饰器(decorator)

我们可以使用装饰器结点(decorator node)来对行为树进行优化。考虑上面的在多个地点搜寻物体的行为树,如果地点数目达到20个以上,整个行为树看上去就会变得非常庞大,也为我们进一步添加新的结点带来麻烦。

下面是避免这些麻烦的常用方法:

  • 引入装饰器结点(decorator node) 相较于每增加一个搜寻地点就复制一份完全相同的子树,我们可以定义一个规则为Repeat的装饰器结点,用来重复执行它的孩子结点,完成搜寻多个地点。
  • 在每一次迭代更新目标位置**:** 使用一个队列存储所有待搜寻地点,每次迭代从队列中取出一个地点进行搜寻,当队列为空时,所有地点都被搜寻完毕。

📌黑板(blackboard)

为了存储可以被多个结点访问的共享信息(比如上面提到的存储有所有待搜寻地点的队列),我们引入黑板(blackboard)的概念。黑板是一块可以被结点读写的公共存储区。

针对我们的例子,我们为行为树添加一个Repeat装饰器结点和一个GetLoc的动作结点,用来在每一次迭代读取新的搜寻地址,如下图所示:

我们也可以利用黑板(blackboard)实现其它一些任务。比如:在找到苹果或橘子后在黑板上记录下它们的位置信息,然后在添加的Speak动作结点中读取它们,让机器人说出在哪里找到了苹果或橘子。还有对于找到的物体不同,后续结点可以根据黑板记录的信息采取不同的处理规则。

行为树和有限状态机的比较

读者可能想了解行为树和有限状态机哪个更好。下面这些观点可以供大家参考:

  • 理论上,行为树和状态机具有相同的表达能力,可以实现相同的功能。
  • 行为树更好还是状态机更好主要看所要定义的行为是更偏向模块化,还是更偏向反应式。一般来说,行为树更方便进行组合和修改,状态机更方便进行反应式动作设计。
1:以机器人捡起一个物体的任务为例,这需要机器人先移动到物体附近,然后夹起物体,最后再移动回机器人原来所处的位置。我们分别用行为树和状态机实现它们,如下图所示:

在这里插入图片描述

​ 左侧为行为树实现,右侧为状态机实现

2:如果我们想要进一步修改行为,比如检测夹子是否处于可以抓起物体的位置,然后再夹紧夹子。对于行为树,我们只需要插入一个子树就能完成期望的修改。但对于状态机,我们需要重写多个转换操作。也就是说行为树更便于进行组合(modularity)和模块化。下图给出了修改后的行为树和状态机图示:

在这里插入图片描述

修改后的行为树和状态机

3:对于反应式行为,比如机器人低电量时需要马上回到电源处,即使它还在执行某个任务的过程中。如果使用行为树来实现,这会非常麻烦,我们需要在任意任务的子树中支持充电行为。但对于状态机来说,实现起来就很简单,只需要从所有其它动作连线到充电动作即可。

在这里插入图片描述

​ 有限状态机可以在任意两个结点添加转换方便地实现反应式行为​

更进一步,通过对状态分层(也就是层次状态机,HFSM),建立超级状态Nominal,我们可以简化状态间的转换实现

状态机和行为树联合使用

行为树更好还是状态机更好需要看具体要解决的问题,个人认为有限状态机更方便管理高优先级的操作行为(比如机器人处于正常状态还是充电状态),行为树更适合定义复杂的行为,比如处理错误恢复等等。实践中,混合使用两者可能会是更好的选择。下图给出了混合使用行为树和状态机定义我们例子中的机器人行为的图示:

​ 高优先级行为使用状态机,复杂行为使用行为树实现​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xv6 文件系统(下)

〇、前言 计算机崩溃后如何恢复,是一个很重要的话题。对于内存中的数据无关痛痒,开机后重新载入就能解决问题;但是对于持久化存储设备,当你尝试修改一个文件,突然断电当你重新打开文件后,这个文件的状态是…

人工智能原理课后习题(考试相关的)

文章目录 问答题知识表示一阶谓词逻辑表示法语义网络表示法 确定推理谓词公式永真和可满足性内容归结演绎推理 不确定推理主观贝叶斯可信度方法证据理论 搜索策略机器学习 问答题 什么是人工智能? 人工智能就是让机器看起来像人类表现出的智能水平一样 人工智能就是…

Bytebase 2.12.0 - 改进自动补全和布局导航

🚀 新功能 支持 MySQL 高级自动补全。支持从 UI 上导入分类分级配置。 🔔 重大变更 作废已有企业版试用证书。之后可以通过提交申请获取新的试用证书。 🎄 改进 改进整体布局和导航。 支持在 SQL 编辑器里显示以及查询 PostgreSQL 数据…

前端登录界面网站设计模板--HTML+CSS

🎀登录表单 💖效果展示 💖HTML代码展示 <!DOCTYPE html> <html lang="en" > <head></

Java基础回顾——面向对象编程

文章目录 面向对象基础方法构造方法默认构造方法多构造方法 方法重载继承多态抽象类接口静态字段和静态方法包作用域内部类 写在最后 https://www.liaoxuefeng.com/wiki/1252599548343744/1255943520012800 面向对象编程Object-Oriented Programming&#xff0c;简称OOP&#…

Python开源库Stable Diffusion web UI搭建AI生图工具

文章目录 Windows安装git下载 Stable Diffusion web UI GitHub 源码stable-diffusion模型下载生成错误排查处理推荐阅读 使用的开源库为 Stable Diffusion web UI&#xff0c;它是基于 Gradio 库的 Stable Diffusion 浏览器界面。 运行 Stable Diffusion 需要硬件要求比较高&am…

epub怎么打开?一文为你说清楚

遇到epub文件打不开的问题&#xff0c;您可以按照以下方法进行操作&#xff1a; 方法一&#xff1a;使用epub电子书阅读器软件 ①在您的设备上下载并安装一个电子书阅读器应用程序&#xff0c;例如NeatReader就是一个很好用的epub阅读器。下载前往https://www.neat-reader.cn …

程序人生,由“小作文”事件想到的

时势造英雄。自媒体时代&#xff0c;火出圈是靠大众的审美和爱好&#xff0c;自己能做的关键&#xff0c;其实是做好自己&#xff0c;选择向上生长&#xff0c;持续不断的读书、学习。同时保持一份好奇心&#xff0c;培养一个兴趣爱好并自得其乐。 展示自我 回想起我小时候&am…

Android 一分钟使用RecyclerView完美实现瀑布

【免费】安卓RecyclerView瀑布流效果实现资源-CSDN文库 1.WaterfallFlowActivity 主函数代码&#xff1a; package com.example.mytestapplication;import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.widget.Toast;im…

头部游戏厂商鸿蒙合作,开发岗又‘缺人‘

12月18日&#xff0c;米哈游宣布将基于HarmonyOS NEXT启动鸿蒙原生应用开发&#xff0c;成为又一家启动鸿蒙原生应用开发的头部游戏厂商。 作为一家创立于2011年的科技型文创企业&#xff0c;上海米哈游网络科技股份有限公司推出了众多高品质人气产品&#xff0c;其中包括《崩坏…

[GXYCTF2019]Ping Ping Ping (文件执行漏洞)

本题考点&#xff1a; 1、命令联合执行 2、命令绕过空格方法 3、变量拼接 1、命令联合执行 ; 前面的执行完执行后面的| 管道符&#xff0c;上一条命令的输出&#xff0c;作为下一条命令的参数&#xff08;显示后面的执行结果&#xff09;|| 当前面的执行出错时&#xff08;为…

波奇学Linux:进程等待

僵尸进程(Z状态)无法被kill指令杀死&#xff0c;通过进程等待杀掉它&#xff0c;解决内存泄漏问题&#xff08;进程处于僵尸态&#xff0c;仍然维护pcb结构体来解决问题&#xff09; 通过进程等待&#xff0c;获得进程退出情况 wait回收僵尸态进程 我们可以看到进程由五秒后子…

工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!

来源&#xff1a;飞凌嵌入式官网 当前新一轮科技革命和产业变革突飞猛进&#xff0c;工业领域对高性能、高可靠性、高稳定性的计算需求也在日益增长。为了更好地满足这一需求&#xff0c;飞凌嵌入式与芯驰科技&#xff08;SemiDrive&#xff09;强强联合&#xff0c;基于芯驰D9…

机器视觉【1】相机的成像(畸变)模型

零、前言 很久没写文章&#xff0c;简单唠一唠。 不知道巧合还是蜀道同归&#xff0c;部门领导设定了些研究课题&#xff0c;用于公司部门员工的超前发展&#xff0c;该课题是“2D to 3D的三维重建”&#xff0c;这一块刚好是我个人看中的一个大方向&#xff0c;所以就有了这…

【03】GeoScene创建海图或者电子航道图数据

1 配置Nautical属性 1.1 管理长名称 长名称&#xff08;LNAM&#xff09;是一个必要的对象标识符&#xff0c;是生产机构&#xff08;AGEN&#xff09;、要素识别号码&#xff08;FIDN&#xff09;和要素识别子项&#xff08;FIDS&#xff09;组件的串联。这三个子组件用于数…

linux性能优化-cpu使用率

文章目录 1.CPU使用率2.节拍率的概念2.1.查看系统节拍率2.2.用户节拍率2.3.CPU使用率公式 3.怎么查看CPU使用率3.1.top显示系统总体CPU使用情况3.2.pidstat分析每个进程CPU使用情况 4.CPU使用率过高怎么办4.1.perf命令详解 1.CPU使用率 用什么指标来描述系统的CPU性能呢?不是…

深度学习——AlexNet

论文信息 论文名称&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 论文别名&#xff1a;AlexNet 发表期刊&#xff1a;NIPS 论文地址: https://www.cin.ufpe.br/~rmd2/ImageNet%20classification%20wth%20deep%20convolutional%20neural%20net…

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页&#xff0c;这些网页具有极高的吸引力和价值&#xff0c;能够吸引搜索引擎蜘蛛&#xff08;Spider&#xff09;的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点&#xff1a; 如何联系蚂蚁seo&#xff1f; baidu搜索&#xff1a;如…

Python开发GUI常用库PyQt6和PySide6介绍之一:概述

Python开发GUI常用库PyQt6和PySide6介绍之一&#xff1a;概述 Python开发GUI有许多选择&#xff0c;下面是常见的选择&#xff1a; Tkinter&#xff1a;Tkinter是Python标准库中的一个GUI工具包&#xff0c;易于学习和使用。它提供了丰富的组件和布局选项&#xff0c;适用于简…

后端相关随机题目记录(1)

目录 后端相关随机题目记录&#xff08;1&#xff09; 后端相关随机题目记录&#xff08;1&#xff09;Bean的类型以及作用域Bean的生命周期Mysql的底层数据结构RedisHttp和Https区别AOP在项目的应用 自定义注解&#xff1f;请求在spring中的一个流程Nacos与zk的区别SpringMV…