行为树(BEHAVIOR TREES)及其工业应用

        顾名思义,行为树是描述事物(人,动物,机器人,虚拟角色等等)行为的树形结构。游戏行业使用行为树为角色行为建模。现在行为树建模技术正在向其它领域渗透,比如工业产线编排,机器人控制。

    另一方面,从一些自动化厂商的技术发展趋势可以看出,开放自动化正朝着从底层编程,建模技术逐步上移,采用更高级的领域语言和高层建模技术,逐步走向基于自然语言的编程与建模的目标。

    行为树和有限自动机是两种主要的行为建模方式。

     行为树由三类预定义的节点(node)构建的树,它们分别是 根(root),工作流(workflow)和执行节点。用它们来描述“某些”行为。节点的返回是成功(Success),失败(Failure )和运行(Running)

       设想你感觉饿了,准备去烹饪一个肉,或者订购一份外卖。我们可以用下面的行为树来描述:

      也许你并不知道SELECTOR 和 SEQUENCE的含义,但是你大致了解行为树描述的行为模型的意义。只有一个节点会成功,做成一份肉,或者点了一份外卖。

节点类型

(动作/任务/叶)Action/Task/Leaf nodes

叶节点分为两类:

  • 动作: 完成某类动作,例如:开门 
  • 条件: 检测某类条件

复合节点(Composite nodes)

复合节点是有多个子节点(Child)的节点,主要包括下列三种:

顺序(Sequence)

顺序节点包含多个子节点,一旦执行,将顺序执行子节点。其中一个子节点执行错误便返回失败。

for child in children:status = child.run()if status == RUNNING or status == FAILURE:return statusreturn SUCCESS

选择器(Selector)

      选择器节点具有多个子节点,一旦执行,它执行所有节点,直到某一个成功,否则便失败。你可能看出来,它正好与顺序节点相反。

for child in children:status = child.run()if status == RUNNING or status == SUCCESS:return statusreturn FAILURE

 

 修饰器节点(Decorator)

修饰器只有一个子节点,它大多数用于实用节点(utility  Nodes),例如

  • Repeater: 无限制执行,或者执行一段时间子节点。
  • Inverter: 子节点的结果取反
  • AlwaysSucceed: 失败变成成功.
  • UntilFail: 运行直到出错

 其它的复合节点包括

  • 并行执行
  • 随机执行

黑板(Blackboard)

        几乎在大多数情况下,某个节点需要与其它的节点对话,行为树具有数据存储的能力,它们被称为黑板或者数据脉络(blackboard,  data context),比如一个节点发现最近的敌人,而另一个节点袭击它。它们之间要交换敌人的方位信息

 行为树的应用

  • 游戏
  • 对话AI
  • 机器人

行为树在工业软件中的应用 

   在制造业中,人们使用行为树为工作流程建模。例如将制造行业的标准工单(SOP-Standard Operation Procedure)转换成为行为树模型。构建了行为树模型之后,工业软件能够将行为树转换成为执行程序,每个节点对应与一个功能块(function block)。从而实现工作流自动化和低代码。

     搜索Github 可以找到许多Python和C++ 的行为树库。也有专门支持ROS 的机器人行为树库。

行为树与功能块相结合

        开放自动化领域中的功能块是一种模块化技术,将完成某个单一功能的程序段封装成功能块,并且提供规范的功能块接口。功能块适合图形化编程。显然,使用功能块实现行为树是有效的方法。能够方便地将行为树图模型转换成为功能块图网络。

      

 模型和代码的分层架构

 

结束语

      行为树作为一种行为建模方式,在工制造业的基于标准工单的作业流控制,机器人,AGV 等场合具有广阔的市场应用。

          不过也应该指出,行为树和有限状态机一样,它是一种建模方法,并不是一个技术标准。在具体应用中有灵活的应用方法。行为树模型和其它建模方法相结合,能够成为高层建模方法,例如OPCUA 和IEC61499 基于事件功能块信息模型。进一步地,随着chatGPT 大语言模型的行业应用的普及,能够与基于自然语言的领域语言DSL 相结合。促进建模技术向更高层,有高效的方式的应用。

        俗话说,“基础不牢,地动山摇”。当我们研究和学习新技术和创新思想时候,基础技术需要掌握的。与此同时,也要借鉴其它行业的成功经验,这样才能够到达“它山之石,可以攻玉”的境界。

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

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

相关文章

【从零开始学习C++ | 第二十一篇】C++新增特性 (上)

目录 前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结: 前言: C的学习难度大,内容繁多。因此我们要及时掌握C的各种特性,因此我们更新本篇文章,向…

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存,那么既然引入缓存,那就会有一个缓存与数据库数据一致性的问题。 首先,我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式,是最常见的Redis缓存模式&a…

【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

使用Shell制作MySQL自动复制日库月库生成新的日库和月库脚本

