Virtual Entity Graph(VEG)虚拟实体图#
虚拟实体图(VEG)系统是UAPI的核心建模组件,通过层次化的实体结构来表示具身应用的认知世界。该系统提供了完整的实体生命周期管理、关系建模和技能绑定机制。
- 层次化建模
实体图采用树状层次结构组织世界中的所有对象。根节点通常是一个房间(Room)实体,代表整个环境空间,其他实体作为子节点按照空间或逻辑关系进行组织。这种设计直观地反映了现实世界的组织结构。
- 实体类型系统
系统定义了多种实体类型以适应不同的建模需求:
GENERIC- 通用实体,适用于一般对象CONTROLLABLE- 可控实体,通常代表机器人或可操作设备COMPUTING- 计算实体,代表具有计算能力的组件SYSTEM- 系统实体,代表系统级组件HUMAN- 人类实体,代表人类参与者ROOM- 房间实体,代表空间容器
- 关系建模机制
实体间通过关系类型进行连接,目前主要支持父子关系(
PARENT_OF/CHILD_OF),未来可扩展支持更多关系类型如邻接关系、包含关系等。
核心组件#
Entity#
Entity类是实体图的基础构建块,每个实体包含以下核心属性:
- 基础属性
entity_id- 唯一标识符,使用UUID生成entity_type- 实体类型,决定实体的基本行为特征entity_name- 实体名称,用于路径寻址和用户识别metadata- 元数据,存储描述信息和标签
- 关系管理
每个实体维护一个关系字典,记录与其他实体的连接关系。关系是双向的,添加子实体时会自动建立相互的父子关系。
- 技能绑定
实体通过
skills列表和skill_bindings字典管理绑定的技能。技能绑定时会进行规范验证,确保技能的正确性。
EntityPath#
实体图提供了基于路径的寻址机制,类似文件系统的路径结构:
# 路径示例
root = create_root_room() # 路径: /
robot = create_controllable_entity("robot") # 路径: /robot
camera = create_controllable_entity("camera") # 路径: /robot/camera
root.add_child(robot)
robot.add_child(camera)
路径寻址支持相对路径和绝对路径查找,通过 get_entity_by_path() 方法可以快速定位任意实体。
Skill Binding 机制#
- 绑定验证
实体绑定技能时,系统会根据技能规范进行严格的验证:
检查技能是否在标准规范中定义
验证绑定函数的签名是否符合要求
确保依赖的其他技能已正确绑定
- 动态调用
通过Python的
__getattr__方法,实体支持动态技能调用。当访问实体的技能属性时,系统会自动创建调用包装器,处理参数验证、类型转换和结果检查。- 参数类型处理
系统支持复杂的参数类型验证和自动转换:
基础类型(int, float, str, bool)的自动转换
复合类型(dict, list, tuple)的递归验证
数据类和枚举类型的严格检查
多选类型的灵活匹配
Entity Factory Functions#
为了简化实体创建过程,系统提供了一系列工厂函数:
# 创建不同类型的实体
generic_entity = create_generic_entity("object1")
controllable_entity = create_controllable_entity("robot1")
computing_entity = create_computing_entity("computer1")
human_entity = create_human_entity("user1")
room_entity = create_room_entity("living_room", room_type="residential")
root_room = create_root_room()
这些工厂函数自动处理ID生成、类型设置等细节,让用户专注于业务逻辑的实现。
Example#
以下是一个典型的实体图构建示例:
from uapi.graph.entity import create_root_room, create_controllable_entity
# 创建根房间
root_room = create_root_room()
# 创建机器人实体
robot = create_controllable_entity("robot")
root_room.add_child(robot)
# 创建相机实体
camera = create_controllable_entity("camera")
robot.add_child(camera)
# 绑定技能(Skill Binding)
def get_pose_impl():
return {"x": 0.0, "y": 0.0, "z": 0.0}
robot.bind_skill("cap_space_getpos", get_pose_impl)
# 使用技能(Skill Usage)
position = robot.cap_space_getpos()
print(f"Robot position: {position}")