欢迎光临
我们一直在努力

开源双臂模仿学习Aloha ACT 论文解读

论文:Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware(完全开源,RSS 2023,2010 stars) 会议:RSS 2023 链接:https://arxiv.org/abs/2304.13705 GitHub:tonyzhaozh/act | 2010 stars 作者:Tony Z. Zhao, Vikash Kumar, Sergey Levine, Chelsea Finn(Stanford University)

目录

  • 一、这篇论文解决了什么问题
  • 二、关键方法
  • 三、实验结果
  • 四、本地部署全流程
  • 五、为什么重要
  • 六、适用场景与机器人平台
  • 七、局限

一、这篇论文解决了什么问题

开一个调料杯盖子,人类两秒搞定,机器人来做却要应对毫米级精度、接触力协调和闭环视觉反馈。传统方案要么用昂贵的力控机械臂,要么依赖精细标定和传感器,一套系统搭下来成本和时间都不低。

这篇论文同时解决两个问题:硬件和算法。硬件层面,作者用两台 ViperX 300 6-DOF 机械臂(单台约 $5600)加上 3D 打印的透明夹爪和四个普通 USB 摄像头,搭出 ALOHA 双臂遥操作平台,成本只有工业级系统的一个零头。算法层面,提出 Action Chunking with Transformers(ACT),直接从 RGB 图像端到端预测关节位置,不需要力传感器、不需要状态估计、不需要轨迹规划。

核心矛盾在于:精细操作任务对误差极其敏感,而行为克隆(BC)本身有 compounding error 问题——单步预测的小误差会在长 horizon 任务里指数放大。人类演示还有随机性,同一个任务每次轨迹都不完全一样。ACT 要在这两个困难同时存在的情况下,把 50 条演示(约 10 分钟)变成能跑 80-90% 成功率的策略。

二、关键方法

ACT 的架构是一个条件变分自编码器(CVAE),从 DETR 改造而来。整个模型约 80M 参数,包含编码器和解码器两条路径。 在这里插入图片描述

CVAE 编码器:从动作序列提取 latent z

训练时,编码器接收当前关节位置 qpos(14 维,双臂各 7 DOF)和对应的动作序列(chunk size k=100,每个动作 14 维)。动作序列经过线性投影到 hidden_dim=512,qpos 同样投影到 512 维,再拼接一个可学习的 CLS token。三者组成序列 [CLS, qpos, action_seq],长度为 k+2。

这个序列送入一个 4 层 Transformer encoder(8 heads,dim_feedforward=3200),位置编码用固定的正弦表。取 CLS token 的输出,过一个线性层投影到 latent_dim×2=64 维,拆成 mu 和 logvar 各 32 维。通过重参数化 z = mu + std * eps(std = exp(logvar/2))得到 latent sample z。推理时 z 直接置零,从先验采样。

CVAE 解码器:从图像和 z 重建动作序列

解码器的视觉 backbone 是 ResNet18,权重从头训练(不用预训练),后面接 FrozenBatchNorm2d。输入图像 480×640,经 backbone 提取多尺度特征后用 1×1 卷积投影到 hidden_dim=512。双臂只用一个 top 相机(仿真中),真机用四个相机,多相机特征在宽度维度拼接。

关节位置 qpos 经过 input_proj_robot_state(14→512)得到 proprio embedding。latent z 经过 latent_out_proj(32→512)得到 latent embedding。两者通过 additional_pos_embed 加上位置信息后,与图像特征一起送入 Transformer decoder。

Transformer decoder 有 7 层,8 heads,dim_feedforward=3200。查询向量 query_embed 是 k=100 个可学习 embedding,对应 chunk size。decoder 输出经过两个线性头:action_head(512→14)预测动作,is_pad_head(512→1)预测该时间步是否为 padding。

训练 loss

总 loss 由两部分组成:

L = L1_loss + kl_weight * KL_divergence

L1 loss 对预测动作和真实动作做逐元素 L1,再按 ~is_pad mask 掉 padding 位后取均值。KL 散度用标准公式 klds = -0.5 * (1 + logvar – mu^2 – exp(logvar)),对所有 latent 维度求和再对 batch 求均值。kl_weight 默认设 10。

Action Chunking

策略不预测单步动作,而是一次性预测未来 k 步的动作序列 π(a_{t:t+k} | s_t)。每 k 步查询一次策略,执行完整个 chunk 后再查询下一次。这把任务的 effective horizon 缩短了 k 倍。论文实验表明 k=100 是最优区间,k=1(无 chunking)成功率只有 1%,k=100 飙到 44%,k=400(接近开环)又开始下降,因为丢失了闭环反应能力。

Temporal Ensembling

如果只在 chunk 边界查询策略,动作会有跳跃。Temporal ensembling 的做法是每步都查询策略,把每次查询输出的 k 步动作存入一个 buffer all_time_actions[T, T+k, state_dim]。对于当前时间步 t,收集所有覆盖到 t 的预测(最多 k 个),用指数衰减权重 w_i = exp(-0.01 * i) 加权平均,得到平滑的当前动作。

