flowchart TD
A[Adapter.watch 接收任务] --> B[TaskDescriptor 放入队列]
B --> C[Dismantler 线程: decompose 拆解]
C --> D[TaskObject + Subtask DAG 生成]
D --> E[TaskQueue 按优先级入队]
E --> F[Scheduler 线程: 选择最高优任务]
F --> G{任务已冻结?}
G -->|否| H[freeze 冻结 DAG]
G -->|是| I[恢复执行]
H --> I
I --> J[遍历 DAG 入度为 0 节点]
J --> K[按硬件亲和性分发给 Hardware Worker]
K --> L[HardwareActuator 逐步执行动作]
L --> M{子任务完成?}
M -->|是| N[从 DAG 移除节点, 解除依赖]
M -->|否, 被抢占| O[terminate_operation, 回收入队]
N --> P{所有子任务完成?}
P -->|是| Q[end_of_service, 取下一个任务]
P -->|否| J
O --> E
_provider = os.getenv("ADAPTER", "mock").lower()
match _provider:
case "mock": # 命令行模拟模式
case "playground": # Libero 仿真平台模式
case s: raise ConfigurationException(...)
Embodied System Impl 技术设计文档
目录
1. 需求分析
1.1 赛题背景解读
赛题二”面向人机物融合的多级融合调度”核心挑战在于:在人机物三元融合的泛在计算场景中,操作系统需要支持跨设备、跨层级的任务协同处理,但现有调度框架存在以下痛点:
1.2 本系统定位
本系统定位于赛题参考案例 1(具身智能 VLA 任务调度)与案例 2(机器人多任务规划)的综合实现,构建一套面向具身智能场景的、支持优先级抢占的轻量化任务调度框架。系统以 VLA(Vision-Language-Action)任务调度为核心场景,支持:
1.3 功能需求映射
TaskReceiver.decompose()接口由模型驱动,支持 VLA 任务动态拆解1.4 核心洞察:具身智能操作系统与现代操作系统的同构性
在设计与实现本系统的过程中,我们发现:具身智能操作系统在多个关键维度上与现代操作系统呈现出结构性的同构关系。这一洞察并非表面的类比,而是深入到资源抽象、并发模型、异步事件处理等操作系统核心机制的层面。下表系统性地总结了这一同构关系:
threading.Event) + 抢占检查点响应异步任务(紧急任务插入、环境异常)event_task_preempt信号,判断是否触发抢占上述同构关系的发现,为本系统的架构设计提供了根本性的理论支撑:我们并非从零构建一套全新的调度范式,而是将现代操作系统经过数十年验证的核心设计原则(进程模型、多级调度、中断驱动),适配到具身智能这一新兴计算场景中。 具体而言:
进程管理 → 任务管理:
TaskObject对应进程,维护独立的优先级、DAG 状态和硬件占用表。与传统 OS 不同的是,具身任务的上下文切换不仅涉及数字状态(DAG 节点完成情况),还涉及物理状态(副作用的产生与消解、机械臂的复位路径),这是本系统引入 Side Effect 等机制的根本原因。线程并行 → 子任务并行:
SubtaskObject对应线程,多个子任务通过 DAG 描述依赖关系后,在满足拓扑约束的前提下可在多个硬件上并行执行;Scheduler._invoke_task()的每轮调度遍历入度为 0 的节点集合并分发给空闲硬件,本质上相当于多核调度器中就绪队列到可用核心的映射。中断机制 → 抢占调度:现代 OS 通过中断向量表注册,在中断返回时检查
need_resched标志;本系统通过threading.Event发出抢占信号,在每个动作间隙(VLA 场景下的最小安全抢占粒度)检查三个抢占条件(优先级、副作用、中断级别),条件满足时执行任务切换——切换过程由 System Interface 的转移行为接管,确保从当前任务的物理状态安全过渡到新任务的初始状态。这一同构视角意味着:现代操作系统领域积累的大量理论成果(调度算法、同步机制、死锁预防、优先级反转处理等)均可在具身智能场景下获得新的应用空间,为本系统的后续演进提供了丰富的理论资源。
2. 总体设计思路
2.1 架构分层
系统严格分为三层:
src/runtime/src/tasks/src/runtime/adapter/2.2 核心调度流程
flowchart TD A[Adapter.watch 接收任务] --> B[TaskDescriptor 放入队列] B --> C[Dismantler 线程: decompose 拆解] C --> D[TaskObject + Subtask DAG 生成] D --> E[TaskQueue 按优先级入队] E --> F[Scheduler 线程: 选择最高优任务] F --> G{任务已冻结?} G -->|否| H[freeze 冻结 DAG] G -->|是| I[恢复执行] H --> I I --> J[遍历 DAG 入度为 0 节点] J --> K[按硬件亲和性分发给 Hardware Worker] K --> L[HardwareActuator 逐步执行动作] L --> M{子任务完成?} M -->|是| N[从 DAG 移除节点, 解除依赖] M -->|否, 被抢占| O[terminate_operation, 回收入队] N --> P{所有子任务完成?} P -->|是| Q[end_of_service, 取下一个任务] P -->|否| J O --> E2.3 抢占机制设计
抢占检查在每个动作(Action)之间进行——这是 VLA 场景下最细粒度的抢占点。抢占触发条件为三个条件的逻辑与:
max_priority > in_service_task.priority)is_side_effect_free())is_interrupt_level_preemptable())当三个条件同时满足时,系统通过
threading.Event发出抢占信号,Scheduler 终止当前所有子任务,将任务标记为 preempted,然后开始执行高优先级任务。被抢占的任务在下一次调度时从 DAG 中恢复执行。3. 核心模块划分
3.1 模块总览
3.2 模块详细说明
3.2.1 SystemRuntime(
runtime/runtime.py)系统主控制器,负责:
HardwareProbe.probe()获取硬件资源清单TaskQueue与抢占事件EventQueue[TaskDescriptor]中取任务描述符,调用模型拆解为TaskObjectTaskQueue中选择最高优先级任务,按 DAG 拓扑序分发子任务HardwareActuator的动作序列TaskReceiver.watch()接收外部任务3.2.2 Scheduler(
runtime/scheduler.py)调度器实现两阶段调度:
3.2.3 TaskQueue(
tasks/task_queue.py)多优先级任务队列的核心设计:
MAX_PRIORITY(8)个 FIFO 列表,索引为priority - 1max_priority动态追踪当前非空最高优先级preemption_check()在每次事件触发时评估抢占条件in_service_task追踪当前正在执行的任务,用于抢占比较3.2.4 DAG 依赖管理(
libs/dag_node.py)基于
networkx.DiGraph实现:DagNode[T]:泛型 DAG 节点,携带 owner 引用DagManager[T]:封装 DiGraph,提供create_node、add_dependency、shallow_copy_graph等方法dag.in_degree获取每个节点的入度,入度为 0 的节点为可调度节点remove_node,解除后继节点的依赖3.2.5 中断级别(
parts/intr_level.py)四级中断级别,定义了抢占的偏序关系:
判断方法
can_preempt(other)从被抢占方视角判定是否允许other级别抢占自身。3.2.6 副作用机制(
parts/side_effect.py)某些操作的完成会触发副作用(如”拾起物体”后物体处于被持有状态),必须由后续操作消解(如”放入容器”后物体被释放)。设计如下:
SideEffect.register(desc)同时创建 Spawn 和 Eliminate 两个配对副作用实例irq编号side_effects: set[int]追踪当前激活的副作用3.2.7 适配器接口(
runtime/adapter_interface.py)定义三个抽象适配器:
4. 关键技术选型
4.1 并发模型设计
系统采用 “Async Main + Thread Pool” 混合并发模型:
线程同步机制:
threading.Lockthreading.Eventqueue.Queuequeue.Queue(per Hardware)4.2 适配器模式
通过环境变量
ADAPTER在运行时选择适配器实现(runtime/adapter/__init__.py):新增适配器仅需:
src/runtime/adapter/<name>/HardwareProbe、TaskReceiver、HardwareActuator三个类__init__.py的 match 分支中注册5. 接口设计
5.1 内部接口
5.1.1 适配器接口(Adapter Interface)
详见 3.2.7 适配器接口。三个核心接口的职责边界清晰:
5.1.2 任务生命周期接口
5.1.3 子任务模板接口
5.1.4 动词模板接口
5.2 外部接口
5.2.1 Playground 适配器通信协议
与 SwitchableLiberoPlayground 通过三条 WebSocket 连接通信:
通信协议(msgpack 编码):
5.3 环境变量配置接口
ADAPTERmockPLAYGROUND_REMOTE_HOST0.0.0.0PLAYGROUND_REMOTE_PORT__TASKS8686PLAYGROUND_REMOTE_PORT__SIMULATION8687PLAYGROUND_REMOTE_PORT__MODEL86886. 异常处理方案
6.1 异常体系
6.2 异常处理策略
ConfigurationExceptionConfigurationExceptionParameterMissingExceptionControlInconherentControlInconherentControlInconherentConnectionClosedConnectionRefusedError_wait_for_server),每 5 秒重连RuntimeError6.3 容错与恢复机制
process_dag状态和processes字典,恢复执行时从剩余 DAG 节点继续7. 兼容性说明
7.1 运行环境
match语句、StrEnum等特性7.2 依赖兼容性
7.3 适配器兼容性
8. 部署与运行
8.1 快速开始
8.2 项目结构
9. 性能指标与测试方案
9.1 测试方案
单元测试
TaskQueueDagManagerSideEffectInterruptLevelVerbTemplate集成测试
性能基准测试
time.monotonic()在关键路径打点10. 未来扩展方向
10.1 已规划的改进
EmergencyStop任务类型10.2 中长期扩展
11. 任务切换算法有效性验证
本节基于 LIBERO 目标基准测试(8 项标准任务,见下表),重点验证系统层任务切换算法的有效性——即在运行时动态切换任务时,由系统接管切换点的状态管理与转移行为,而非依赖 VLA 模型自身处理任务边界。
11.1 测试任务集
测试覆盖 LIBERO Goal 基准中的 8 项标准操作任务,任务指令均为自然语言形式:
11.2 对比方案说明
测试中的方案命名约定如下:
其中 EK 即本系统。在上述方案中,任务的执行仍由 VLA 模型后端完成,但任务切换本身由系统层接管:系统通过 Preemptive Scheduler 检测切换时机,调用 System Interface 执行转移行为,再从受控状态分派新任务。
11.3 实验一:多步链式执行中的切换稳定性
本实验评估系统切换算法在长任务链中的表现。将多个任务串联为链式序列(如 T1 → T7 → T5 → T8),系统在每步间执行转移行为后再进入下一任务。成功率为所有步骤均成功的比例(30 次重复实验)。
分析:随着任务链增长,切换算法的转移行为对成功率的影响愈发显著。BC 学习的转移姿态在三步链上跌落至 20%,说明仅靠学习的中性姿态不足以在多次任务边界累积后保持稳定。RBR 将三步链提升至 93.33%、四步链保持在 90.00%,验证了系统控制的确定性转移规则对切换稳定性的贡献。第二条链(T4→T2→T6→T7→T8)暴露了转移运动的物理稳定性问题:RBR 仅 26.67%,加入奇异位形规避后提升至 76.67%,印证了在 System Interface 层面隔离转移行为的必要性。
11.4 实验二:运行时动态切换的有效性
本实验评估系统切换算法在不同切换时机下的表现。实验在 T1 执行过程中的三个时机点(Early / Middle / Late,分别对应执行进度的约 20%、50%、80%)触发向 T5 或 T7 的动态切换,比较原始 VLA(无系统支持)与系统介导切换的差异。
分析:在无系统层切换支持时,原始 VLA 模型在动态切换场景下表现极不稳定。T1→T5 的切换中,OpenVLA 和 π0.5 几乎完全失败(最高仅 10.00%);而系统介导的切换将成功率提升至 30.00%(Early)、72.41%(Middle)、80.00%(Late),且越晚切换(越接近任务自然完成边界)成功率越高。T1→T7 的切换中,系统支持使 π0.5 从最高 60.00% 提升至 96.67%–100.00%。这验证了任务切换算法的核心价值:成功的动态切换不仅需要选择正确的下一个任务,更需要管理何时以及以何种状态离开当前执行——这正是 Preemptive Scheduler 与 Task State Controller 的设计目标。
11.5 小结
上述实验从两个维度验证了本系统任务切换算法的有效性:
这些结果直接支撑了系统架构中 Preemptive Scheduler、System Interface 转移行为等核心模块的设计合理性。