行为树

< 所有主题

行为树简介

定义

行为树(Behavior Tree)是一种用于控制虚拟角色或系统行为的决策结构。它由多个节点组成,每个节点代表一个行为或决策步骤。行为树通过层次化的方式将复杂行为拆分成简单、可管理的子行为。

在 FactVerse Designer 中,行为树可以用于控制孪生体行为(例如设备的启动和停止)、孪生体的状态管理(如 AGV 小车从“待机”切换到“工作”状态)等。

执行规律

    1. 行为树的执行顺序为从上至下,从左到右。
    2. 当行为树运行到终结状态时,会回到根节点重新开始运行。
    3. 根节点只能有一个子节点。
    4. 当节点有子节点时,会优先执行它包含的子节点,当子节点按照从左至右的顺序运行完之后,再运行下一个节点。
    5. 行为树在不处于闲置状态或被删除时,是会一直按照顺序循环运行。

节点类型

根节点

创建行为树时会自动生成根节点,它是行为树执行的起始点。根节点不能被删除,而且只能连接一个子节点。

复合节点

复合节点用于控制子节点的执行顺序和逻辑判断,包括并行节点、选择节点和顺序节点。复合节点可以添加多个子节点,每个子节点可以是复合节点或动作节点。

    • 并行节点:并行节点下所有节点将一起执行。并行成功标准可以选择:
        • 一个子节点成功则成功
        • 所有子节点成功则成功
    • 选择节点:选择节点下方的子节点按照从左往右的顺序执行。只要遇到一个子节点返回成功,整个选择节点返回成功并且后面的子节点将不再执行;如果所有子节点都失败,则选择节点返回失败。
    • 顺序节点:顺序节点下方的子节点按从左到右的顺序执行。

遍历策略

顺序节点支持以下两种遍历策略来决定执行流程的终止条件:

    • 遇到子节点执行失败则返回失败:子节点从左至右依次执行,一旦某个子节点执行失败,整个顺序节点立即返回失败,不再继续执行剩余的子节点。
    • 全部子节点执行失败则返回失败:所有子节点都会依次执行,只有当所有子节点都执行失败时,顺序节点才返回失败。如果任意子节点执行成功,则顺序节点返回成功。

循环类型

顺序节点支持以下几种循环类型,用于场景中需要重复执行子节点的情况:

    • 不循环:顺序节点下的子节点仅执行一遍,不重复执行。
    • 所有子孪生体:顺序节点会对每个子孪生体依次执行子节点的操作,即在每个孪生体上执行一轮完整的操作流程。
    • 容器属性:根据容器属性,顺序节点会对容器内的每个元素依次执行子节点。
    • 数字增量循环:根据预设的循环次数,顺序节点会在递增的数值下多次执行子节点,直到达到终止条件。

退出循环的方式

在循环执行过程中,顺序节点提供以下退出条件:

    • 循环结束退出:达到预设的循环次数后退出。
    • 遇到成功则退出:一旦某个子节点成功执行,立即停止循环并返回成功。
    • 遇到失败则退出:一旦某个子节点执行失败,立即停止循环并返回失败。

动作节点

动作节点表示孪生体具体的行为或任务,例如沿路径移动、等待等。动作节点是行为树中的叶子节点,可以实现复杂的逻辑。当执行动作节点时,它会执行特定的动作,并根据情况返回成功、运行中或失败三种返回值。

    • 成功:表示当前节点运行成功;
    • 运行中:表示当前节点还在运行中,下一次调用行为树时仍然运行当前节点;
    • 失败:表示当前节点运行失败。

节点的配置

节点基本操作

    1. 添加节点:从节点菜单中拖拽到编辑区。
    2. 删除节点:在编辑区中选中要删除的节点,点击工具栏中的删除按钮。
    3. 重命名节点:在编辑区中选中要重命名的节点,在属性区上方节点名称处,输入节点的新名称。
    4. 连接节点:要连接A 与B两个节点,从节点 A下方的横线处,拖拽出一条黄色的连接线,将其连接到节点B上方,松开鼠标完成连接。

5. 删除节点连接线:按住鼠标右键,在要删除的连接线上划过就可以切断两个节点之间的连线。

6. 整理节点:选中根节点,然后按下 L 键,便可以自动整理树的格式。

节点的常用设置

行为树中的节点条件和属性设置中经常会需要获取孪生体的属性、孪生体、孪生体的位置。

选择属性

  •  

属性的来源

    • 孪生体的属性:从孪生体模板中选择特定属性。
      • 孪生体的来源
        • 自身:选择当前正在执行行为树的孪生体。
        • 临时孪生体:选择在执行过程中临时创建或使用的孪生体。
        • 属性中的孪生体:通过属性中存储的唯一标识符来查找并选择特定的孪生体。
        • 场景中的所有孪生体:在整个场景中查找孪生体。
    • 树属性:从当前行为树的属性中获取属性值。
    • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。

选择值

值的来源

    • 手动输入
    • 孪生体中的属性
      • 孪生体的来源:选择孪生体
      • 目标属性
    • 树属性
      • 树属性:选择具体的行为树属性
    • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。

选择孪生体

选择孪生体的基础方式

    • 自身:选择当前正在执行行为树的孪生体。
    • 临时孪生体:选择在执行过程中临时创建或使用的孪生体。
    • 属性中的孪生体:用户选择此项时,系统将使用属性中存储的信息作为孪生体ID进行查找,返回与该标识符匹配的孪生体。
    • 场景中的所有孪生体:在整个场景中查找孪生体。