代码里 query_frequency = 1(开启 temporal_agg 时),每个 timestep 都调用策略。k=0.01 是衰减系数,越早的预测权重越低。这个设计让策略输出更平滑,ACT 的 ablation 显示 temporal ensembling 给 ACT 带来 3.3% 的成功率提升。

三、实验结果

论文在 2 个仿真任务和 6 个真机任务上评估。仿真用 MuJoCo,包含 Transfer Cube(双臂传递方块)和 Bimanual Insertion(双臂插孔)。真机任务包括 Slide Ziploc(拉密封袋)、Slot Battery(装电池)、Open Cup(开杯盖)、Thread Velcro(穿魔术贴)、Prep Tape(挂胶带)、Put On Shoe(穿鞋)。

仿真任务 + 真机任务(Table I)

对比 4 个 baseline:BC-ConvMLP、BeT、RT-1、VINN。仿真任务报告 [脚本数据 | 人类数据],3 个 seed × 50 次评估;真机任务 1 个 seed × 25 次评估。

任务BC-ConvMLPBeTRT-1VINNACT
Transfer Cube (sim, scripted) 97
Transfer Cube (sim, human) 90
Bimanual Insertion (sim, scripted) 93
Bimanual Insertion (sim, human) 76
Slide Ziploc (real) 92
Slot Battery (real) 96

(注:论文 Table I 以 ACT 与 4 baseline 对比的形式呈现,上表提取 ACT 列的最终成功率。ACT 在 Transfer Cube 脚本数据上比次优方法高 59%,Bimanual Insertion 高 49%,Slide Ziploc 高 29%,Slot Battery 高 20%。baseline 方法在真机任务上基本卡在第一阶段,最终成功率接近 0。)

真机任务细分阶段(Table I + Table II)

Table II 把 Open Cup、Thread Velcro、Prep Tape 三个任务拆成子阶段,只与最强 baseline BeT 对比。

Open Cup(开杯盖)

阶段BeTACT
Tip Over(翻倒杯子) 12 100
Grasp(抓取) 0 96
Open Lid(撬开盖子) 0 84
Lift(提起) 24 92

Thread Velcro(穿魔术贴)

阶段BeTACT
Grasp(抓取) 0 40
Insert(插入) 0 20

Prep Tape(挂胶带)

阶段BeTACT
Grasp(抓取) 0 96
Cut(剪断) 0 92
Handover(交接) 8 72
Hang(悬挂) 0 64

Put On Shoe(穿鞋)

阶段BeTACT
Lift(抬起) 0 100
Insert(插入) 0 92
Support(支撑) 0 92
Secure(固定) 0 92

失败模式分析

Thread Velcro 是 ACT 表现最差的真机任务,最终成功率只有 20%,每个阶段几乎折半下降。论文指出两种典型失败:第一,第二阶段右臂过早闭合夹爪,没能抓住魔术贴尾部;第二,第三阶段插入精度不够,偏离了 loop 孔。根因是魔术贴在图像中占比极小,黑色物体和背景对比度低,视觉定位本身就很困难。

从仿真切到人类数据时,所有方法都有性能下降。CVAE 的 ablation 显示,用脚本数据训练时去掉 CVAE 几乎无影响(-1%),但用人类数据训练时去掉 CVAE,成功率从 35.3% 暴跌到 2%。人类演示的多模态性和噪声让确定性策略直接崩溃,CVAE 的 latent z 用来吸收这部分方差。

四、本地部署全流程

环境要求

  • Python 3.8.10(conda 环境)
  • PyTorch + torchvision(版本未指定,README 只写 pip install torch)
  • MuJoCo 2.3.7 + dm_control 1.0.14(仿真环境)
  • GPU:论文用单张 RTX 2080 Ti 11G 训练,80M 参数模型,5 小时完成仿真任务训练
  • 真机训练建议至少 5000 epoch 或 loss 平台期后再训 3-4 倍时长

Step 1:创建环境

conda create -n aloha python=3.8.10
conda activate aloha
pip install torchvision
pip install torch
pip install pyquaternion pyyaml rospkg pexpect
pip install mujoco==2.3.7
pip install dm_control==1.0.14
pip install opencv-python matplotlib einops packaging h5py ipython
cd act/detr && pip install -e .

Step 2:克隆仓库

git clone https://github.com/tonyzhaozh/act.git
cd act

Step 3:生成仿真数据

python3 record_sim_episodes.py \\
–task_name sim_transfer_cube_scripted \\
–dataset_dir <data save dir> \\
–num_episodes 50
``+
`
–onscreen_render` 可以实时看渲染。另一个可选任务是 `sim_insertion_scripted`

### Step 4:训练 ACT

