Octo 算法详解:开源通用机器人策略模型技术报告
版本:v1.0
日期:2026-04-28
主题:Generalist Robot Policy / Transformer Policy / Diffusion Policy / Open X-Embodiment / VLA / Robot Learning
目录
- [1. 摘要](#1. 摘要)
- [2. Octo 的定位](#2. Octo 的定位)
- [3. 解决的问题与设计目标](#3. 解决的问题与设计目标)
- [4. 总体算法框架](#4. 总体算法框架)
- [5. 输入表示:Task 与 Observation](#5. 输入表示:Task 与 Observation)
- [6. Tokenizer 设计](#6. Tokenizer 设计)
- [7. Transformer Backbone](#7. Transformer Backbone)
- [8. Readout Token 与动作上下文建模](#8. Readout Token 与动作上下文建模)
- [9. Diffusion Action Head](#9. Diffusion Action Head)
- [10. 训练数据与 Open X-Embodiment](#10. 训练数据与 Open X-Embodiment)
- [11. 训练目标与预训练流程](#11. 训练目标与预训练流程)
- [12. 微调策略](#12. 微调策略)
- [13. 推理流程](#13. 推理流程)
- [14. 模型规格:Octo-Small / Octo-Base](#14. 模型规格:Octo-Small / Octo-Base)
- [15. 关键创新点](#15. 关键创新点)
- [16. 与 RT-1-X / RT-2-X / OpenVLA / SmolVLA 的对比](#16. 与 RT-1-X / RT-2-X / OpenVLA / SmolVLA 的对比)
- [17. 优点与局限](#17. 优点与局限)
- [18. 工程落地建议](#18. 工程落地建议)
- [19. ROS2 / 真实机器人部署参考架构](#19. ROS2 / 真实机器人部署参考架构)
- [20. Jetson / Orin 部署建议](#20. Jetson / Orin 部署建议)
- [21. 适合的研究方向](#21. 适合的研究方向)
- [22. 总结](#22. 总结)
- [23. 参考资料](#23. 参考资料)
1. 摘要
Octo 是一个开源的 Generalist Robot Policy,通用机器人策略模型。它的目标不是为某一个机器人、某一个任务单独训练策略,而是利用大规模跨机器人数据进行预训练,然后在新机器人、新任务、新传感器组合、新动作空间上用少量数据进行快速微调。
从算法形态看,Octo 可以概括为:
text
Octo = 多模态任务条件 + 多相机观测 + Transformer Backbone + Diffusion Action Head
它支持:
- 语言指令条件,例如
pick up the spoon; - 目标图像条件,例如给定一个期望完成状态图片;
- 多 RGB 相机输入,例如第三视角相机和腕部相机;
- 观测历史窗口;
- 连续动作 chunk 输出;
- 对新 observation space 和 action space 的微调。
和更偏 VLM/VLA 的 OpenVLA、RT-2 类模型相比,Octo 的核心优势不是复杂语言推理,而是 机器人策略预训练、连续动作建模、快速微调和工程可改造性。
2. Octo 的定位
Octo 的论文标题是 Octo: An Open-Source Generalist Robot Policy。它是面向机器人操作任务的通用策略模型,尤其关注机械臂 manipulation 场景。
2.1 一句话定义
Octo 是一个基于 Transformer 的开源机器人策略模型,使用 Open X-Embodiment 中的大规模跨机器人数据预训练,并通过 diffusion policy 形式输出连续动作序列。
2.2 与传统机器人策略的区别
传统 imitation learning / behavior cloning 常见流程是:
text
特定机器人 + 特定任务数据
↓
训练一个专用策略
↓
只能在相似环境和相似任务中使用
Octo 的思路是:
text
多机器人 + 多任务 + 多场景数据
↓
预训练通用策略 backbone
↓
少量目标域数据微调
↓
适配新机器人 / 新任务 / 新传感器 / 新动作空间
它更像机器人领域的 policy foundation model initialization,即一个通用策略初始化模型。
3. 解决的问题与设计目标
Octo 主要解决以下问题。
3.1 不同机器人之间难以共享策略
不同机器人平台可能有不同的:
- 机械臂构型;
- 相机数量;
- 相机视角;
- 控制频率;
- 动作定义;
- gripper 表示;
- proprioception 状态向量;
- 数据标注方式。
如果每个平台都从零训练,会造成数据和算力浪费。
3.2 机器人数据昂贵且稀缺
真实机器人采集数据成本高,特别是:
- 需要人工遥操作;
- 场景搭建成本高;
- 失败样本多;
- 机器人磨损和安全风险高;
- 数据分布随硬件/场景变化严重。
因此,一个可复用的预训练策略可以显著降低新任务冷启动成本。
3.3 动作空间是连续且多峰的
机器人控制中的动作通常是连续值,例如:
text
Δx, Δy, Δz, Δroll, Δpitch, Δyaw, gripper
同一个状态下可能存在多个合理动作。例如抓取杯子时,从左侧、右侧、上方靠近都可能成功。若使用简单 MSE 回归,模型可能输出多个动作均值,导致动作犹豫或失败。
Octo 使用 diffusion action head 来建模连续、多峰动作分布。
3.4 需要快速适配新 observation/action space
真实工程中,新机器人往往会改变:
- 是否有 wrist camera;
- 是否使用 depth;
- 是否加入 proprioception;
- action dim 是否不同;
- 是否使用双臂;
- 是否使用不同 gripper 编码。
Octo 的架构设计强调 modularity,可以相对容易地替换 tokenizer 和 action head。
4. 总体算法框架
Octo 的整体结构可以拆成 5 个阶段:
Task Inputs
Language / Goal Image
Task Tokenizer
Observation Inputs
Primary Camera / Wrist Camera / History
Observation Tokenizer
Unified Token Sequence
Transformer Backbone
Block-wise Masked Attention
Readout Tokens
Diffusion Action Head
Continuous Action Chunk
Robot Controller / Receding Horizon Execution
核心路径:
text
语言 / 目标图像 / 多相机观测
↓
模态专属 tokenizer
↓
统一 token 序列
↓
Transformer backbone
↓
readout token 聚合动作上下文
↓
diffusion action head
↓
连续动作 chunk
5. 输入表示:Task 与 Observation
Octo 的输入分成两大类:
- Task input:告诉机器人要做什么;
- Observation input:告诉机器人当前看到什么、处于什么状态。
5.1 Task input
Octo 支持两类任务条件。
| Task 类型 | 说明 | 示例 |
|---|---|---|
| Language instruction | 自然语言任务描述 | pick up the spoon |
| Goal image | 目标状态图片 | 一个已完成任务的目标图像 |
语言指令主要提供语义目标,目标图像则提供视觉状态目标。
5.2 Observation input
Octo 常见观测包括:
| Observation 类型 | 说明 |
|---|---|
image_primary |
主视角 RGB 图像,通常是第三视角相机 |
image_wrist |
腕部相机 RGB 图像 |
| history window | 当前帧和历史帧组成的观测窗口 |
timestep_pad_mask |
标记历史窗口中哪些 timestep 有效 |
pad_mask_dict |
标记哪些模态存在,哪些模态缺失 |
官方 Octo-Base 模型卡给出的典型输入规格为:
python
Observations = {
"image_primary": (batch, history_window, 256, 256, 3),
"image_wrist": (batch, history_window, 128, 128, 3),
}
Tasks = {
"image_primary": (batch, 256, 256, 3),
"image_wrist": (batch, 128, 128, 3),
"language_instruction": {
"attention_mask": (batch, 16),
"input_ids": (batch, 16),
},
}
5.3 Mask 机制
Octo 需要处理不同数据集中的缺失模态。例如有的数据没有腕部相机,有的数据没有语言标注。因此它使用 mask 表示输入是否有效。
python
observation = {
"image_primary": primary_images,
"image_wrist": wrist_images,
"timestep_pad_mask": timestep_mask,
"pad_mask_dict": {
"image_primary": True,
"image_wrist": False,
"language_instruction": True,
}
}
其中:
timestep_pad_mask:控制哪些历史 timestep 可被 attention;pad_mask_dict:控制哪些模态 token 可被 attention。
这个机制使 Octo 可以在跨数据集训练时兼容不完整输入。
6. Tokenizer 设计
Octo 的 tokenizer 目标是把不同模态转换为统一 token 序列。
6.1 图像 tokenizer
Octo 不使用特别重的视觉编码器,而是采用较轻的卷积编码器,然后将图像特征切成 patch token。
简化流程:
text
RGB image
↓
lightweight CNN encoder
↓
feature map
↓
patchify / flatten
↓
visual tokens
这种设计体现了 Octo 的 Transformer-first 思路:不要把大部分参数放在重视觉 backbone 中,而是把跨模态、跨时间、跨任务的信息融合交给 Transformer。
6.2 语言 tokenizer
语言输入通常经过:
text
text instruction
↓
T5 tokenizer
↓
T5-Base language encoder
↓
language tokens
语言 token 不直接输出动作,而是作为 task condition 被 Transformer 使用。
6.3 目标图像 tokenizer
目标图像和观测图像类似,也会通过图像 tokenizer 转换成 visual task tokens。
6.4 Proprioception tokenizer
在预训练模型基础上微调新机器人时,可以加入 proprioception tokenizer,将低维状态向量映射到 token:
text
joint / ee pose / gripper state
↓
MLP projection
↓
proprio tokens
这对真实机器人很重要,因为只依赖图像可能不足以稳定控制。
7. Transformer Backbone
Octo 的核心是 Transformer backbone。它把任务 token、图像 token、历史观测 token、readout token 组织成统一序列进行 attention。
7.1 输入 token 组织
一个简化的 token 组织方式如下:
text
[task tokens]
[obs t-1 primary image tokens]
[obs t-1 wrist image tokens]
[obs t readout tokens]
[obs t primary image tokens]
[obs t wrist image tokens]
[obs t readout tokens]
真实实现中会结合时间位置编码、模态位置编码和 attention mask。
7.2 Block-wise masked attention
机器人策略必须满足时序因果性:当前动作不能依赖未来观测。因此 Octo 使用 block-wise masked attention,让观测 token 只能 attend 到:
- 当前 timestep 的 token;
- 过去 timestep 的 token;
- task token;
- 对应可见模态 token。
简化图示:
text
允许关注:
task tokens
obs tokens at t-1
obs tokens at t
禁止关注:
obs tokens at t+1
7.3 这种设计的意义
block-wise attention 让 Octo 兼顾:
- 多模态融合;
- 时序建模;
- 不同模态缺失处理;
- task conditioning;
- 历史观测利用;
- 真实机器人闭环控制中的因果约束。
8. Readout Token 与动作上下文建模
Octo 引入 learned readout tokens,用于从 Transformer 中读取动作相关上下文。
可以把 readout token 理解为:
text
专门为 action head 准备的查询 token
它类似 BERT 中的 [CLS] token,但用途是服务于动作生成。
8.1 为什么需要 readout token?
如果直接从所有 observation token 中生成动作,会遇到几个问题:
- token 数量大;
- 不同输入模态数量不同;
- action head 输入维度不稳定;
- 替换 action head 不方便。
readout token 可以将不同输入模态融合成稳定的动作上下文表示:
text
大量 observation/task tokens
↓
Transformer attention
↓
少量 readout tokens
↓
action head
8.2 对微调的意义
当新机器人动作空间变化时,可以保留:
- 图像 tokenizer 的部分参数;
- 语言 tokenizer;
- Transformer backbone;
- readout token 机制;
然后替换 action head。这样可以最大化复用预训练能力。
9. Diffusion Action Head
Octo 的动作头是算法中最关键的部分之一。它使用 conditional diffusion policy 输出连续动作 chunk。
9.1 为什么不用简单 MSE?
MSE 行为克隆目标通常是:
math
\mathcal{L}_{MSE}=\|a - \hat{a}\|_2^2
这种方式在单峰动作分布中有效,但在多峰任务中容易输出平均动作。
例如:
text
合理动作 A:从左侧抓取
合理动作 B:从右侧抓取
MSE 平均:从中间犹豫靠近,可能撞到物体或抓取失败
9.2 Diffusion policy 的基本思想
Diffusion action head 将真实动作逐步加噪,训练模型预测噪声或去噪方向。
训练时:
math
a_t = \sqrt{\bar{\alpha}_t}a_0 + \sqrt{1-\bar{\alpha}_t}\epsilon
math
\mathcal{L}=\mathbb{E}_{a_0,\epsilon,t}\left[\left\|\epsilon-\epsilon_\theta(a_t,t,h)\right\|_2^2\right]
其中:
| 符号 | 含义 |
|---|---|
a_0 |
数据集中的真实动作 chunk |
a_t |
加噪后的动作 |
t |
diffusion step |
h |
Transformer readout token embedding |
epsilon |
真实噪声 |
epsilon_theta |
模型预测噪声 |
推理时:
text
随机高斯动作噪声
↓
条件输入 h
↓
多步去噪
↓
连续动作 chunk
9.3 Action chunking
Octo 不是只预测单步动作,而是预测未来多个动作组成的 chunk。
例如 Octo-Base 模型卡中说明:
text
history window size = 2
predicted action dimension = 7
future action steps = 4
即每次根据最近 2 帧观测,预测未来 4 步、每步 7 维的动作。
9.4 Receding horizon execution
真实部署时通常不会盲目执行完整 chunk,而是采用 receding horizon:
text
1. 输入最近观测
2. 预测未来 H 步动作
3. 只执行前 1~k 步
4. 重新感知
5. 再次预测
这样既利用 action chunk 的平滑性,又保持闭环纠错能力。
10. 训练数据与 Open X-Embodiment
Octo 预训练数据来自 Open X-Embodiment 数据集的机器人操作数据子集。论文和官方项目描述中强调,Octo 使用了约 800k robot trajectories / episodes 的多机器人数据。
10.1 数据特点
| 维度 | 特点 |
|---|---|
| 数据规模 | 约 800k 机器人轨迹 |
| 数据来源 | Open X-Embodiment 数据集子集 |
| 任务类型 | pick、place、insert、rearrange、coffee、tabletop manipulation 等 |
| 机器人平台 | 多种机械臂和末端执行器 |
| 观测类型 | 主相机、腕部相机、部分数据带语言 |
| 动作类型 | 以末端 delta control 等连续控制为主 |
10.2 数据混合策略
官方 Hugging Face 模型卡列出了 Octo-Base 数据混合来源,包括:
- Fractal;
- Kuka;
- Bridge;
- BC-Z;
- Stanford Hydra;
- Language Table;
- Taco Play;
- Furniture Bench;
- Roboturk;
- Berkeley / Austin / CMU / NYU 等多个机器人数据集。
这类混合训练让 Octo 能学习到跨平台的操作先验。
10.3 数据规范化问题
跨机器人数据混合时,需要统一:
- 图像尺寸;
- 相机命名;
- gripper open/close 表示;
- action normalization;
- language annotation;
- 缺失模态 mask;
- episode slicing;
- history window;
- action chunk horizon。
这也是 Octo 工程复杂度的重要来源。
11. 训练目标与预训练流程
Octo 的预训练本质上是大规模 behavior cloning,但动作分布由 diffusion head 建模。
11.1 训练样本
每个训练样本可以抽象为:
python
sample = {
"task": {
"language_instruction": ...,
"goal_image": ...,
},
"observation": {
"image_primary": ...,
"image_wrist": ...,
"timestep_pad_mask": ...,
"pad_mask_dict": ...,
},
"action_chunk": ...,
}
11.2 训练流程
Sample episode segment
Build observation history
Build task condition
Tokenize modalities
Transformer forward
Readout token embedding
Add noise to action chunk
Diffusion head predicts noise
Compute denoising loss
Backpropagation
11.3 训练目标
核心优化目标是:
text
给定任务条件和观测历史,使 diffusion head 能从噪声恢复数据集中的真实动作 chunk。
这相当于学习条件动作分布:
math
p(a_{t:t+H} \mid o_{t-K:t}, task)
其中:
K是 history window 长度;H是 action chunk horizon;task可以是语言或目标图像。
12. 微调策略
Octo 的重要价值在于微调能力。
12.1 典型微调场景
| 微调场景 | 修改内容 |
|---|---|
| 新机器人但相机类似 | 主要微调 backbone + action head |
| 新相机组合 | 增删 image tokenizer |
| 加入 proprioception | 新增 proprio tokenizer |
| 新动作维度 | 替换 action head |
| 双臂机器人 | 替换为更高维 action head |
| 只做目标图像任务 | 调整 task condition 类型 |
12.2 微调模式
官方代码支持不同冻结方式,例如:
| 模式 | 说明 |
|---|---|
head_only |
只训练动作头 |
head_mlp_only |
只训练 action head 中的 MLP 部分 |
full |
微调整个模型 |
对于数据较少但动作空间变化明显的任务,通常可以先尝试:
text
1. 替换 action head
2. 冻结大部分 backbone,只训 head
3. 观察是否能收敛
4. 再解冻部分或全模型微调
12.3 微调建议
如果目标机器人和 Octo 预训练数据差异较小:
text
优先:head_only / head_mlp_only
如果差异较大,例如:
- 新相机角度;
- 新动作定义;
- 新机器人 morphology;
- 新任务分布;
- 新场景视觉域;
建议:
text
full finetuning + 较小学习率 + 数据增强 + action normalization 核查
12.4 微调风险点
微调失败常见原因:
- action normalization 和 unnormalization 不一致;
- gripper open/close 编码方向反了;
- 相机输入 key 和 checkpoint spec 不一致;
- history window mask 错误;
- 新 action head 输出维度不匹配;
- 数据集 episode 切片错位;
- 语言 instruction 与动作轨迹不对齐;
- 推理时使用了错误的 dataset action statistics。
13. 推理流程
Octo 官方接口一般通过 OctoModel.load_pretrained() 加载模型,并通过 create_tasks() 与 sample_actions() 进行推理。
13.1 简化推理伪代码
python
import jax
from octo.model.octo_model import OctoModel
model = OctoModel.load_pretrained("hf://rail-berkeley/octo-small-1.5")
task = model.create_tasks(
texts=["pick up the spoon"]
)
observation = {
"image_primary": image_primary, # [B, T, H, W, C]
"image_wrist": image_wrist, # optional
"timestep_pad_mask": timestep_mask,
}
actions = model.sample_actions(
observation,
task,
rng=jax.random.PRNGKey(0),
unnormalization_statistics=action_stats,
)
# actions: [B, action_chunk, action_dim]
13.2 推理输出
典型输出:
text
[B, H, D]
其中:
| 维度 | 含义 |
|---|---|
B |
batch size |
H |
action chunk horizon |
D |
action dimension |
例如:
text
[1, 4, 7]
表示 1 个样本,未来 4 步动作,每步 7 维。
13.3 推理执行策略
推荐执行方式:
python
while not done:
obs = get_current_observation()
action_chunk = model.sample_actions(obs, task, rng=rng)
for i in range(exec_steps):
safe_action = safety_layer(action_chunk[i])
robot.step(safe_action)
# 下一轮重新感知并重新预测
其中 exec_steps 通常小于完整 action chunk 长度。
14. 模型规格:Octo-Small / Octo-Base
官方仓库和 Hugging Face 提供了多个 checkpoint,常见为 Octo-Small 和 Octo-Base。
| 模型 | 参数规模 | 定位 | 适用场景 |
|---|---|---|---|
| Octo-Small | 约 27M | 轻量模型 | 快速实验、资源受限微调、边缘部署探索 |
| Octo-Base | 约 93M | 主力模型 | 更强泛化、更稳定微调、研究基线 |
官方 README 中给出的参考推理速度:
| 模型 | 单张 NVIDIA 4090 推理速度 | 参数量 |
|---|---|---|
| Octo-Base | 约 13 it/s | 93M |
| Octo-Small | 约 17 it/s | 27M |
注意:真实速度会受 JAX 编译、batch size、图像分辨率、diffusion steps、硬件、CPU/GPU 数据传输影响。
15. 关键创新点
15.1 开源通用机器人策略基线
Octo 的重要贡献之一是开源:
- 论文;
- 训练代码;
- 微调代码;
- 数据加载工具;
- 预训练 checkpoint;
- 推理示例;
- real robot eval 示例。
这让它适合作为机器人策略预训练研究基线。
15.2 Transformer-first 架构
Octo 将主要表达能力放在 Transformer backbone 中,而不是依赖重型视觉编码器。这有利于:
- 跨模态融合;
- 多时间步融合;
- 多数据集统一训练;
- 新输入模态扩展;
- 与 token-based robot learning 范式对齐。
15.3 模块化 observation / task / action 设计
Octo 可以相对灵活地:
text
增加输入模态
删除输入模态
替换动作头
改变 action dimension
切换语言条件或目标图像条件
这对真实机器人落地非常关键。
15.4 Diffusion action modeling
相比 MSE 回归,diffusion action head 更适合连续、多峰动作分布。
相比离散 action token,diffusion 保留了连续控制精度。
15.5 Action chunking
一次预测多个未来动作可以提升动作平滑性,并降低每一步重新采样的不稳定性。结合 receding horizon 后,又能保持闭环反馈。
16. 与 RT-1-X / RT-2-X / OpenVLA / SmolVLA 的对比
| 模型 | 核心路线 | 动作表示 | 开源程度 | 优势 | 局限 |
|---|---|---|---|---|---|
| RT-1-X | Transformer robot policy | 多为离散/结构化动作 | 部分开放 | 跨机器人泛化早期代表 | 生态不如 Octo 可复现 |
| RT-2-X | VLM to action | VLM 输出动作 token / action | 大模型未完全开放 | 语义泛化强 | 成本高,开源受限 |
| OpenVLA | Vision-Language-Action model | 离散 action token | 开源较好 | 语言视觉动作统一,语义能力强 | 连续控制需 token 化,部署较重 |
| SmolVLA | 轻量 VLA | action token / policy head | 较轻量 | 工程友好,适合 LeRobot 生态 | 规模和泛化能力受限 |
| Octo | Transformer policy + diffusion head | 连续 action chunk | 开源完整 | 连续动作、微调灵活、策略初始化强 | 复杂语言推理不如大 VLM |
16.1 Octo 更适合什么?
Octo 更适合:
text
通用 manipulation policy initialization
少量机器人数据微调
连续动作控制
研究 diffusion policy + transformer policy
新 observation/action space 适配
16.2 OpenVLA 更适合什么?
OpenVLA 更适合:
text
视觉语言动作统一建模
复杂语言指令理解
利用 VLM 语义先验
面向 VLA frontier 路线研究
16.3 SmolVLA + LeRobot 更适合什么?
SmolVLA + LeRobot 更适合:
text
资源受限训练
快速复现实验
教学 / demo / 小型机械臂
数据采集-训练-评估闭环
17. 优点与局限
17.1 优点
1. 开源完整度高
Octo 官方仓库提供训练、微调、推理、数据加载等代码,对研究和工程复现非常友好。
2. 连续动作建模自然
Diffusion action head 直接建模连续动作 chunk,更接近真实机器人控制需求。
3. 微调灵活
可以适配:
- 新相机;
- 新 proprioception;
- 新动作维度;
- 新机器人;
- 新任务条件。
4. 适合做策略预训练初始化
对于目标机器人数据较少的场景,Octo 可以提供较好的初始化。
5. 不强依赖大型 VLM
这使它在资源需求上可能比超大 VLA 模型更友好。
17.2 局限
1. 语言推理能力有限
Octo 的语言模块主要是 T5 encoder,用于 instruction embedding,并不是强 LLM/VLM 推理系统。
2. 主要面向 manipulation
Octo 的主要训练和评估集中在机械臂操作任务,不是通用移动机器人导航大脑。
3. 数据分布仍然决定泛化上限
如果目标任务和预训练数据差异过大,仍然需要较多微调数据。
4. 真实部署需要额外安全层
Octo 输出动作后必须经过:
- workspace 限幅;
- 速度/加速度限制;
- 碰撞检测;
- self-collision check;
- gripper 规则;
- emergency stop;
- failure recovery。
5. JAX 工程栈对嵌入式部署不直接友好
Octo 官方实现基于 JAX,对 Jetson / Orin 等边缘平台部署需要额外转换、裁剪或重写推理链路。
18. 工程落地建议
18.1 推荐使用方式
不建议把 Octo 视为"直接拿来就能零样本解决所有机器人任务"的模型。更合理的定位是:
text
预训练策略 backbone + 目标机器人小数据微调 + 安全控制层
18.2 数据采集建议
目标域微调数据建议覆盖:
- 目标物体多样性;
- 起始位姿多样性;
- 光照变化;
- 背景变化;
- 失败和恢复片段;
- gripper 开合边界状态;
- 动作速度分布;
- 相机遮挡情况。
18.3 Action normalization 必须严格检查
微调和推理必须使用一致的动作统计:
text
training action normalization statistics
==
inference action unnormalization statistics
否则可能出现:
- 动作幅度过大;
- 动作几乎不动;
- gripper 反向;
- 末端漂移;
- 轨迹震荡。
18.4 模型选择建议
| 目标 | 推荐 |
|---|---|
| 快速实验 | Octo-Small |
| 研究基线 | Octo-Base |
| 新机器人微调 | Octo-Base 起步,Small 做消融 |
| 边缘部署探索 | Octo-Small + 降分辨率 + 减 diffusion steps |
| 强语义泛化 | Octo + VLM planner 或考虑 OpenVLA |
19. ROS2 / 真实机器人部署参考架构
19.1 推荐分层
Camera Nodes
RGB / Wrist / Depth
Observation Builder
Robot State Node
Joint / EE Pose / Gripper
Task Interface
Text / Goal Image / Skill ID
Task Builder
Octo Policy Server
Action Unnormalizer
Safety Layer
Trajectory / Servo Controller
Robot Driver
Real Robot
19.2 ROS2 Topic 设计示例
| Topic | 类型 | 说明 |
|---|---|---|
/camera_primary/image_raw |
sensor_msgs/Image |
主相机图像 |
/camera_wrist/image_raw |
sensor_msgs/Image |
腕部相机图像 |
/joint_states |
sensor_msgs/JointState |
机器人关节状态 |
/octo/task_text |
std_msgs/String |
语言任务 |
/octo/action_chunk |
custom msg | Octo 输出动作 chunk |
/safe_servo_cmd |
custom / Twist | 安全层输出控制 |
/robot_driver/command |
driver msg | 机器人底层控制 |
19.3 Policy Server 伪代码
python
class OctoPolicyServer:
def __init__(self):
self.model = OctoModel.load_pretrained("hf://rail-berkeley/octo-small-1.5")
self.history = ObservationHistory(max_len=2)
self.task = None
def update_task(self, text):
self.task = self.model.create_tasks(texts=[text])
def on_observation(self, image_primary, image_wrist, robot_state):
self.history.append(image_primary, image_wrist, robot_state)
obs = self.history.to_octo_observation()
action_chunk = self.model.sample_actions(obs, self.task, rng=self.next_rng())
return action_chunk
19.4 Safety Layer 建议
Octo 输出动作后,不应直接下发机器人。建议加入:
python
def safety_layer(action):
action = clamp_delta_position(action, max_xyz=0.02)
action = clamp_delta_rotation(action, max_rot=0.05)
action = clamp_workspace(action, workspace_bounds)
action = smooth_action(action, previous_action)
action = collision_check_or_stop(action)
action = gripper_rule_filter(action)
return action
20. Jetson / Orin 部署建议
Octo 官方实现基于 JAX,直接在 Jetson / Orin 上生产部署并不是最顺滑路线。推荐策略是:
text
训练 / 微调:桌面 GPU / 云 GPU
部署:边缘端只做轻量推理或策略服务调用
20.1 可选部署方案
| 方案 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 本机 JAX 推理 | 直接在 Jetson 上跑 JAX | 改动少 | 环境复杂,性能不确定 |
| 远程策略服务 | Jetson 采集图像,远程 GPU 推理 | 稳定,性能强 | 网络延迟依赖 |
| 模型裁剪/重写 | 将核心模块迁移到 PyTorch/ONNX/TensorRT | 部署友好 | 工程量大 |
| Octo-Small 边缘探索 | 降分辨率、减少 diffusion steps | 资源友好 | 性能可能下降 |
20.2 推荐工程路线
第一阶段:
text
桌面 GPU 上完成 Octo 微调和离线评估
第二阶段:
text
ROS2 + 远程 policy server 实机闭环测试
第三阶段:
text
分析延迟和算力瓶颈,决定是否迁移到边缘部署
第四阶段:
text
如需 Orin 本地部署,优先考虑 Octo-Small、低分辨率、低 diffusion steps、半精度和模型裁剪
21. 适合的研究方向
Octo 可以作为以下方向的基础模型或 baseline。
21.1 通用策略预训练
研究问题:
- 数据规模如何影响泛化?
- 数据混合比例如何影响不同机器人表现?
- 任务语言标注质量是否关键?
- wrist camera 数据比例是否影响近距离操作?
21.2 Diffusion policy 与 VLA 结合
可以探索:
text
VLM planner / language planner
↓
生成 skill / subgoal / text command
↓
Octo diffusion policy 执行动作
即:
text
大模型负责"想做什么"
Octo 负责"怎么动"
21.3 新 observation space 适配
例如加入:
- depth;
- tactile;
- force/torque;
- proprioception;
- object pose;
- segmentation mask;
- point cloud token。
21.4 新 action space 适配
例如:
- joint velocity;
- joint position;
- end-effector pose;
- bimanual action;
- mobile manipulator base + arm action;
- gripper force control。
21.5 安全控制与策略约束
Octo 适合和以下模块结合:
- control barrier function;
- model predictive control;
- collision checker;
- task-space constraint;
- rule-based safety DSL;
- failure classifier;
- human override。
22. 总结
Octo 的核心价值可以总结为:
text
用大规模跨机器人数据预训练一个模块化 Transformer 策略,
再用 diffusion action head 输出连续动作 chunk,
使模型能够通过少量目标域数据快速适配新机器人、新传感器和新动作空间。
它不是最强语义推理 VLA,也不是直接替代传统控制器的全能系统。更准确地说,Octo 是一个 面向机器人操作的开源策略预训练基座。
对于工程落地,推荐把 Octo 放在如下位置:
text
VLM / Task Planner / User Command
↓
Octo Policy
↓
Safety Layer
↓
Robot Controller
对于研究,Octo 是非常有价值的 baseline,因为它兼具:
- 真实机器人数据预训练;
- transformer policy;
- diffusion action head;
- 多模态条件;
- 可微调;
- 开源可复现。
23. 参考资料
-
Octo: An Open-Source Generalist Robot Policy, arXiv:
-
Octo 官方项目页:
-
Octo 官方 GitHub 仓库:
-
Octo-Base Hugging Face 模型卡:
-
Open X-Embodiment / RT-X 项目: