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.mode | string | 设为 "fleet" 启用多机器人协调 |
embodiments.shared_workspace | string | 共享工作区目录路径,存放所有 fleet 状态文件 |
embodiments.instances | array | fleet 中所有机器人实例列表 |
instances[].robot_id | string | 该机器人的唯一标识符(用于状态键命名) |
instances[].driver | string | 驱动名称,对应内置或插件驱动 |
instances[].workspace | string | 每个机器人独立的工作区目录,存放 ACTION.md 和 EMBODIED.md |
启动流程
Fleet 模式需要按特定顺序启动。先初始化共享工作区,再依次启动各 Watchdog,最后启动 Agent。
-
初始化 fleet 工作区
paos onboard --mode fleet创建共享工作区并生成所有必需的状态文件。
-
为每个机器人启动 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 -
启动 Agent
paos agent --mode fleet
--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**: idleAgent 通过读取 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 在每个动作中显式指定 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 |