进阶选择(孪生体过滤方式:当使用“场景中的所有孪生体”作为查找孪生体的基础方式时,可以通过不同的过滤方式来精确定位需要查找的孪生体

        • :不使用任何过滤条件,直接在场景中查找所有孪生体。
        • 指定孪生体
            • 选择孪生体
            • 选择属性中存储的孪生体
        • 按最小距离查找孪生体根据孪生体与当前执行行为树的孪生体之间的距离进行筛选,找到最近的孪生体。

选择孪生体的进阶方式

    • :无特定进阶方式
    • 父孪生体:查找当前孪生体的父孪生体。例如,传送带上的货物的父孪生体是传送带。
    • 最后一个子孪生体:查找当前孪生体的最后一个子级孪生体。例如,一组生成的产品中的最后一个产品。
    • 第一个子孪生体:查找当前孪生体的第一个子级孪生体。例如,一组生成的产品中的第一个产品。
    • 所有子孪生体:查找当前孪生体的所有子级孪生体。例如,生产线上的所有产品。
    • 上一个孪生体:查找当前孪生体的前一个兄弟孪生体。例如,传送带上某个产品的前一个产品。
    • 下一个孪生体:查找当前孪生体的下一个兄弟孪生体。例如,传送带上某个产品的下一个产品。

查找对象的类型:选择要查找的目标对象,目标对象可以是孪生体本身或孪生体中的特定角色。

    • 孪生体:选择查找整个孪生体对象,用于对孪生体进行整体操作或获取其属性。例如,查找并操作一台机器人、一个生产线设备或一个货架单元。
    • 孪生体中的角色:选择查找孪生体中的特定角色。这种类型用于对孪生体内部的具体部分进行操作,例如,一个原料生成器的孪生体模板中包含生成器模型、出口和进度条几个角色。

选择位置

获取位置的方式

    • 手动输入
        • 直接输入点的3维坐标值,格式x,y,z
        • 示例:输入 “10,20,30”表示具体的空间位置。
    • 孪生体的位置:使用孪生体的当前位置
    • 孪生体的属性:从孪生体的属性中获取位置。
    • 树属性:从行为树的属性中获取位置。
    • 通过属性寻找路径地图中的点位:使用属性值在路径地图中寻找点位。

坐标类型

    • 局部坐标:相对于某个参考点的坐标。传送带上的货物的局部坐标是相对于传送带中心点的坐标。
    • 坐标:全局坐标,即世界坐标。

孪生体节点

孪生体节点用于创建、删除和操作孪生体及其属性。

创建孪生体

功能:以指定姿态(位置、旋转角度)创建指定孪生体模板对应的孪生体。

参数说明

    • 使用的模板:选择用于创建孪生体的模板。
    • 位置:设置新孪生体在场景中的创建位置。
    • 旋转:设置新孪生体的旋转角度。

示例配置

以下示例展示了如何配置“创建孪生体”节点,使得孪生体A在自己的出口处创建新的孪生体:

    1. 使用的模板
      • 值的来源:选择“孪生体中的属性”
      • 孪生体的来源:选择“自身”
      • 目标属性:选择“孪生体 A 的模板”>“产生孪生体的标识符”(这是用户在孪生体 A 的模板中自定义的模板标识符属性)
    1. 位置
      • 值的来源:选择“孪生体中的属性
      • 孪生体的来源:选择“自身”
      • 孪生体的属性:选择“孪生体A的模板”> “出口” > “出入口的位置”
    1. 旋转
      • 手动输入:设置旋转角度为 (0,0,0)

删除孪生体

功能:删除指定孪生体。例如,当生产线上的产品已经过期或不再需要时,自动删除这些产品。

参数说明

    • 目标孪生体:指定要删除的孪生体对象。
    • 孪生体的来源
      • 自身:删除当前执行行为树的孪生体。
      • 临时孪生体:删除在特定条件下自动生成的临时孪生体。
      • 属性中的孪生体:通过属性中的标识符查找并删除特定孪生体。
      • 场景中的所有孪生体:遍历场景中所有孪生体并删除符合条件的对象。

示例配置

在工厂生产线使用销毁器时,可以通过配置”删除孪生体”节点来实现自动移除不需要的产品。以下是具体配置:

目标孪生体:选择“临时孪生体”,处理在运行过程中自动生成并需要删除的临时产品或部件。

设置属性

功能:设置孪生体或行为树的任意属性。您可以通过设置属性节点来更新产品状态、调整生产设备参数,或控制流程中的特定行为。

参数说明

    • 目标属性

指定要设置的属性,可以是孪生体或行为树中的任意属性。

    • 属性的来源
      • 孪生体中的属性:从特定孪生体中选择属性。
      • 树属性:从当前行为树的属性中获取值。
      • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。
    • 数值的设置策略
      • 替换原始值:直接用新值替换现有属性值。
      • 与原数值求和:将新值与当前属性值相加。

设置的值可通过以下方式指定:

        • 手动输入:直接输入数值。
        • 孪生体中的属性:从指定孪生体的属性中获取值。
        • 树属性:从行为树的属性中获取值。
        • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。

设置孪生体姿态

功能:设置孪生体或孪生体内角色的位置和旋转。例如,调整机器人手臂的位置和角度以执行特定任务。

参数说明

    • 目标

指定要调整姿态的对象,可以是孪生体本身或孪生体中的特定角色。

        • 孪生体:选择要调整的孪生体。
        • 孪生体中的角色:选择孪生体内部的具体角色进行姿态调整。
    • 位置

设置孪生体或角色在场景中的坐标位置。

    • 旋转

设置孪生体或角色的旋转角度。

设置孪生体父物体

功能:将一个孪生体或其中的角色设置为另一个孪生体或其角色的子物体。例如,在生产设备的装配中,某个组件可以设置为机器主体的子物体。

参数说明

    • 目标

指定要设置层级关系的对象,可以是一个孪生体或孪生体中的某个角色。

        • 孪生体:选择孪生体作为目标对象。
        • 孪生体中的角色:选择孪生体中的特定角色作为目标对象。
    • 无父级对象:移除目标对象的父级关系,使其不再从属于任何父物体。
    • 新的父级对象

选择新的父级对象,允许将目标对象附加到另一个孪生体或其角色上,形成新的父子关系。

        • 孪生体:选择新的孪生体作为父级对象。
        • 孪生体中的角色:选择孪生体中的特定角色作为新的父级对象。
    • 修改前后保持坐标不变:勾选此选项后,目标对象的坐标将保持不变,即使其父级关系发生变化。

获取孪生体

功能:将指定的孪生体设置为当前孪生体,或将孪生体的标识符保存到指定属性中,方便后续流程中的调用和操作。

参数说明

    • 目标

指定需要获取的孪生体来源。

        • 自身:当前正在执行行为树的孪生体。
        • 临时孪生体:执行过程中动态创建的孪生体。
        • 属性中的孪生体:从属性中获取孪生体标识符并找到对应的孪生体。
        • 场景中的所有孪生体:在整个场景中查找符合条件的孪生体。
    • 孪生体设置选项

选择如何处理获取到的孪生体。

        • 设置孪生体到当前孪生体:将获取到的孪生体设置为当前孪生体。
        • 设置孪生体到属性:将获取到的孪生体标识符保存到目标属性中,便于后续操作使用。

显示隐藏孪生体

功能:通过该节点控制孪生体或孪生体中的角色在场景中的显示或隐藏状态。例如,可以在特定的操作步骤中隐藏或显示某些孪生体,帮助学员更好地聚焦当前任务。

参数说明

    • 目标

选择要显示或隐藏的对象,可以是完整的孪生体或其中的某个角色。

        • 孪生体:选择整个孪生体为目标,进行显示或隐藏操作。
        • 孪生体中的角色:选择孪生体内的特定角色进行显示或隐藏操作。
    • 显示:控制目标对象的显示状态。
        • 启用:将目标对象设置为可见。
        • 禁用:将目标对象设置为不可见。

属性转 Vector3

功能:将三个不同的数值(如位置或旋转的X、Y、Z轴值)组合成一个三维向量(Vector3)形式。

参数说明

    • 属性1

用于三维向量的第一个分量(通常是X轴)。

    • 属性2

定义向量的第二个维度(Y轴)。

    • 属性3

定义向量的第三个维度(Z轴)。

删除容器元素

功能:从指定的容器(如列表、字典)中移除一个元素。容器是可以存储和管理多个元素的属性。这些属性可以包含其他对象或基本数据类型,并且提供了一些方法来访问和操作这些元素。当前版本支持的容器类型的属性有列表(List)和字典(Dictionary)。例如,从一个装有多个产品的虚拟仓库中移除指定的产品。

参数说明

    • 目标容器

指定要从中移除元素的容器。容器可以是列表或字典。

    • 清空容器内容

勾选此选项时,将清空目标容器中的所有元素。适用于需要重置容器状态的场景。

路径节点

路径节点用于设置和控制孪生体的移动路径。

设置孪生体移动路径

功能:将指定路径保存到孪生体或孪生体中角色中。通过配置路径、速度和移动起点,在需要时能够按照设定的路径进行移动,例如用于传送带上货物沿传送带移动。

参数说明

    • 要移动的目标

选择需要沿路径移动的目标,可以是整个孪生体或孪生体中的某个特定角色。

        • 孪生体:选择孪生体作为移动对象。
        • 孪生体中的角色:选择孪生体中的角色作为移动对象。
    • 目标路径

指定目标孪生体或角色移动的路径。路径可以通过手动输入或从已有属性中获取。

    • 反向移动:勾选此选项时,孪生体将沿指定路径的反方向进行移动。
    • 移动的起点

设置孪生体移动的初始位置。

    • 目标速度

设定孪生体移动时的速度。速度可以通过手动输入或从属性中获取。

    • 进入路径时保持原始旋转角度

勾选此选项后,孪生体在进入路径时将保持其原有的旋转角度,不会根据路径的方向自动调整。

示例:以下示例演示如何使用“设置孪生体移动路径”节点为传送带上的物品设置移动路径。

沿路径移动孪生体

功能:该节点用于沿指定路径移动孪生体或孪生体中的角色。例如,可以为 AGV(自动导引运输车)设置移动路径、起始点和移动速度,使其按照指定的路径和速度移动。

参数说明

    • 要移动的目标

选择需要沿路径移动的对象,可以是整个孪生体或其中的某个特定角色。

        • 孪生体:选择孪生体作为移动对象。
        • 孪生体中的角色:选择孪生体中的角色作为移动对象。
    • 使用当前路径:使用“当前移动路径”中已经保存的路径进行移动。
    • 移动过程中沿前进方向旋转:勾选此选项时,孪生体在沿路径移动过程中会自动旋转以保持与前进方向一致。默认勾选。
    • 反向移动:勾选此选项时,孪生体将沿指定路径的反方向进行移动。
    • 进入路径时保持原始旋转角度:勾选此选项后,孪生体在进入路径时将保持其原始旋转角度,移动过程中仍然可以按照“移动过程中沿前进方向旋转”的设置进行旋转。默认勾选。
    • 转弯的圆角半径:设置目标对象在路径转弯处的圆角半径。值越大,转弯时的动作越平滑。
    • 移动的起点:目标对象移动的起点。
    • 设置移动速度:如果不设置,目标对象将使用孪生体元数据中的速度属性值匀速运动。
        • 加速转为匀速的位置:设置加速运动在全路径中的占比(范围:0-1),当孪生体移动到该比例位置后,开始匀速运动。
        • 目标速度:设定孪生体移动时的匀速速度。
    • 设置末尾速度
        • 匀速变为减速的位置:设置匀速运动在全路径中的占比(范围:0-1),当孪生体移动到该比例位置后,开始减速运动。
        • 末尾速度:设定孪生体在即将停止时的末尾速度。

移动一步

功能:使目标孪生体以配置速度移动一步。例如,在自动化生产线上,使传送带上的物体移动一步,模拟物体在传送带上逐步移动的过程。

参数说明

    • 要移动的目:选择需要移动的目标,可以是整个孪生体或孪生体中的特定角色。
      • 孪生体:选择孪生体作为移动对象。
      • 孪生体中的角色:选择孪生体中的角色作为移动对象。
    • 目标速度:设定移动的目标速度。
    • 移动过程中沿前进方向旋转:勾选此选项时,移动过程中目标将沿着移动方向进行旋转。默认勾选。
    • 转弯的圆角半径:设置目标对象在转弯处的圆角半径,数值越大表示转弯越平滑。

生成路径

功能设置孪生体的“当前移动路径”属性。通过该节点,用户可以为孪生体(如机器人或AGV小车)生成路径,并将其保存为“当前移动路径”属性。该路径可以与“沿路径移动孪生体”节点配合使用,使孪生体按预定路径移动。

参数说明

    • 路径生成方式
      • 用路径生成:通过已有路径点名称生成孪生体的移动路径。
      • 用坐标生成:通过指定的起点和终点坐标生成路径。
    • 将路径保存到目标属性:指定路径将保存到的属性。
    • 起点:指定路径的起点。
      • 用坐标生成:需要设置起点的值为具体的坐标。
      • 用路径生成:需要选择路径的起点名称。
    • 终点:指定路径的终点。
      • 用坐标生成:需要设置终点的值为具体的坐标。
      • 用路径生成:需要选择路径的终点名称。

追踪路径规划

功能:设置孪生体的追击目标、最短路径、起始点,自动寻路追击目标孪生体。例如,机械臂在传送带上抓取一个移动的货物。

参数说明

    • 将路径保存到目标属性:指定路径规划后的路径保存的位置。
    • 起点:设置路径追踪的起始点。
    • 追踪目标
        • 孪生体:选择目标孪生体作为追踪对象。
        • 孪生体中的角色:选择孪生体中的特定角色作为追踪对象。

出入口节点

入口获取孪生体

功能:从指定的出入口获取孪生体,并将其设置为当前孪生体或保存到目标属性中。

参数说明

    • 目标出入口:选择要从中获取孪生体的出入口。
    • 孪生体设置选项
      • 设置孪生体到当前孪生体:将获取的孪生体设置为当前操作中的孪生体。
      • 设置孪生体到属性:将获取的孪生体保存到指定的属性中。
    • 移除出入口孪生体:勾选此选项时,将孪生体从指定的出入口中移除。

入口移除孪生体

功能:删除出入口处的孪生体。

参数说明

    • 目标出入口:选择要从中移除孪生体的出入口。

放置孪生体到出入口

功能:将指定的孪生体放置到选定的出入口位置。

参数说明

    • 目标出入口:选择孪生体要放置的出入口。
    • 目标孪生体:指定需要放置到出入口的孪生体。

存储区节点

出货整理

功能:将孪生体从指定的存储区中移除,模拟货物出库或物体从存储区域转移的过程。

参数说明

    • 目标存储区:选择需要移出孪生体的存储区。

入货整理

功能:将指定孪生体放入指定存储区。

参数说明

    • 目标存储区:选择需要存入孪生体的存储区。
    • 要存入的孪生体:指定要放入存储区的孪生体。

角色节点

播放动画

功能:播放指定孪生体或孪生体中的角色的指定动画,默认播放一次。

参数说明

    • 目标:选择动画播放的目标对象。
        • 孪生体:选择整个孪生体为动画播放对象。
        • 孪生体中的角色:选择孪生体中某个特定角色为动画播放对象。
    • 动画控制:设置动画的控制方式。
        • 动画状态
            • 播放:开始播放动画。
            • 暂停:暂停当前动画。
            • 继续播放:继续播放已暂停的动画。
            • 从头播放:从动画的起点重新播放。
        • 播放模式
            • 默认:从动画剪辑中读取循环模式(默认是播放一次)
            • 播放一次:当时间到达动画剪辑末尾时停止动画的播放。
            • 循环播放:当播放到末尾的时候重新从开始播放。
            • 循环往复播放:当时间到达动画剪辑的结尾,时间将在开始和结束之间,像乒乓一样来回播放。
            • 播放到最后一帧继续播放:回放动画。当达到结尾,它会继续播放最后一帧,永不停止播放。
    • 动画名称:需要手动填写动画名称,孪生体或角色必须包含此动画。可以通过DataMesh Importer 查看模型的动画名称。
        • 动画速度:设定动画播放的速度,默认为 1 倍速。

示例:以下示例演示如何使用“播放动画”节点为“六轴机械臂”播放“拾取并移动物品位置”的动画。

  •  
    • 目标:孪生体中的角色:六轴机械臂
    • 动画控制
        • 动画状态:播放
        • 播放模式:默认
        • 动画名称:“拾取并移动物品位置”
        • 动画速度:1(1倍速)

工具节点

闲置

功能:停止行为树的运行。

示例

以下闲置节点使用“出口处是否存在孪生体”的条件进行判断,当孪生体出口处存在其他孪生体时停止运行行为树。

产生记录

功能产生记录节点用于输出指定的文本内容,输出的内容显示在场景播放界面中的“场景输出信息记录”面板中。

参数说明

    • 要打印的内容:手动输入需要输出的文本内容。

等待

功能:等待节点用于暂停行为树的执行,直到设定的等待时间结束为止。一旦等待时间结束,行为树将继续执行等待节点后续的节点。

参数说明

    • 等待时长:设置行为树暂停的时间长度。
        • 手动输入:手动设定具体的等待时间(秒)。
        • 孪生体中的属性:使用孪生体属性值作为等待时间值。
        • 树属性:使用行为树中的属性来定义等待时间。
        • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。
    • 保存等待时长到属性:勾选此选项将等待的时间保存到指定的目标属性中,便于后续使用或记录。
        • 目标属性:选择保存等待时长的属性。

行为树节点

添加行为树

功能:将指定的行为树添加到目标孪生体上。

参数说明

    • 目标孪生体:选择需要添加行为树的孪生体。
    • 目标行为树:选择要添加到孪生体上的行为树。

移除行为树

功能:从目标孪生体上移除目标行为树。

参数说明

    • 目标孪生体:选择需要移除行为树的孪生体。
    • 目标行为树:选择要移除的行为树。

数学节点

数学节点用于进行各种数学运算,并将结果应用到孪生体属性中。

Sin函数

功能:将输入值转换为对应的正弦值并输出。

Cos函数

功能:将输入值转换为对应的余弦值并输出。

Tan函数

功能:将输入值转换为对应的正切值并输出。

正态函数

功能:使用输入值生成正态分布的输出数值。

泊松函数

功能:使用输入值生成泊松分布的输出数值。

随机数

功能:输出一个随机数。

加法运算

功能:选择孪生体的两个属性值进行加法运算,将计算结果替换孪生体某个指定属性值或与其相加。

减法运算

功能:选择孪生体的两个属性值进行减法运算,将计算结果替换孪生体某个指定属性值或与其相加。

乘法运算

功能:选择孪生体的两个属性值进行乘法运算,将计算结果替换孪生体某个指定属性值或与其相加。

除法运算

功能:选择孪生体的两个属性值进行除法运算,将计算结果替换孪生体某个指定属性值或与其相加。

事件节点

接收事件

功能:用于监听并响应指定事件。只有一个孪生体可以监听并响应此事件,例如,如果有两个 AGV 需要争抢同一个货物时,可以使用接收事件节点确保只有一个 AGV 响应货物到达的事件,从而避免冲突。

参数说明

    • 事件标识符:指定要监听的事件标识符。
    • 保存事件标识符到目标属性:开启此选项后,将监听到的事件标识符保存到目标属性,供后续操作或逻辑判断使用。

发送事件

功能:发送指定事件以触发其他孪生体的行为或动作。例如,在生产线上,当一个加工步骤完成后,可以发送一个事件通知下一个加工步骤的孪生体开始工作。

参数说明

    • 事件标识符:指定要发送的事件标识符,用于通知其他孪生体执行相关动作。
    • 是否发送孪生体:将当前孪生体随事件一起发送,供其他孪生体在接收事件时使用。

节点的条

定义

节点的条件可以应用于复合节点和动作节点,用来判断是否执行该节点。只有在条件满足时,节点才会被执行;如果不满足条件,节点将不会执行,并返回结果给父节点。

    • 条件组内的条件为的关系:在一个条件组中,所有条件都必须全部满足,节点才会被执行。
    • 多个条件组之间为的关系:如果一个节点设置了多个条件组,只要任意一个条件组满足,节点就可以执行。

常见条件

目标出入口上是否存在孪生体

此条件用于判断孪生体的出口或入口处是否存在其他孪生体。

参数说明

    • 目标:设置需要检查的出入口。

示例

下面的示例判断当前执行行为树的孪生体的入口处是否存在其他孪生体。

比较两个孪生体的属性值

此条件用于比较两个特定属性值,以确定是否满足特定条件。根据比较结果进行相应的行为逻辑处理。

参数说明

    • 目标属性1:用于比较的第一个孪生体属性值。
    • 目标属性2:用于比较的第二个孪生体属性值。
    • 比较策略:定义如何比较两个属性值。
        • 等于:目标属性1的值等于目标属性2的值。
        • 大于:目标属性1的值大于目标属性2的值。
        • 小于等于:目标属性1的值小于目标属性2的值。
        • 大于等于:目标属性1的值大于等于目标属性2的值。
        • 不等于:目标属性1的值不等于目标属性2的值。
  1.  

比较距离

该条件用于比较两个点之间的距离和参考值,根据比较结果进行相应的行为逻辑处理。

参数说明

    • 1
        • 获取位置的方式:选择如何获取第一个点的位置。有关位置选择的更多信息,请参阅选择位置
        • 坐标类型:选择使用的坐标类型,局部坐标或坐标。
    • 2
        • 获取位置的方式:选择如何获取第二个点的位置。
        • 坐标类型:选择使用的坐标类型,局部坐标或坐标。
    • 目标值:用于比较的参考距离值。
    • 比较策略:选择比较方式,用于判断两个点之间的距离与目标值的关系。
        • 等于: 两个点的距离等于目标值。
        • 小于:两个点的距离小于目标值。
        • 大于:两个点的距离大于目标值。
        • 小于等于:两个点的距离小于等于目标值。
        • 大于等于:两个点的距离大于等于目标值。
        • 不等于:两个点的距离不等于目标值。

示例

假设要判断传送带出口是否发生阻塞,当第一个物体距离出口的距离小于预设的安全距离时,可以判断条件满足阻塞。设置方法如下:

  1.  
    1. 1
      • 获取位置的方式:选择“孪生体中的属性”。
      • 坐标类型:选择“局部坐标”。
      • 孪生体中的属性:选择“孪生体中的属性”> “出入口的位置”
    2. 2
      • 获取位置的方式:选择“孪生体的位置”。
      • 坐标类型:选择“局部坐标”。
      • 查找孪生体的方式:选择“自身”> “第一个子孪生体”。
    3. 目标值
      • 值的来源:“孪生体中的属性”
      • 孪生体的来源:选择“自身”。
      • 目标属性: 选择“物品安全距离”。
    4. 比较策略:选择“小于”。

存储区是否有物体

此条件用于判断指定的存储区中是否存在物体。

参数说明

    • 目标存储区:设置需要检查的存储区。
        • 孪生体的来源:指定存储区所属的孪生体。

孪生体能否放入存储区

判断某个孪生体是否可以放入指定的存储区。

参数说明

    • 目标存储区:指定目标存储区。
        • 孪生体的来源:用于指定存储区所属的孪生体。
    • 目标孪生体:指定要存放的孪生体。
        • 孪生体的来源:用于指定要放入存储区的孪生体。

示例

假设我们需要判断某个货物是否可以放入当前执行行为树的A孪生体的存储区,可以按照以下步骤进行设置:

  1.  
    1. 目标存储区:选择“自身”。
    2. 目标孪生体:选择“临时孪生体”。

比较孪生体

此条件用于判断两个孪生体是否相同。

参数说明

    • 目标孪生体:选择要比较的孪生体。
    • 目标孪生体ID:选择用于对比的另一个孪生体的 ID。

编辑行为树

基本流程

编辑行为树的基本流程可以分为以下几个步骤:

1. 功能拆分

将复杂的功能拆分为多个独立的子功能。例如,对于一个原料生成器,可以将功能拆分为“生产”和“输出”两个子功能。

2. 准备孪生体模板

a) 创建孪生体模板