日库生成脚本daily.sh #!/bin/bash . /etc/profile . ~/.bash_profile HOSTNAME"127.0.0.1" #数据库信息 PORT"3306" USERNAME"root" PASSWORD"123456" DBNAME"datatest" #要…

【深入探究人工智能】:历史、应用、技术与未来

深入探究人工智能 前言人工智能的历史人工智能的应用人工智能的技术人工智能的未来当代的人工智能产物结语🍀小结🍀 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 &am…

LangChain大型语言模型(LLM)应用开发(三):Chains

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

【UE4 塔防游戏系列】10-防御塔升级

目录 效果 步骤 一、根据防御塔等级修改子弹伤害 二、根据防御塔等级修改子弹速度 三、根据防御塔等级修改检测半径 四、根据防御塔等级修改子弹颜色 五、根据防御塔等级修改换弹时间 效果 步骤 一、根据防御塔等级修改子弹伤害 1. 打开“TowerBaseBullet_Child”&…

现代C++语言核心特征解析——专栏介绍

本专栏用来介绍C新特性,其中包括C11、C14、C17、C20的特性。 下面是C各个版本的出现时间: C版本 时间C112011~2013C142014~2016C172017~2019C202020~2022C232023~ 接下来特性更新的顺序不会按…

52 类 110 个常用 Java 组件和框架整理

目录 WEB 容器 数据库 缓存 消息队列 负载均衡 分布式存储 数据库集群 分布式协调 大数据相关 日志收集与分析 搜索 系统监控 分库分表 微服务 RPC 框架 网络框架 MVC 框架 数据层框架 数据库连接池 Redis 客户端 Rest 接口设计与开发 数据参数校验 安全…

【ArcGIS Pro二次开发】(48):三调土地利用现状分类面积汇总统计

之前做了一个三调三大类面积统计,有小伙伴反映太粗糙,想要一个完整的地类面积汇总表。 【ArcGIS Pro二次开发】(35):三调三大类面积统计 本质上并没有多少难度,之前也做过类似的用地用海汇总表,于是拿出来改一改就好了…

python类中的@classmethod和@staticmethod

classmethod classmethod修饰符对应的函数不需要实例化,无需self参数,但需要cls参数以调用类的属性、类的方法 class A:a 10def printb(self, b):print(b)classmethoddef printa(cls):print(cls.a)print(cls().printb(5))A.printa()"""…

scrapy---爬虫中间件和下载中间件

爬虫中间件 # 爬虫中间件 (了解) middlewares.py class MysfirstscrapySpiderMiddleware:classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s cls()crawler.signals.connect(s.spider_opened, signalsignals.spider_opene…

JavaScript的static、this、super关键字介绍

JavaScript的static、this、super关键字介绍 static关键字: ☆ static关键字用于定义类的静态方法和静态属性。 ☆ 静态方法是直接与类相关联的方法,不需要实例化类即可调用。 ☆ 静态属性是类本身的属性,而不是实例的属性。 ☆ 在静态方…

Git学习总结

Git学习 目录 Git学习1.基础1.1 Git Commit:提交记录1.2 Git Branch:创建分支1.3 Git Merge:合并分支的方式一1.4 Git Rebase:合并分支的方式二1.5 查看提交记录:提交历史、详细信息、commit_hash1.6 在提交树上移动 2. 高级2.1 HEAD2.2 相对引用2.3 使用相对引用强…

css 弹性布局的详细说明

CSS弹性布局(Flexible Box Layout,简称Flexbox)是一种用于创建自适应和可伸缩布局的CSS模块。它提供了一种简单而强大的方式来对容器中的子元素进行布局,使它们能够自动调整大小、排列和对齐。 Flexbox通过在容器和子元素上应用一…

window 命令笔记

1.查看端口 输入“netstat -ano”并回车可以获得所有网络连接活动的列表,在表中,本地地址IP地址后方冒号之后的即是端口号: 如果想要查找特定的端口可以输入命令“netstat -aon|findstr “端口号””,例如“netstat -aon|findstr…

My_window类(带有next和quit按钮)

运行代码: //My_window类(带有next和quit按钮) #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"//--…

解决错误 “Plugin ‘maven-clean-plugin:3.1.0‘ not found“ 的方法详解

系列文章目录 文章目录 系列文章目录前言一、检查 Maven 插件版本:二、检查 Maven 仓库:三、检查 Maven 配置:总结 前言 在使用 Maven 构建项目时,可能会遇到错误信息 “Plugin ‘maven-clean-plugin:3.1.0’ not found”&#x…

C++基础算法离散化及区间合并篇

📟作者主页:慢热的陕西人 🌴专栏链接:C算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了双指针,位运算,离散化以及区间合并。…

有效的括号(C)

bool isValid(char* s) {ST st;StackInit(&st);while (*s) //遍历 -- 与\0终止{//是左括号 压栈if (*s ( || *s [ *s {){StackPush(&st, *s);s;}else{//应对样例: ’]if (StackEmpty(&st)){StackDestroy(&st);return false;}//不是左括号 应该就…