行为树的基本概念和C++库

news2025/2/25 22:21:47

一 说明

        行为是计算机科学、机器人技术、控制系统和视频游戏中使用的计划执行的数学模型。它们以模块化方式描述一组有限任务之间的切换。他们的优势来自于他们能够创建由简单任务组成的非常复杂的任务,而不用担心简单任务是如何实现的。行为树与分层状​​态机有一些相似之处关键区别在于行为的主要构建块是任务而不是状态。它易于人类理解,使得行为树不易出错,并且在游戏开发者社区中非常受欢迎。行为树已被证明可以推广其他几种控制架构。[1] [2]

        对双臂机器人的搜索和抓取计划进行行为树建模。

二 背景概述

        基于行为的控制结构最初由 Rodney Brooks 在其题为“移动机器人的鲁棒分层控制系统”的论文中提出。在最初的提案中,一系列行为可以相互替代,后来该方法在行为的树状组织中得到了扩展和概括,并在游戏行业中得到了广泛应用[需要引用]作为对行为进行建模强大工具。非玩家角色(NPC)的行为。[3] [4] [5] [6]它们已广泛应用于Halo、Bioshock和Spore 等备受瞩目的视频游戏中。最近的工作提出行为树作为无人机、复杂机器人、机器人操纵和多机器人系统的多任务控制框架。[7] [8] [9] [10] [11] [12] 行为树现已达到游戏 AI 教科书、[13] [14]以及Unity(游戏)等通用游戏环境的成熟度。引擎)和虚幻引擎(请参阅下面的链接)。

        行为树因其开发范式而变得流行:只需对 NPC 的动作进行编程,然后设计一个树结构(通常通过拖放)即可创建复杂的行为,其叶节点是动作,其内部节点决定 NPC 的决策。行为树在视觉上直观且易于设计、测试和调试,并且比其他行为创建方法提供更多的模块化性、可扩展性和可重用性。

        多年来,行为树的多样化实现在效率和能力上不断提高,以满足行业的需求,直到演变为事件驱动的行为树。[15] [5]事件驱动的行为树通过改变树内部处理其执行的方式以及引入一种可以对事件做出反应并中止正在运行的节点的新型节点,解决了经典行为树的一些可扩展性问题。如今,事件驱动行为树的概念已成为标准并在大多数实现中使用,尽管为了简单起见它们仍被称为“行为树”。

三 关键概念 

        行为树以图形方式表示为有向树,其中节点被分类为根、控制流节点或执行节点(任务)。对于每对连接的节点,传出节点称为父节点,传入节点称为子节点。根没有父节点且只有一个子节点,控制流节点有一个父节点和至少一个子节点,而执行节点有一个父节点且没有子节点。从图形上看,控制流节点的子节点放置在其下方,从左到右排序。[16]

        行为树的执行从根部开始,根部以一定的频率向其子节点发送刻度。勾号是允许执行子进程的启用信号。当行为树中的某个节点被允许执行时,如果执行尚未完成,则向父节点返回运行状态如果达到目标,则返回成功;否则返回失败

3.1 控制流节点 

        控制流节点用于控制其组成的子任务。控制流节点可以是选择器(回退)节点或序列节点。他们依次运行每个子任务。当一个子任务完成并返回其状态(成功或失败)时,控制流节点决定是否执行下一个子任务。

        选择器(后备)节点 

图 I. N 个任务的后备组合的图形表示。

        回退节点用于查找并执行第一个未失败的子节点。当回退节点的一个子节点返回成功或正在运行时,后备节点将返回成功或立即运行的状态代码(参见图 I 和下面的伪代码)。孩子们按照重要性顺序从左到右打勾。

在伪代码中,后备组合的算法是:

for i from 1 to n do
     childstatus ← Tick(child(i))
     if childstatus = running
        return running
     else if childstatus = success
         return success
 end
 return failure

序列节点 

图二。N 个任务的序列组合的图形表示。。

        序列节点用于查找并执行第一个尚未成功的子节点。当序列节点的一个子节点返回失败或运行时,序列节点将立即返回失败或运行的状态代码(参见图 II 和下面的伪代码)。子项按从左到右的顺序勾选。

在伪代码中,序列组合的算法是:

for i from 1 to n do
2     childstatus ← Tick(child(i))
3     if childstatus = running
4         return running
5     else if childstatus = failure
6         return failure
7 end
8 return success

3.2 数学状态空间定义[编辑]

为了将控制理论工具应用于行为树的分析,可以将它们定义为三元组。[17]

在这里 i \in \mathbb{N},是行为树的索引 f_i: \mathbb{R}^n \rightarrow \mathbb{R}^n;是一个向量域到向量的

f_i: \mathbb{R}^n \rightarrow \mathbb{R}^n 是表示常差分方程右侧的向量场,

\Delta t 是时间步长并且

r_i: \mathbb{R}^n \rightarrow \{R_i,S_i,F_i\} 是返回状态,可以等于 Running R_{i},成功S_{i},或失败 F_{i}。

注意:任务是一个没有父级也没有子级的退化行为树