b) 添加资源:根据功能拆分的结果,为每个子功能实现的具体目标添加资源。例如,原料生成器的生产功能需要添加一个出口,以便将生成的物品输出。

c) 属性设置:为每个子功能设置相关的属性。例如,对于原料生成器的生产功能,需要设置生产间隔和生产物品所需使用的模板这两个属性。

3. 编辑行为树:使用行为树编辑器,为每个子功能定义具体的行为逻辑。例如,原料生成器的生产功能可以设置为以一定时间间隔(等待节点)进行生产(创建孪生体节点)。输出功能可以使用设置孪生体出入口的节点发送货物至出口。

示例

原料生成器的基本功能

1. 功能拆分:“生产”和“输出”。

2. 准备孪生体模板:

a) 创建孪生体模板:创建一个孪生体模板,并在模板中添加一个原料生成器模型(“/Public Directory/FactVerseDLC/ChuangJianQi_DLC”)。

b) 添加资源:为原料生成器的生产功能添加一个“出口”。

c) 属性设置:

i. 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构“Part_1”。

ii. 设置生产间隔属性:在“Part_1”下添加一个“产生孪生体间隔时间”(Double 类型)属性,并作如下设置:

            • 单位:“秒”;
            • 默认值:“3”;
            • 勾选“是否在孪生体中显示”选项。勾选此项后,用户在场景编辑器中使用此模板生成孪生体时,可以编辑此项属性。