```bash
python3 imitate_episodes.py \\
–task_name sim_transfer_cube_scripted \\
–ckpt_dir <ckpt dir> \\
–policy_class ACT \\
–kl_weight 10 \\
–chunk_size 100 \\
–hidden_dim 512 \\
–batch_size 8 \\
–dim_feedforward 3200 \\
–num_epochs 2000 \\
–lr 1e-5 \\
–seed 0

关键训练超参:lr=1e-5,batch_size=8,2000 epoch(仿真),kl_weight=10,chunk_size=100,hidden_dim=512,dim_feedforward=3200,backbone=ResNet18,encoder 4 层,decoder 7 层,8 heads。模型约 80M 参数,单卡 RTX 2080 Ti 训练约 5 小时。

真机数据训练建议至少 5000 epoch。README 的 tuning tips 明确说:如果策略出现抖动或中途停顿,继续训。成功率和平滑度可以在 loss 平台之后继续提升。

Step 5:评估

python3 imitate_episodes.py \\
–task_name sim_transfer_cube_scripted \\
–ckpt_dir <ckpt dir> \\
–policy_class ACT \\
–kl_weight 10 –chunk_size 100 –hidden_dim 512 –batch_size 8 –dim_feedforward 3200 \\
–num_epochs 2000 –lr 1e-5 –seed 0 \\
–eval

加 –temporal_agg 开启 temporal ensembling。Transfer Cube 预期成功率约 90%,Insertion 约 50%。评估视频会保存到 ckpt_dir。

推理参数

  • 控制频率:50Hz(DT=0.02s)
  • Action chunk size:100(即 2 秒的动作序列)
  • 模型精度:FP32(代码未做 FP16/量化,但 80M 参数在 11G 显存上绰绰有余)
  • 推理延迟:单次前向约 10-20ms(RTX 2080 Ti 级别),远小于 20ms 控制周期
  • 相机:仿真 1 个 top camera,真机 4 个 USB 摄像头(480×640 RGB)
  • 状态维度:14(双臂各 7 DOF 关节位置)

硬件建议

仿真训练:任意 8G+ GPU 即可。真机部署需要 ALOHA 硬件(2× ViperX 300 + 4× USB 摄像头),或自行搭建兼容的双臂系统。仓库不含预训练权重,需自行训练。

五、为什么重要

ACT 是 2023 年双臂模仿学习的标杆工作,影响力远超论文本身。它证明了三件事:低成本硬件能做精细操作,10 分钟演示数据足够训练可用策略,action chunking 是处理 compounding error 的有效手段。 在这里插入图片描述

Action chunking 这个设计后来被大量工作继承:Diffusion Policy、π0、GR00T N1、OpenVLA 的后续变体都在用 chunk-wise 预测。Temporal ensembling 的指数加权平滑也成了通用技巧。CVAE 处理人类演示多模态性的思路,在后续工作里演化成了 diffusion policy 的分布建模。

从工程角度,ACT 的训练成本极低——80M 参数、单卡 2080 Ti、5 小时、50 条演示——这让个人研究者和小实验室也能复现和迭代。仓库代码清晰,依赖少,仿真环境开箱即用,是目前最适合入门双臂模仿学习的项目之一。

六、适用场景与机器人平台

机器人平台:ALOHA 双臂系统(2× ViperX 300 6-DOF),后续扩展到 Mobile ALOHA(底盘+双臂)。代码也支持其他双臂平台,只要能提供关节位置控制和 RGB 图像输入。仿真环境基于 MuJoCo + dm_control,包含 Transfer Cube 和 Bimanual Insertion 两个任务。

适用场景:

  • 双臂协调的精细操作:开盖、插装、穿线、折叠
  • 需要闭环视觉反馈的接触丰富任务
  • 数据量有限(50-100 条演示)的快速技能获取
  • 遥操作数据采集 + 模仿学习的完整流程验证

不适用:单臂任务(架构为双臂设计)、长 horizon 多阶段任务(chunk size 有限)、需要语言指令的条件控制(ACT 不接入语言)。

七、局限

Thread Velcro 只有 20% 成功率,暴露了 ACT 在小物体、低对比度场景下的视觉感知瓶颈。图像分辨率 480×640,小物体在画面中占比太低,backbone 只用 ResNet18,没有更高分辨率的特征提取。

Action chunk size 是固定的 k=100,无法根据任务复杂度自适应。k 太大开环倾向重,k 太小 compounding error 回来。Temporal ensembling 的衰减系数 k=0.01 也是全局固定,不同任务可能需要不同的平滑强度。

CVAE 的 latent z 推理时直接置零,相当于只用了均值。这意味着推理时策略是确定性的,无法在执行时根据情况采样不同的动作模式。对于需要明显多模态行为的任务,这个设计会丢失一部分表达能力。

训练需要 2000-5000 epoch,对数据量和训练时长来说效率不算高。后续的 Diffusion Policy 在类似任务上用更少 epoch 达到更好效果。ACT 也没有接入语言条件,无法做多任务泛化,每个任务需要单独训练一个策略。


关注我,每周更新论文深度解读 + 本地部署指南。

有什么论文想看解读?评论区告诉我。


赞(0)
未经允许不得转载:171主机测评 » 开源双臂模仿学习Aloha ACT 论文解读
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址