3.3 行为树执行

        行为树的执行由以下标准常差分方程描述:

        {\displaystyle x_{k+1}(t_{k+1})=f_{i}(x_{k}(t_{k}))}

        t_{k+1}=t_{k}+\Delta t

        在这里

        k\in \mathbb{N} 表示离散时间,并且  

        x \in \mathbb{R}^n是由行为树建模的系统的状态空间。

3.4 序列组成

        两个行为树 T_{i}T_{j}可以组成更复杂的行为树T_{0} ;使用序列运算符 T_0=\mbox{sequence}(T_i,T_j).

然后返回状态r_{0} 和向量场f_{0}关联于T_{0}被定义(对于{\displaystyle {\mathcal {S}}_{1}}^{[definition\; needed]})如下:

 {\displaystyle r_{0}(x_{k})={\begin{cases}r_{j}(x_{k})&{\text{ if }}x_{k}\in {\mathcal {S}}_{1}\\r_{i}(x_{k})&{\text{ otherwise }}.\end{cases}}}

{\displaystyle f_{0}(x_{k})={\begin{cases}f_{j}(x_{k})&{\text{ if }}x_{k}\in {\mathcal {S}}_{1}\\f_{i}(x_{k})&{\text{ otherwise }}.\end{cases}}}

 

四 C++行为树的实施

4.1 关于此库

        此C++库提供了一个创建行为树的框架。 它的设计灵活、易于使用且快速。

        即使我们的主要用例是机器人技术,您也可以使用此库为游戏构建 AI,或替换应用程序中的有限状态机。

        与其他实现相比,BehaviorTree.CPP具有许多有趣的功能:

  • 它使异步操作(即非阻塞例程)成为一等公民。
  • 树是在运行时使用解释语言(基于 XML)创建的。
  • 它包括一个日志记录/分析基础结构,允许用户 可视化、记录、重放和分析状态转换。
  • 您可以静态链接自定义树节点或将它们转换为插件 在运行时加载。

4.2 行为树描述​

        行为树(BT)是一种构建不同之间切换的方法 自主代理中的任务,例如计算机游戏中的机器人或虚拟实体。

        BT是创建模块化和反应式复杂系统的一种非常有效的方法。 这些特性在许多应用中至关重要,这导致了传播 从计算机游戏编程到人工智能和机器人的许多分支的BT。

        如果您已经熟悉有限状态机 (FSM),您将 轻松掌握大多数概念,但希望您会发现 BT 更具表现力,更容易推理。

        将树的节点视为一组构建基块。 这些块是用C++实现的,并且是“可组合的”:换句话说,它们可以是 “组装”以构建行为。

        在上图中,您可以看到我们以简单的顺序排列这些操作; 操作将按从左到右的顺序执行。要了解更多信息,请访问BT简介页面。

4.3 行为树的主要优点

  • 它们本质上是分层的:我们可以组合复杂的行为,包括将整棵树作为更大树的子分支。 例如,行为“获取啤酒”可能会重用树 “抓住对象”。

  • 它们的图形表示具有语义意义:更容易 “阅读”BT并了解相应的工作流程。 相比之下,FSM中的状态转换更难理解 无论是在文本还是图形表示中。

  • 它们更具表现力:即用型控制节点和装饰器节点 使表达更复杂的控制流成为可能。用户可以扩展 “词汇”与他/她自己的自定义节点。

五 为什么我们需要行为树(或FSM)​

        许多软件系统,机器人技术是一个值得注意的例子,本质上是 复杂。

        管理复杂性、异构性和可扩展性的常用方法是 使用基于组件的软件工程的概念。

        任何现有的机器人中间件都非正式或正式地采用了这种方法, 是ROS,YARP和SmartSoft的一些值得注意的例子。

        一个“好”的软件架构应该具有以下特征:

  • 模块性。
  • 组件的可重用性。
  • 可组合性。
  • 良好的关注点分离。

        如果我们从一开始就不牢记这些概念,我们就会创造 紧密耦合且可重用性较低的软件。

通常,软件系统的业务逻辑被“传播”到许多 组件,对开发人员来说很难 推理它并调试错误

为了实现关注点的强分离,最好集中 单个位置中的业务逻辑。

        有限状态机是专门为这个目标而创建的,但在 近年来,行为树越来越受欢迎,尤其是在游戏行业。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nuxt使用echarts

直接在页面写 bug1:安装包报错,就更换版本 bug2:图表出不来:需要定义宽高 bug3:需要resize大小 安装 npm install echarts4.9.0 plugins文件夹下新建echarts.js import Vue from vue import echarts from echarts /…

Windows 下 MySQL 8.1 图形化界面安装、配置详解

首先我们下载安装包 官方下载链接: MySQL :: Begin Your Download 网盘链接: https://pan.baidu.com/s/1FOew6-93XpknB-bYDhDYPw 提取码: brys 外网下载慢的同学可以使用上述网盘链接 下载完成后我们双击安装包即可进入安装界面 点击next 勾选同意协议&#…

【AIGC】图片生成的原理与应用

