23 — Robot Foundation Models 总览¶
如何把 VLA、World Model、RL 和底层控制统一在一个上层模块下,而不是让"机器人大模型"成为孤立的第五方向。
| 标签 | 内容 |
|---|---|
| Tag | Concept · Architecture · Tutorial |
| Related | 13-vla-zero-to-one · 15-world-model-zero-to-one · 21-vla-dataset-organization · 22-act-vs-diffusion-policy |
| Code | examples/robot_foundation_models/ |
| Next | 24-action-representation-and-tokenization |
目录¶
1. 为什么需要 Robot Foundation Models¶
本仓库已经有 VLA、World Model、RL 三个方向。如果再把"机器人大模型"作为孤立的第五方向硬塞进来,会出现两个问题:
- 重复:VLA 本身就是一种机器人基础模型的动作生成层。
- 割裂:大模型与底层控制脱节,无法形成闭环。
正确的做法是新增上层模块 Robot Foundation Models (RFM),把现有 VLA 作为动作生成层,再连接 World Model、RL 和底层控制。
这也符合当前机器人基础模型的发展方式:高层具身推理和低层 VLA 动作模型通常分开设计,而不是让普通 LLM 直接输出电机指令。Gemini Robotics 目前就采用 VLA 与 Embodied Reasoning 双模型结构。
2. 整体架构¶
flowchart TD
A["用户自然语言指令"] --> B["Embodied Reasoner<br/>任务理解 / 目标分解 / 空间推理"]
B --> C["Robot Foundation Model / VLA<br/>图像 + 语言 + 状态 → Action Chunk"]
C --> D["Robot Adapter<br/>通用动作 → 特定机器人动作空间"]
D --> E["Low-level Controller<br/>PID / 阻抗控制 / 关节伺服"]
E --> F["Safety Filter<br/>关节限制 / 碰撞 / 速度限制 / 急停"]
F --> G["MuJoCo 或真实机器人"]
H["World Model<br/>预测结果"] --> B
I["RL Post-training<br/>策略优化"] --> C
G --> H
| 层 | 职责 | 仓库对应 |
|---|---|---|
| Embodied Reasoner | 任务分解、物体识别、空间推理 | planners/ |
| Foundation Model | 图像+语言+状态 → 动作块 | smolvla/, openvla/ |
| Embodiment Adapter | 通用动作 → 机器人特定命令 | common/embodiment_adapter.py |
| Safety Filter | 最后一道安全防线 | common/safety_filter.py |
| Simulation | 执行动作并返回观测 | unified_pushcube_env.py, MuJoCo |
3. 统一接口设计¶
核心原则¶
所有模型必须使用同一套内部接口,而不是每个模型写一套无法复用的代码。
以后无论接 SmolVLA、OpenVLA、π0、GR00T,外层控制代码都不用改,只替换 Adapter。
三个核心数据结构¶
RobotObservation — 统一观测格式¶
@dataclass
class RobotObservation:
images: dict[str, np.ndarray] # 相机名 → RGB 图像
state: np.ndarray | None # 机器人本体状态
language_instruction: str # 语言指令
timestamp: float # 时间戳(用于多相机同步)
extras: dict # 模型特定元数据
设计要点:
- Camera-agnostic:images 是 dict,按相机名索引。单相机模型只读 images["front"]。
- State 可选:某些模型(如纯视觉 Diffusion Policy)不用 state,设为 None。
- Language 必须存在:即使模型不用语言,指令也随观测传递,用于日志和消融实验。
ActionChunk — 统一动作格式¶
@dataclass
class ActionChunk:
actions: np.ndarray # (horizon, action_dim)
action_type: str # "joint_position" | "ee_delta" | ...
control_frequency: float # Hz
confidence: float | None # 模型置信度(用于安全门控)
action_type 支持五种类型:
| 类型 | 含义 | 典型模型 |
|---|---|---|
joint_position |
绝对关节角 (rad) | OpenVLA |
joint_velocity |
关节速度 (rad/s) | 部分RL策略 |
ee_pose |
末端位姿 [x,y,z,qx,qy,qz,qw] | 高层规划器 |
ee_delta |
末端增量 [dx,dy,dz,droll,dpitch,dyaw] | SmolVLA |
joint_delta |
关节角增量 (rad) | Diffusion Policy |
RobotFoundationModel — 统一模型协议¶
@runtime_checkable
class RobotFoundationModel(Protocol):
def reset(self) -> None: ...
def predict_action(self, observation: RobotObservation) -> ActionChunk: ...
使用 typing.Protocol 实现结构化子类型——任何有 reset() 和 predict_action() 的类自动满足协议,不需要继承。
控制循环示例¶
def run_episode(model: RobotFoundationModel, env):
model.reset()
obs = env.reset()
while not done:
# 1. 构建标准观测
robot_obs = RobotObservation(
images={"front": obs["image"]},
state=obs["state"],
language_instruction=obs["language"],
timestamp=time.time(),
)
# 2. 模型预测动作块
chunk = model.predict_action(robot_obs)
# 3. 安全过滤
safe_chunk, statuses = safety_filter.check_chunk(chunk, current_state)
# 4. 执行第一个动作(receding horizon)
action = safe_chunk.first_action()
obs, reward, done, info = env.step(action)
这段控制循环代码不需要随模型变化而修改——换模型只换 Adapter。
4. 模型清单与优先级¶
| 模型 | 类型 | 规模 | 开放性 | 仓库状态 | 推荐用途 |
|---|---|---|---|---|---|
| SmolVLA | 轻量 VLA | 450M | Open | ✅ Runnable | 入门、微调、消费级硬件 |
| OpenVLA/OFT | 通用 VLA | 7B | Open | 🟡 Adapter | LIBERO、LoRA、标准 Benchmark |
| Octo | 通用 Diffusion Policy | 27M/93M | Open | 🟡 Tutorial | Cross-embodiment |
| GR00T N1.6 | 人形基础模型 | Large | Open-weight | ⏳ Planned | 人形、双臂操作 |
| Gemini Robotics 1.5 | VLA | Undisclosed | Private preview | 🔒 Research Only | 具身推理案例 |
| π 系列 | 通用策略 | Large | Varies | 🔒/🟡 Research | 长时序与开放世界 |
第一优先级:SmolVLA¶
SmolVLA 是 450M 参数的轻量机器人基础模型,输入可以包含多相机图像、机器人状态和语言指令,输出连续动作块。官方围绕 LeRobot 数据集和下游微调设计。
仓库中已实现 SmolVLAAdapter:
- 将 RobotObservation 转换为 LeRobot 输入格式
- 调用 SmolVLAPolicy.select_action
- 输出转换为 ActionChunk
- 支持 mock 模式(无需 GPU 即可测试接口)
第二优先级:OpenVLA / OpenVLA-OFT¶
OpenVLA-7B 适合作为"较大规模 VLA"的对照模型: - 支持 LoRA 微调(r=32, ~50M 可训练参数) - 支持 RLDS 数据格式 - 有 LIBERO 等标准评测 - OFT 提供更高频的连续动作输出和多图像输入
仓库中提供 OpenVLAAdapter(接口定义 + mock 模式)和 lora_config.yaml。
第三优先级:Octo¶
Octo 适合用来讲解: - 多机器人预训练(800k episodes) - Cross-embodiment 泛化 - 语言与目标图像条件 - Diffusion action decoding - 不同摄像头与动作空间适配
第四优先级:GR00T N1.6¶
GR00T 更适合人形机器人、双臂和灵巧操作方向。NVIDIA 将其定位为面向通用人形机器人的开放基础模型。
5. 数据层统一¶
机器人大模型最难的通常不是模型,而是:
| 维度 | 问题 |
|---|---|
| 相机名称 | front / wrist_left / wrist_right 命名不统一 |
| 图像尺寸 | 128×128 vs 224×224 vs 480×640 |
| state 维度 | 7-DOF vs 14-DOF vs 21-DOF |
| action 含义 | 关节角 vs 末端位姿 vs 增量 |
| 坐标系 | 基座坐标系 vs 世界坐标系 |
| 控制频率 | 5 Hz vs 20 Hz vs 500 Hz |
| episode 划分 | 任务边界、成功/失败定义 |
| action normalization | Z-score vs Min-Max vs 无归一化 |
Canonical Dataset 标准¶
episode = {
"task": "Push the red cube to the target",
"timestamps": ...,
"observation.images.front": ..., # (H, W, 3) uint8
"observation.images.wrist_left": ..., # optional
"observation.images.wrist_right": ..., # optional
"observation.state": ..., # (state_dim,) float32
"action": ..., # (action_dim,) float32
"action_type": "joint_position",
"robot_type": "franka_panda",
"control_frequency": 20,
}
转换器(规划中)¶
Canonical Dataset
├── to_lerobot.py → SmolVLA / π0
└── to_rlds.py → OpenVLA / Octo
不要让每个模型直接读取自己独有的数据格式,否则仓库会迅速失控。
6. 评测协议¶
机器人基础模型至少要有四组评测。
6.1 Offline Action Evaluation¶
| 指标 | 说明 |
|---|---|
| Action MAE | 预测动作与专家动作的平均绝对误差 |
| Action L2 | L2 距离 |
| 方向一致率 | 预测方向与专家方向夹角 < 90° 的比例 |
| 动作平滑度 | 相邻动作差的范数 |
| 推理延迟 | 单次前向传播耗时 |
6.2 Closed-loop Evaluation¶
| 指标 | 说明 |
|---|---|
| 任务成功率 | 正确方块到达目标的比例 |
| 错误物体操作率 | 错误方块到达目标的比例 |
| 选择准确率 | 正确方块离目标更近的比例 |
| 碰撞率 | 非目标方块被推动的比例 |
| 超时率 | 达到最大步数的比例 |
| 平均完成步数 | 成功 episode 的平均步数 |
6.3 Generalization¶
| 维度 | 测试方法 |
|---|---|
| 新位置 | 方块位置从训练分布外采样 |
| 新颜色 | 使用训练中未出现的颜色组合 |
| 新背景 | 改变桌面纹理/颜色 |
| 新语言表达 | "push the crimson cube" 代替 "push the red cube" |
| 遮挡和干扰 | 增加无关物体到场景中 |
6.4 Language Ablation¶
必须使用同一个模型、同一个场景:
| 条件 | 输入语言 | 预期结果 |
|---|---|---|
| Correct | 正确指令 | 高成功率 |
| Swapped | 交换颜色词 | 低成功率,高错误方块率 |
| None | 零化语言 token | 50% 选择准确率(随机) |
| Paraphrased | 同义词替换 | 接近正确成功率 |
| Contradictory | 方向词反转 | 低成功率 |
⚠️ 不要通过重新训练不同模型来替代严格消融。详见 26-rfm-finetuning-and-evaluation。
仓库中的 benchmarks/robot_foundation_models/language_ablation.py 实现了完整的 5 条件消融。
7. 与现有模块的连接¶
RFM 不是孤立模块,它将现有三条路线连接成一个闭环:
flowchart LR
RFM["Robot Foundation Model"] -->|"Action Chunk"| ADP["Robot Adapter"]
ADP -->|"Robot Command"| SIM["PushCube / MuJoCo"]
SIM -->|"Observation"| RFM
SIM -->|"Transition"| WM["World Model"]
WM -->|"Predicted Outcome"| RFM
RL["RL Post-training"] -->|"Policy Update"| RFM
| 现有模块 | RFM 中的角色 |
|---|---|
VLA (unified_pushcube_vla.py) |
RFM 的动作生成层(简化版) |
World Model (unified_pushcube_wm.py) |
预测 RFM 动作的结果 |
RL (unified_pushcube_rl.py) |
RL 后训练优化 RFM 策略 |
PushCube (unified_pushcube_env.py) |
RFM 的统一评测环境 |
SmolVLA (vla_demo.py) |
升级为 SmolVLAAdapter |
8. 与机器人控制系统的连接¶
RFM 输出的是高层动作块,最终必须落实到具体机器人的底层控制。完整链路如下:
语言 + RGB
↓
Robot Foundation Model
↓
Action Chunk(joint positions / EE deltas / gripper commands)
↓
Robot Adapter
↓
Low-level Controller(PID / impedance control / joint servo)
↓
Safety Filter
↓
MuJoCo / ROS 2 / Real Robot
各层职责¶
RFM → Action Chunk:模型输出固定 horizon 的动作序列,类型可以是 joint_position、ee_delta、gripper 等。
Robot Adapter:将通用 ActionChunk 映射到特定机器人的动作空间。例如把 7-DOF 关节目标映射到 Franka 的 JointPositionInterface,或将 ee_delta 通过 IK 转成关节目标。
Low-level Controller:负责高频跟踪。对真实机器人包括: - PID 控制:关节位置闭环 - 阻抗控制:与环境交互时的柔顺性 - 前馈补偿:重力、摩擦补偿
Safety Filter:在动作到达硬件前的最后一道防线: - 关节限位检查 - 速度/加速度限制 - 碰撞检测(MuJoCo 中通过 contact 判断) - 急停逻辑
连接示例:Franka Panda¶
RFM (SmolVLA) → ActionChunk (joint_position, 7-DOF)
↓
Robot Adapter (FrankaAdapter)
↓
Low-level Controller (Franka joint position controller, 1kHz)
↓
Safety Filter (joint limits, velocity limits)
↓
Franka Robot
对于仿真环境,链路相同,只是底层控制器替换为 MuJoCo 的 mj_step。本仓库的 unified_pushcube_env.py 已经封装了这一接口:Adapter 输出直接作为 env.step(action) 的输入。
与 ROS 2 的衔接¶
在真实部署中,Robot Adapter 可发布到 ROS 2 话题:
| 接口 | 消息类型 | 频率 | 说明 |
|---|---|---|---|
/joint_target |
sensor_msgs/JointState |
10–50 Hz | RFM 输出 |
/joint_command |
trajectory_msgs/JointTrajectory |
100–1000 Hz | 控制器插值 |
详见 27-embodied-reasoning-and-planning。
9. 实施路线图¶
最推荐的实施顺序¶
| 阶段 | 任务 | 状态 |
|---|---|---|
| 1 | 新建 RFM 总览与统一接口 | ✅ 完成 |
| 2 | 把现有 SmolVLA 重构成标准 Adapter | ✅ 完成 |
| 3 | 建立 Canonical Dataset,并提供 LeRobot/RLDS 转换 | ⏳ 规划中 |
| 4 | 在双方块 PushCube 上完成 SmolVLA 微调和严格语言消融 | ⏳ 规划中 |
| 5 | 加入 OpenVLA Adapter,作为大模型对照 | ✅ 接口完成 |
| 6 | 在真实 Franka / UR5 上完成 SmolVLA 微调和闭环评测 | ⏳ 规划中 |
| 7 | 最后再考虑 GR00T、π 系列和真实人形机器人 | ⏳ 规划中 |
核心不是"收录更多模型名字"¶
而是让仓库形成:
同一数据接口、同一动作接口、同一任务环境、同一评测协议下的机器人基础模型实验闭环。
延伸阅读¶
| 文档 | 内容 |
|---|---|
| 24-action-representation-and-tokenization | 动作表示与 Tokenization |
| 25-cross-embodiment-adaptation | Cross-Embodiment 适配 |
| 26-rfm-finetuning-and-evaluation | RFM 微调与评测 |
| 27-embodied-reasoning-and-planning | 具身推理与规划 |
| 13-vla-zero-to-one | VLA 实战(SmolVLA) |
| 21-vla-dataset-organization | 数据集组织 |