API 使用 / Fleet 模式

Fleet 模式 多机器人

运行多个异构机器人,共享状态并协调任务执行。

Fleet 拓扑结构

Fleet 模式引入一个共享工作区供 Agent 操作,同时为每个 Watchdog 分配独立的机器人工作区。Critic 针对目标机器人的 EMBODIED.md 校验每个动作。

flowchart TB
    subgraph Shared["共享工作区"]
        ENV["ENVIRONMENT.md"]
        ROBOTS["ROBOTS.md"]
        LESSONS["LESSONS.md"]
        TASK["TASK.md"]
        ORCH["ORCHESTRATOR.md"]
    end
    subgraph Robot1["机器人 A 工作区"]
        ACT1["ACTION.md"]
        EMB1["EMBODIED.md"]
    end
    subgraph Robot2["机器人 B 工作区"]
        ACT2["ACTION.md"]
        EMB2["EMBODIED.md"]
    end
    subgraph Robot3["机器人 C 工作区"]
        ACT3["ACTION.md"]
        EMB3["EMBODIED.md"]
    end
    Shared --> Robot1
    Shared --> Robot2
    Shared --> Robot3

Agent 读写共享工作区;每个 Watchdog 监控各自的机器人工作区;Critic 在动作写入 ACTION.md 之前,对照目标机器人的 EMBODIED.md 进行校验。

配置方式

config.json 中,将 embodiments.mode 设为 "fleet",并为每台机器人实例指定驱动和工作区路径。

{ "embodiments": { "mode": "fleet", "shared_workspace": "~/.PhyAgentOS/fleet/shared", "instances": [ { "robot_id": "go2_edu_001", "driver": "go2_edu", "workspace": "~/.PhyAgentOS/fleet/robot_go2" }, { "robot_id": "franka_001", "driver": "franka", "workspace": "~/.PhyAgentOS/fleet/robot_franka" } ] } }
字段类型说明
embodiments.modestring设为 "fleet" 启用多机器人协调
embodiments.shared_workspacestring共享工作区目录路径,存放所有 fleet 状态文件
embodiments.instancesarrayfleet 中所有机器人实例列表
instances[].robot_idstring该机器人的唯一标识符(用于状态键命名)
instances[].driverstring驱动名称,对应内置或插件驱动
instances[].workspacestring每个机器人独立的工作区目录,存放 ACTION.md 和 EMBODIED.md

启动流程

Fleet 模式需要按特定顺序启动。先初始化共享工作区,再依次启动各 Watchdog,最后启动 Agent。

  1. 初始化 fleet 工作区
    paos onboard --mode fleet

    创建共享工作区并生成所有必需的状态文件。

  2. 为每个机器人启动 Watchdog(不同终端或后台进程)
    # 终端 1 — Go2 四足 python hal/hal_watchdog.py --driver go2_edu --workspace ~/.PhyAgentOS/fleet/robot_go2 # 终端 2 — Franka 机械臂 python hal/hal_watchdog.py --driver franka --workspace ~/.PhyAgentOS/fleet/robot_franka
  3. 启动 Agent
    paos agent --mode fleet
端口冲突:每个 Watchdog 使用不同的工作区,因此状态文件不会冲突。如果在同一台机器上运行多个 Watchdog,请确保各驱动的网络端口(如有)不重复。使用 --driver-config 按实例覆盖默认端口。

ROBOTS.md 自动生成

ROBOTS.md 由每个 Watchdog 在启动时自动生成。它汇总了每台机器人的身份、驱动、能力和连接状态。

# ROBOTS.md(共享工作区自动生成) ## go2_edu_001 - **driver**: go2_edu - **type**: quadruped - **capability**: target_navigation, obstacle_avoidance - **connection_state**: connected - **nav_state**: idle ## franka_001 - **driver**: franka - **type**: arm - **capability**: pick_up, place, move_to - **connection_state**: connected - **nav_state**: idle

Agent 通过读取 ROBOTS.md 了解当前可用的机器人、各自的能力以及连接状态。当机器人断开连接时,对应 Watchdog 会将其 connection_state 更新为 disconnected

任务协调

TASK.md 承载当前任务。Agent 将高层目标分解为子任务并分配给特定机器人,ORCHESTRATOR.md 追踪执行进度。

TASK.md

# 任务:从桌面取苹果放入篮子 ## 子任务 1. [go2_edu_001] 导航至桌面 2. [go2_edu_001] 调整至桌面附近位置 3. [franka_001] 从桌面抓取苹果 4. [franka_001] 移动至篮子位置 5. [franka_001] 将苹果放入篮子

ORCHESTRATOR.md

# 协调器状态 **进度**: 3/5 **活跃设备**: go2_edu_001, franka_001 ## 决策日志 - 步骤 1: go2_edu_001 → 已完成 - 步骤 2: go2_edu_001 → 已完成 - 步骤 3: franka_001 → 执行中 - 步骤 4: 待执行 - 步骤 5: 待执行

Agent 读取 ORCHESTRATOR.md 决定下一步动作。如果子任务失败,Agent 参考 LESSONS.md 重新规划并重新分配或重试。

共享 ENVIRONMENT.md

多个 Watchdog 通过 robots.<robot_id> 键名空间写入同一个 ENVIRONMENT.md。每台机器人拥有独立的小节,Agent 看到的是整个 fleet 的统一视图。

# ENVIRONMENT.md(共享工作区) ## robots ### go2_edu_001 - connection_state: connected - robot_pose: {x: 1.2, y: 3.4, theta: 0.78} - nav_state: moving ### franka_001 - connection_state: connected - robot_pose: {x: 0.0, y: 0.0, theta: 0.0} - nav_state: idle - gripper_state: open ## scene - objects_detected: [apple, table, basket] - last_updated: 2026-05-21T10:30:00Z

每个 Watchdog 仅写入自己的 robots.<robot_id> 小节。scene 部分由共享 Watchdog(通常是第一个启动的 Watchdog 或专用感知实例)负责写入。

Critic 逐机器人校验

Critic 仅对照目标机器人的 EMBODIED.md 校验每个动作,而非对照所有机器人。这避免了某台机器人的能力限制被错误应用于另一台机器人。

Agent 选择目标机器人 EmbodiedActionTool 加载目标 EMBODIED.md Critic 校验动作范围 写入 ACTION.md 至目标机器人工作区

Agent 在每个动作中显式指定 robot_id。EmbodiedActionTool 仅读取该机器人工作区中的 EMBODIED.md。如果动作超出该机器人的能力限制(关节范围、工作空间边界、负载),Critic 将其标记为 rejected 并在 LESSONS.md 中记录原因。

关键不变性:针对 franka_001 的动作绝不会参照 go2_edu_001 的约束进行校验。每台机器人只接受其自身所需的校验。

调试方式

Fleet 调试的核心是验证正确的动作是否落入了正确的机器人工作区,以及共享状态是否一致。

症状检查项命令
机器人不响应动作 ACTION.md 是否在正确的工作区? cat ~/.PhyAgentOS/fleet/robot_go2/ACTION.md
Agent 看不到某台机器人 ROBOTS.md 中是否列出了该机器人? cat ~/.PhyAgentOS/fleet/shared/ROBOTS.md
所有动作被拒绝 查看 LESSONS.md 中的拒绝原因 cat ~/.PhyAgentOS/fleet/shared/LESSONS.md
机器人间状态不一致 对比 ENVIRONMENT.md 各部分 cat ~/.PhyAgentOS/fleet/shared/ENVIRONMENT.md
Watchdog 不消费动作 传入的 workspace 路径是否正确? 检查 Watchdog 终端输出中的 --workspace
调试期间,将每个 Watchdog 放在独立的可见终端中运行。同时观察所有终端可以快速发现哪台机器人卡住了,并将其与共享状态文件关联分析。