iii. 设置生产物品所需使用的模板的 ID 属性:在“Part_1”下添加一个“产生孪生体的标识符”(String类型)属性,并作如下设置:

            • 用途:选择“孪生体模板”;
            • 勾选“是否在孪生体中显示”选项。

iv. 保存模板:点击工具栏中的【保存】按钮 进行模板的保存。

3. 行为树编辑:

a) 创建行为树

i. 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

ii. 在打开的窗口中,选择存储路径,并填写行为树名称。

iii. 点击【新建】按钮完成行为树的新建。

iv. 点击工具栏中的【保存】按钮 进行模板的保存。

b) 编辑行为树:新建的行为树“原料生成器行为树”只包含一个根节点,下面的步骤将为“原料生成器行为树”添加节点和节点的运行条件。

i. 在孪生体模板窗格中,双击行为树栏下新建的“原料生成器行为树”,打开行为树编辑器。

ii. 为“原料生成器行为树”添加一个选择节点,连接根节点选择节点。关于连接方式请参考节点基本操作

iii. 添加闲置节点,连接选择节点闲置节点。设置闲置节点的运行条件,使其当出口存在生产的物品时停止。

iv. 添加顺序节点,连接选择节点顺序节点

v. 添加等待节点,连接等待节点与顺序节点。设置等待节点的属性:

            • 等待时长:“孪生体的属性” > “产生孪生体间隔时间”