前言 近两年 AI 发展非常迅速,其中的 AI 绘画也越来越火爆,AI 绘画在很多应用领域有巨大的潜力,AI 甚至能模仿各种著名艺术家的风格进行绘画。 目前比较有名商业化的 AI 绘画软件有 Midjourney、DALLE2、以及百度出品的文心一格:…

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 4 ( provide 和 inject )

5.5 provide 和 inject 前面的知识告诉我们vue中组件之间传递值需要使用props来完成,但是props也有一定局限性。这个时候在vue3中还有另外的解决方法。那就是使用 provide 和 inject 允许父组件将数据传递给所有后代组件,而不管组件层次结构有多深。你要…

【linux基础(八)】计算机体系结构--冯诺依曼系统操作系统的再理解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 计算机体系结构 1. 前言2. 冯…

eBPF深度探索: 高效DNS监控实现

eBPF可以灵活扩展Linux内核机制,本文通过实现一个DNS监控工具为例,介绍了怎样开发实际的eBPF应用。原文: A Deep Dive into eBPF: Writing an Efficient DNS Monitoring eBPF[1]是内核内置的虚拟机,在Linux内核内部提供了高层库、指令集以及执…

Javascript小案例--树形菜单(菜单数据为对象)

理论上菜单层级可以无限多&#xff0c;因为是递归渲染。 gif效果图&#xff1a; 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

RHCE---Linux的计划任务

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 如果想要让自己设计的备份程序可以自动地在系统下面运行&#xff0c;而不需要手动来启动它&#xff0c;这是该如何处理&#xff1f;这些任务可以分为【单一】任务和【循环】任务&#xff0…

集简云票税通,高效、管理销项发票,满足多样化开票需求

随着数字化时代的到来&#xff0c;传统的纸质发票已经逐渐被电子发票所替代。然而&#xff0c;对于许多企业来说&#xff0c;管理和开具大量的销项发票仍然是一项繁琐的任务&#xff1a; 票税处理成本高&#xff0c;手工开票效率低。部分企业手工开票量大&#xff0c;耗费大量财…

问题:conda删除虚拟环境,报错no package names supplied

用conda 用 conda remove -n ScratchDet_20200114 删除虚拟 环境ScratchDet_20200114时报错 conda remove -n ScratchDet_20200114CondaValueError: no package names supplied,try "conda remove -h" for more details 解决方法&#xff0c;用下面的命令 conda env…

C++——vector(3)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月20日 内容&#xff1a;C部分——vector内容讲解 目录 前言&#xff1a; erase&#xff1a; erase和insert总结&#xff1a; resize&#xff1a; 深拷贝&#xff1a; 赋值&#xff1a; 结尾&#xff1a; 前言&…

CentOS7在磁盘 Disk /dev/vdb 格式化为xfs, 创建逻辑卷saas,并挂载到/home/saas

CentOS7在磁盘 Disk /dev/vdb 格式化为xfs&#xff0c; 创建逻辑卷saas&#xff0c;并挂载到/home/saas CentOS7在磁盘 Disk /dev/vdb 格式化为xfs&#xff0c; 创建逻辑卷saas&#xff0c;并挂载到/home/saasCentOS7在磁盘 Disk /dev/vdb 格式化为xfs&#xff0c;并挂载到/ho…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…

什么是浏览器的同源策略(same-origin policy)?它对AJAX有什么影响?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;⭐ 同源策略对AJAX的影响⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;…

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用Param接收多个参数&#xff1b;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。 如果您对Mybatis映射器的映射方法中使用Param接收多个参数不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…

DAZ To UMA⭐一.DAZ使用简介 / 设置DAZ导出的内容 / 获取模型纹理贴图

文章目录 🟥 DAZ快捷键🟧 DAZ界面介绍🟩 设置DAZ导出的内容1️⃣ 找到要导出的参数名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Assets🟦 获取模型纹理贴图🟥 DAZ快捷键 移动物体:ctrl+alt+鼠标左键 旋转物体:ctrl+alt+鼠标右键 导入模型:双击左侧模型…

修改接口,字段的内容允许清空,避免歧义,参数校验:@NotNull

1. 问题描述 修改接口&#xff0c;字段的内容允许清空&#xff0c;是否应该做参数校验&#xff1f;如何做参数校验&#xff1f; 2. 说明 2.1. 需要对字段进行校验。 因为不校验&#xff0c;字段可能不传&#xff0c;或者字段的值为null&#xff1b;这样无法判断出&#xff…

Nginx是如何支持百万并发的?

通过源码分析Nginx的整体架构,以及进程模型。Nginx是一个免费的,开源的,高性能的HTTP服务器和反向代理。以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx是一个Web服务器,也可以用作负载均衡器和HTTP缓存。 很多高知名度的网站都使用Nginx,比如:N…

【线性代数】为什么 AA* = |A|E

A A ∗ 矩阵相乘&#xff0c;刚好是行列式展开的定义 AA*矩阵相乘&#xff0c;刚好是行列式展开的定义 AA∗矩阵相乘&#xff0c;刚好是行列式展开的定义 矩阵提取一个因子 ∣ A ∣ &#xff0c;所有元素需要除 ∣ A ∣ 矩阵提取一个因子 |A|&#xff0c;所有元素需要除 |A| 矩…