Cap-Skill-Action 系统#
技能系统是UAPI的行为建模核心,通过标准化的技能规范和类型安全的绑定机制,为具身应用提供了丰富的行为能力。该系统将复杂的行为抽象为可复用的技能组件,支持组合式的能力构建。
设计原理#
- 能力与技能分层
系统将具身应用的行为能力分为两个层次:
能力(Capability) - 原子级的基础操作,如获取位置、移动、拍照等。能力通常对应硬件接口或底层服务,是不可再分解的最小行为单元。
技能(Skill) - 由多个能力组合而成的复合行为,如导航到目标、检测物体等。技能封装了业务逻辑,可以调用其他技能和能力。
- 声明式规范定义
所有技能都通过声明式规范进行定义,包含描述、类型、输入输出规格和依赖关系。这种方式确保了技能接口的一致性和可验证性。
- 类型安全保障
系统实现了完整的类型检查机制,支持复杂类型的验证和自动转换,包括基础类型、复合类型、数据类和枚举等。
技能规范系统#
EOS_SKILL_SPECS#
关于技能规范的更多信息,请参见 Capability/Skill 调用规范表 章节。
技能规范是一个全局字典,定义了所有标准技能的接口规格:
EOS_SKILL_SPECS = {
"cap_space_getpos": {
"description": "Get the position of the entity",
"type": EOS_SkillType.CAPABILITY,
"input": None,
"output": {"x": float, "y": float, "z": float},
},
"skl_detect_objs": {
"description": "Detect objects in the current view",
"type": EOS_SkillType.SKILL,
"input": {"camera_name": str},
"output": Dict[str, Tuple[float, float, float]],
"dependencies": ["cap_camera_dep_rgb", "cap_camera_info"],
}
}
- 规范字段说明
description- 技能的功能描述type- 技能类型(CAPABILITY 或 SKILL)input- 输入参数规格,支持None、字典或列表(多选类型)output- 输出结果规格dependencies- 依赖的其他技能列表(仅技能类型需要)
类型系统#
- 基础类型支持
系统支持Python的所有基础类型,包括int、float、str、bool等,并提供自动类型转换功能。
- 复合类型处理
支持复杂的数据结构:
字典类型 - 定义结构化数据的字段和类型
列表类型 - 支持同质元素的集合
元组类型 - 支持异构元素的有序组合
数据类 - 支持用户定义的数据结构
枚举类型 - 支持有限选项的类型安全
- 多选类型机制
通过列表定义多种可接受的输入格式:
"input": [
None, # 无参数调用
{"timeout_sec": float} # 带超时参数调用
]
技能绑定机制#
- 绑定验证流程
实体绑定技能时经过严格的验证:
检查技能是否在标准规范中定义
验证绑定函数的存在性和可调用性
将技能添加到实体的技能列表中
建立技能名称到函数的映射关系
- 动态调用包装
通过
__getattr__方法实现动态调用:
def __getattr__(self, name):
if name in self.skill_bindings:
def wrapper(**kwargs):
# 参数验证
self._check_skill_args(name, kwargs)
# 函数调用
result = self.skill_bindings[name](**kwargs)
# 结果验证
self._check_skill_returns(name, result)
return result
return wrapper
- 自实体注入机制
对于需要访问实体上下文的技能,系统支持自动注入
self_entity参数,使技能函数能够访问调用实体的状态和其他技能。
使用示例#
以下展示了技能系统的典型使用方式:
from uapi.graph.entity import create_controllable_entity
# 创建实体
robot = create_controllable_entity("robot")
# 定义技能实现
def get_position():
# 实际的位置获取逻辑
return {"x": 1.0, "y": 2.0, "z": 0.0}
def move_to_position(x, y, z):
# 实际的移动逻辑
print(f"Moving to ({x}, {y}, {z})")
return {"success": True}
# 绑定技能
robot.bind_skill("cap_space_getpos", get_position)
robot.bind_skill("cap_space_move", move_to_position)
# 使用技能
current_pos = robot.cap_space_getpos()
print(f"Current position: {current_pos}")
result = robot.cap_space_move(x=5.0, y=3.0, z=0.0)
print(f"Move result: {result}")