vi. 为生成器添加生产物品的节点:添加一个创建孪生体节点,连接顺序节点创建孪生体节点,设置创建孪生体节点的属性:

          • 使用的模板:选择“孪生体中的属性”>“产生孪生体的标识符”
          • 位置
              • 值的来源:选择“孪生体中的属性”
              • 孪生体的来源:选择“自身”
              • 目标属性:“出入口的位置”

vii. 添加设置孪生体到出入口的节点,连接顺序节点与设置孪生体到出入口节点,设置节点的属性:

            • 目标出入口
                • 孪生体的来源:选择“自身”
                • 选择出入口:选择“原料生成器”模板的“出口_1”
            • 目标孪生体:选择“临时孪生体”

viii. 点击工具栏中的【保存】按钮 保存行为树。

会移动的小球

1. 创建一个球体孪生体模板:

a) 点击主页中的【新建模板】,打开模板编辑器。

b) 将工具窗格中的“球体”拖拽到场景区中,并调整其合适位置。

c) 将小球的颜色改为绿色。

d) 点击工具栏中的保存按钮 ,保存模板名称为“移动的小球”。

2. 为“移动的小球”模板添加主功能结构:

a) 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构

b) 下拉滚动条找到新添加的结构 “Part_1”,点击“Part_1”,在属性区修改结构名称为“主功能”。

c) 在“主功能”结构下添加 “实时位置”(Vector3)属性。

3. 为“移动的小球”模板添加驱动小球移动的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“移动小球”。

4. 编辑行为树逻辑

a) 双击“移动小球”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点

c) 在顺序节点下添加一个设置孪生体姿态节点“设置孪生体姿态1”,并为该节点做如下属性设置:

        • 目标
          • 值的来源:孪生体
          • 孪生体的来源:自身
        • 位置
          • 值的来源:手动输入
          • :5,0,0

d) 在顺序节点下添加一个等待节点“等待1”,并设置等待时长手动输入值为“0.5”。

e) 添加一个设置孪生体姿态节点:

i. CTRL+C 复制 “设置孪生体姿态1”节点,CTRL+V 即在顺序节点下添加一个新的设置孪生体姿态节点“copy_设置孪生体姿态1”。

ii. 重命名为“设置孪生体姿态2”。

iii. 将位置手动输入设置为“0.5,0,-0.5”。

f) CTRL+C 复制 “等待1”节点,CTRL+V 即在顺序节点下添加一个新的等待节点“copy_等待1”,并将节点重命名为“等待2”。

g) 通过复制“设置孪生体姿态1”节点的方式添加一个“设置孪生体姿态3”节点,并将位置手动输入设置为“0,0,-0.5”。

h) CTRL+C 复制 “等待1”节点,CTRL+V 即在顺序节点下添加一个新的等待节点“copy_等待1”,并将节点重命名为“等待3”。

i) 点击工具栏中的【保存】按钮 保存行为树。

j) 点击 < 退出行为树编辑器。

k) 保存“移动的小球”模板。点击主页按钮退出模板编辑器。

5. 创建一个场景,在场景中添加一个会移动的小球。

a) 新建一个场景命名为“移动的小球”。

b) 使用“移动的小球”模板创建一个 “移动的小球1”。

c) 将“移动的小球1”添加到场景中。

d) 播放场景,预览小球移动的效果。

响应信号改变方块的颜色

在本例中,我们将使用事件节点监听和响应事件,从而改变方块的颜色属性。

前提

请先按创建全新的模板中的步骤准备好“会变色的方块”模板。

1. 创建一个球体孪生体模板:

a) 点击主页中的【新建模板】,打开模板编辑器。

b) 将工具窗格中的“球体”拖拽到场景区中,并调整其合适位置。

c) 点击工具栏中的保存按钮 ,保存模板名称为“发送信号的小球”。

2. 为“发送信号的小球”模板添加主功能结构:

a) 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构

b) 下拉滚动条找到新添加的结构 “Part_1”,点击“Part_1”,在属性区修改结构名称为“主功能”。

c) 在“主功能”结构下添加 “信号”(Int)属性。

3. 为“发送信号的小球”模板添加发送信号的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“发送信号”。

4. 编辑行为树逻辑:本例中发送三个信号 “100”、“200”和“300”。

a) 双击“发送信号”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点,并使用默认属性。

c) 在顺序节点下添加一个发送事件节点“发送信号100”,设置这个节点的属性如下:

        • 事件标识符
            • 值的来源:手动输入
            • :100

d) 在顺序节点下添加一个等待节点“等待1”,并设置等待时间的手动输入值为“2”。

e) 添加“发送信号200”节点:

i. 复制粘贴“发送信号100”节点,节点将自动添加到顺序节点下方。

ii. 将其重命名为“发送信号200”。

iii. 重新连接顺序节点和“发送信号200”节点。

iv. 修改“发送信号200”节点的事件标识符中的手动输入值为“200”。

f) 添加一个等待节点“等待2”,并设置等待时间的手动输入值为“2”。

g) 添加“发送信号300”节点:

i. 复制粘贴“发送信号100”节点,节点将自动添加到顺序节点下方。

ii. 将其重命名为“发送信号300”。

iii. 重新连接顺序节点和“发送信号300”节点。

iv. 修改“发送信号300”节点的事件标识符中的手动输入值为“300”。

h) 添加一个等待节点“等待3”,并设置等待时间的手动输入值为“2”。

下图为完整的行为树结构:

i) 保存行为树并退出行为树编辑界面。

j) 保存模板并返回主页界面。

5. 为“会变色的方块”模板添加接收信号并变色的行为树。

a) 打开“会变色的方块”模板。

b) 将方块颜色改为白色。

c) 在模板里新建一个“事件响应”行为树。

d) 双击行为树“事件响应”打开行为树编辑界面。

e) 在根节点下添加一个并行节点

f) 在并行节点下添加一个顺序节点“顺序节点1”。

g) 在“顺序节点1”下添加一个接收事件节点“接收信号100”,设置接收事件节点的属性如下:

        • 事件标识符
            • 值的来源:手动输入
            • :100 

h) 在“顺序节点1”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

          • 目标属性
              • 属性的来源:孪生体中的属性
              • 孪生体的来源:自身
              • 选择属性:颜色(选择“会变色的方块”的“颜色”属性)
              • 数值的设置策略:替换原始值
              • 值的来源:手动输入
              • :255,254,145,10 (对应颜色为

i) 在并行节点下添加一个顺序节点“顺序节点2”。

j) 在“顺序节点2”下添加一个接收事件节点“接收信号200”,设置接收事件节点的属性如下:

        • 事件标识符
            • 值的来源:手动输入
            • :200
            • 值的来源:手动输入
            • :200

k) 在“顺序节点2”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

        • 目标属性
            • 属性的来源:孪生体中的属性
            • 孪生体的来源:自身
            • 选择属性:颜色(选择“会变色的方块”的“颜色”属性)
            • 数值的设置策略:替换原始值
          • 值的来源:手动输入
          • :100,100,200,200 (对应颜色为

 l) 在并行节点下添加一个顺序节点“顺序节点3”。

m) 在“顺序节点3”下添加一个接收事件节点“接收信号300”,设置接收事件节点的属性如下:

        • 事件标识符
            • 值的来源:手动输入
            • :300

n) 在“顺序节点3”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

        • 目标属性
            • 属性的来源:孪生体中的属性
            • 孪生体的来源:自身
            • 选择属性:颜色(选择“会变色的方块”的“颜色”属性)
            • 数值的设置策略:替换原始值
          • 值的来源:手动输入
          • :255,100,100,100 (对应颜色为

下图为完整的行为树结构:

o) 点击工具栏中的【保存】按钮 保存行为树。

p) 点击 < 退出行为树编辑器。

q) 保存模板并返回主页界面。

6. 创建一个新场景,命名为“事件响应”

7. 在场景中添加一个能发送事件的球体、两个能接收事件的正方体。

a) 使用“会变色的方块”模板创建两个方块“方块1”、“方块2”。

b) 使用“发送信号的小球”模板创建一个 “发信号的球体1”。

c) 将“方块1”、“方块2”和“发信号的球体1”添加到场景中。

8. 保存场景。

9. 播放场景

追击移动的小球

本示例介绍如何在虚拟场景中创建一个方块孪生体,并通过行为树逻辑,使其自动追击一个移动的小球。

1. 创建一个方块孪生体模板:

a) 点击主页中的【新建模板】,进入模板编辑器。

b) 将工具窗格中的“方块”拖拽到场景区中,并调整其合适位置。

c) 点击工具栏中的保存按钮 ,将模板命名为“追击目标的方块”。

2. 为“追击目标的方块”模板添加驱动小球移动的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“追击目标的方块”。

3. 编辑行为树逻辑

a) 双击“追击目标的方块”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点

c) 在顺序节点下添加一个追踪路径规划节点,并配置如下属性:

          • 将路径保存到目标属性
              • 属性的来源:孪生体中的属性
              • 孪生体的来源:自身
              • 选择属性:当前移动路径(“追击目标的方块”的“当前移动路径”属性)
              • 数值的设置策略:替换原始值
          • 起点
              • 值的来源:手动输入
              • :point0
          • 追踪目标
              • 指定孪生体
                  • 值的来源:孪生体
                  • 孪生体的来源:“场景中的所有孪生体”中的“指定孪生体”
                  • 选择方式:“选择孪生体”
                  • 孪生体为:“1435”(“会移动的小球”示例中“移动的小球1”的ID,可在属性面板中查看该孪生体的ID)

e) 在顺序节点下添加一个沿路径移动孪生体节点,并配置如下属性:

        • 要移动的目标
            • 值的来源:孪生体
            • 孪生体的来源:自身
        • 使用当前路径:开启
        • 移动过程中沿前进方向旋转:开启
        • 进入路径时保持原始旋转角度:开启
        • 转弯的圆角半径:“0”
        • 移动的起点:当前位置
        • 设置速度:开启
            • 匀速变为减速的位置:“0”
            • 目标速度:“10”

f) 点击工具栏中的【保存】按钮 保存行为树。

g) 点击 < 退出行为树编辑器。

h) 保存“追击目标的方块”模板,然后点击主页按钮退出模板编辑器。

4. 创建一个场景:新建一个场景命名为“追击移动小球”。

5. 在场景中添加一个追击目标的方块和一个移动的小球

a) 使用“追击目标的方块”模板创建一个 “追击目标的方块1”,并将其添加到场景中,位置设为“0,0,0”。

b) 将“移动的小球1”添加到场景中,位置设为“0.5,0,-0.5”。

6. 创建四个点位互相连通的路径

a) 隐藏“追击目标的方块1”和“移动的小球1”,以免创建路径时路径点的位置被遮挡导致路径点无法准确放置或无法看清,从而影响路径的创建。

b) 进入路径规划界面,使用构建模式创建以下四个点位,并将它们相互连接起来。这些点位将构成“追击目标的方块1”的移动路径,其中“point0”是其起始点。方块将在这四个路径点构成的路径中计算追击“移动的小球1”的最短路径。

        • point0 (0,0,0)
        • point1 (0.5,0,0)
        • point2 (0.5,0,-0.5)
        • point3 (0,0,-0.5)

c) 切换至选择模式,将连线方向改为双向。

d) 保存路径并退出路径规划界面。

e) 将“追击目标的方块1”和“移动的小球1”切换至显示状态。

7. 保存场景。

8. 播放场景:“追击目标的方块1”会按照最短路径追击“移动的小球1”。

目录