ACT 深度解析:低成本硬件如何掀起双臂灵巧操作的革命

在机器人技术的前沿,让机器拥有一双像人手一样灵巧的臂膀,能够完成诸如打开瓶盖、系鞋带、使用工具等精细任务,一直是科学家们追求的圣杯。然而,通往这一目标的道路上长期矗立着一座难以逾越的大山——高昂的成本。动辄数十万美金的工业级机械臂和传感器,将无数研究者和潜在应用拒之门外。
今天,我们将要深入探讨的 ACT (Action Chunking with Transformers) 模型及其配套的 ALOHA 硬件系统,正是为了打破这一困局而生。它如同一位破局者,通过创新的算法设计和巧妙的硬件整合,证明了在“廉价”的设备上实现“昂贵”的性能并非天方夜谭,为灵巧操作机器人的普及化浪潮拉开了序幕。
一、通俗解释:ACT 与 ALOHA 是什么?
1.1 核心思想
简单来说,ACT + ALOHA 是一套完整的解决方案,旨在让低成本的双臂机器人通过模仿人类演示,学会并高成功率地执行复杂的精细操作任务。它的核心思想可以概括为:用聪明的“大脑”(ACT 算法)来弥补“身体”(ALOHA 硬件)的先天不足。它不追求极致的硬件精度,而是通过一种更高效、更鲁棒的学习方法,让机器人变得更加“心灵手巧”。
1.2 类比理解
为了更好地理解这套系统的定位,我们可以做一个类比:
-
传统高精度机器人系统 (如达芬奇手术机器人):这就像一支好莱坞的专业电影拍摄团队。他们拥有最顶级的摄像机、灯光、轨道和最专业的摄影师,能够拍出电影级别的画质,但成本极其高昂,且需要大量专业人员进行操作和维护。
-
ALOHA + ACT 系统:这更像一位技术高超的视频博主(Vlogger)。他使用的可能只是一台消费级的相机、一个稳定器和一些巧妙的运镜技巧(ACT算法)。虽然设备成本远低于专业团队,但他同样能创作出流畅、稳定且极具吸引力的视频内容。ALOHA + ACT 正是通过这种方式,将机器人灵巧操作的能力“民主化”了。
-
传统的模仿学习方法:类似于一个新手学开车,教练让他“看一步,走一步”。他每踩一下油门或转动一下方向盘后,都要停下来重新判断,这种方式效率低下,且一旦某一步出错,就很容易偏离路线(误差累积)。而 ACT 则是让学员学习“一个完整的转弯动作”或“一段平稳的直线行驶”,通过学习连贯的动作片段,驾驶变得更流畅,也更不容易出错。
1.3 关键术语解释
-
ALOHA (A Low-cost Open-source Hardware for Agile Dexterous Manipulation):这不是算法,而是指那套物理机器人系统。它使用市面上容易买到的 ViperX 和 WidowX 机械臂,配合 3D 打印组件,将总成本控制在 2 万美元以内。它最大的特点是支持高频率(50Hz)的远程遥控,让数据采集过程更加流畅自然。
-
模仿学习 (Imitation Learning):一种机器学习范式,机器人通过“观察”人类专家的演示数据来学习如何完成任务,而非通过反复试错(强化学习)。
-
动作分块 (Action Chunking):这是 ACT 算法的第一个核心。传统方法是每一步预测一个动作,而 ACT 则一次性预测未来一个较短时间窗口(例如 k 步)的完整动作序列。这使得模型能够更好地理解动作的连贯性和上下文,从而有效减少单步误差的累积。
-
时序集成 (Temporal Ensembling):这是 ACT 的第二个核心,一种平滑技术。在每个时间点,模型都会预测一个新的“动作块”,这个新块与前一个块有重叠部分。ACT 会对这些重叠部分的预测值进行加权平均,从而产生更平滑、更稳定的最终执行动作,避免了机械臂的抖动和突兀行为。
-
CVAE (Conditional Variational Autoencoder):一种生成模型,用于解决人类演示的“多模态”问题。例如,打开一个杯子,人可能会从左边拧,也可能从右边拧。CVAE 能够学习到这种行为的多样性分布,而不是强制模型只学习一种“标准答案”,这使得策略的鲁棒性和泛化能力更强。
二、应用场景与优缺点
应用场景
凭借其高性价比和强大的性能,ALOHA + ACT 系统在多个领域展现出巨大的应用潜力:
-
家庭服务:整理衣物、准备简餐(如打开调味罐、涂抹果酱)、整理桌面。
-
轻量级制造与装配:在生产线上完成插入电池、连接电缆、使用螺丝刀等精细任务。
-
实验室自动化:操作移液管、开关仪器、处理样本,将科研人员从重复性劳动中解放出来。
-
远程医疗与康复训练:作为低成本的训练平台,模拟手术操作或辅助病人进行康复训练。
优点
-
极致的性价比:将实现复杂双臂操作的硬件成本降低了一个数量级,极大地推动了相关研究和应用的普及。
-
卓越的性能:在多个具有挑战性的双臂协同任务上取得了非常高的成功率,证明了算法在低成本硬件上的有效性。
-
强大的鲁棒性:通过动作分块和 CVAE,有效克服了模仿学习中的误差累积和数据非马尔可夫性问题。
-
高效的实时推理:模型单步推理速度快,能够满足闭环控制的实时性要求。
缺点
-
依赖高质量演示:作为模仿学习方法,其性能上限受限于演示数据的质量和数量。无法自己探索出比人类演示者更优的策略。
-
硬件物理限制:低成本机械臂在负载、刚性和长期耐用性上无法与工业级机械臂相比,不适用于高负载或高强度工业场景。
-
泛化能力有待提升:对于在训练中未见过的物体或环境变化,模型的泛化能力仍是挑战。
三、模型结构详解
ACT 的核心是一个基于 Transformer 的策略网络,它巧妙地融合了视觉信息和机器人自身的状态信息,来预测未来的动作序列。
模型总体架构 (Mermaid 图)

各模块详解
-
感知模块 (Vision Backbone)
-
输入:来自多个摄像头(例如,一个顶视摄像头和一个腕部摄像头)的实时图像流。
-
结构:通常采用一个预训练好的卷积神经网络(CNN),如 ResNet-18。为了效率,这个网络的权重在训练过程中通常被冻结。
-
功能:该模块负责从原始像素中提取出高级的、有意义的视觉特征,例如物体的形状、位置、姿态等。每个摄像头的图像都经过独立的 CNN 处理,然后将提取出的特征图展平并拼接在一起,形成一个综合的视觉特征向量。
-
-
本体感觉编码器 (Proprioception Encoder)
-
输入:机器人所有关节的当前角度或位置信息,这被称为“本体感觉”。
-
结构:一个简单的多层感知机(MLP)。
-
功能:将高维的关节角度向量编码成一个低维的特征向量,以便与视觉特征进行融合。
-
-
核心策略网络 (ACT Policy - Transformer)
-
输入:融合后的视觉特征和本体感觉特征。在训练时,还会接收来自 CVAE 的条件潜变量
z。 -
结构:一个标准的 Transformer 编码器-解码器 架构。它强大的自注意力(Self-Attention)机制是其成功的关键。
-
功能:这是模型的大脑。它接收描述当前“世界状态”的特征向量,通过自注意力机制分析不同特征之间的关联和重要性,最终解码输出一个动作块(Action Chunk),即未来
k个时间步的关节目标位置序列。
-
-
CVAE 模块 (用于训练)
-
结构:包含一个编码器和一个解码器(此处的解码器与 ACT 的 Transformer 解码器共享)。编码器接收当前状态和人类演示的真实动作块,并输出一个高斯分布的参数(均值和方差)。
-
功能:该模块仅在训练阶段使用。它通过学习将人类演示动作块压缩到一个低维的潜空间中,捕捉了演示行为的内在“风格”或“意图”。在训练时,从这个分布中采样一个潜变量
z作为条件输入到 Transformer 中,迫使模型学会在给定相同初始状态下,根据不同的z生成不同但都合理的动作序列。这极大地增强了模型的鲁棒性。
-
四、模型工作流程
让我们一步步跟随数据流,看看 ACT 模型是如何思考和行动的。
-
数据输入与感知:在每一个控制周期(例如每秒 50 次),系统首先从多个摄像头获取实时图像,并从机械臂的电机编码器读取所有关节的当前角度。
-
特征提取与融合:图像被送入 CNN 模块,转化为包含场景信息的视觉特征向量。关节角度被送入 MLP,转化为代表机器人自身姿态的本体感觉特征向量。随后,这两个向量被拼接(Concatenate)成一个单一的、全面的状态向量。
-
动作块预测:这个融合后的状态向量被作为输入,喂给 ACT 的 Transformer 网络。Transformer 内部的自注意力层会计算输入特征中各个元素的重要性权重,例如,当任务是“拿起杯子”时,它会更加关注代表“杯子位置”和“夹爪状态”的特征。经过一系列计算,Transformer 的解码器最终输出一个预测的动作序列,例如,接下来 15 个时间步的关节目标角度
[a_1, a_2, ..., a_15]。 -
平滑处理与执行:这一步是时序集成(Temporal Ensembling)发挥作用的地方。假设在上一个时间步,模型预测了动作块
A_t,当前时间步预测了A_{t+1}。这两个块在时间上是重叠的。为了决定下一步到底执行哪个动作,系统会对重叠部分的预测进行加权平均。例如,将A_t的第二个动作和A_{t+1}的第一个动作进行平均,得到一个更平滑的指令。最终,只有这个平滑处理后的第一个动作a_1_smoothed会被发送给机械臂的控制器去执行。 -
闭环循环:机械臂执行完
a_1_smoothed后,它的关节角度发生了改变,摄像头中的场景也可能发生了变化。系统立即回到第一步,采集新的状态信息,并开始新一轮的预测-执行循环。这个高速的闭环反馈使得机器人能够实时地对环境变化做出响应。
五、关键技术的数学原理
ACT 的训练过程主要围绕 CVAE 的目标函数展开,即最大化证据下界 (Evidence Lower Bound, ELBO)。
ELBO 函数由两部分组成:重构损失和 KL 散度。
LELBO=Eqϕ(z∣a,s)[logpθ(a∣s,z)]−β⋅DKL(qϕ(z∣a,s)∣∣p(z∣s))
我们来逐一解析这个公式:
-
重构项: mathbbE∗q∗phi(z∣a,s)[logp_theta(a∣s,z)]
-
s是当前状态(视觉+本体感觉),a是人类演示的真实动作块。 -
q_phi(z∣a,s) 是 CVAE 的编码器,它根据真实动作
a和状态s推断出潜变量z的后验分布。 -
p_theta(a∣s,z) 是 CVAE 的解码器(也就是 ACT 的 Transformer 策略网络),它尝试根据状态
s和从编码器采样得到的z来重新生成动作块a。 -
这项的直观意义是:希望模型生成的动作块(hata)与人类演示的真实动作块(
a)尽可能地接近。在实践中,通常使用 L1 或 L2 范数来计算这个损失:
-
-
KL 散度项 (Kullback-Leibler Divergence): D_KL(q_phi(z∣a,s)∣∣p(z∣s))
-
p(z∣s) 是潜变量
z的先验分布,通常假设为一个简单的标准正态分布 mathcalN(0,I)。 -
KL 散度衡量的是编码器产生的后验分布
q与我们设定的先验分布p之间的差异。 -
这一项作为正则化项,它防止编码器“作弊”,即把所有关于动作
a的信息都硬塞进z中。它鼓励编码器学习一个结构化的、平滑的潜空间,使得在推理时可以从简单的标准正态分布中采样z,并生成多样化且合理的动作。 -
beta 是一个超参数,用于平衡重构损失和 KL 散度损失的重要性。
-
通过同时优化这两项,模型不仅学会了如何模仿动作,还学会了动作背后的多样性分布,从而变得更加鲁棒。
六、代表性变体及改进
ACT 的出现激发了机器人模仿学习领域的新浪潮,许多后续工作在其思想基础上进行了扩展和改进。
6.1 RT-1 (Robotics Transformer 1)
RT-1 是由 Google Robotics 提出的一个具有里程碑意义的模型。它与 ACT 共享了使用 Transformer 作为策略网络核心的思想,但在规模和范式上有所不同。
-
改进与不同点:
-
数据规模化:RT-1 的核心贡献在于展示了当机器人学习数据规模(超过 13 万个演示)急剧增大时,模型性能也会随之大幅提升,并表现出惊人的泛化能力。
-
统一的 Tokenization:RT-1 将图像(通过 EfficientNet 提取特征并切片)和动作指令都转换成离散的“词元”(Token),然后像处理自然语言一样,将所有信息输入一个巨大的 Transformer 模型中。这种方式统一了输入和输出的表示,使其更易于扩展。
-
关注泛化性:相比于 ACT 专注于在特定任务上实现高成功率,RT-1 更关注模型在未见过的任务、物体和环境中的“零样本”或“少样本”泛化能力。
-
6.2 Diffusion Policy (扩散策略)
扩散策略是另一条备受关注的技术路线,它将近期在图像生成领域大放异彩的扩散模型(Diffusion Model)应用于动作序列生成。
-
改进与不同点:
-
生成范式不同:ACT 采用 CVAE 来建模多模态分布,而扩散策略则通过学习一个“去噪”过程来生成动作。它首先在一个真实的动作序列上逐步添加高斯噪声,然后训练一个网络(通常是 UNet)来预测并移除这些噪声。
-
建模能力更强:理论上,扩散模型能够比 VAE 更好地捕捉复杂和多模态的数据分布,因此在处理非常精细或风格多变的人类演示时可能更具优势。
-
推理速度是挑战:传统的扩散模型需要多步迭代去噪才能生成高质量样本,这导致其推理速度远慢于 ACT 的单步前向传播。不过,近期的研究(如 Consistency Models)正在努力解决这一问题,旨在实现单步或少步生成。
-
6.3 VIMA (Visual-Language Manipulation)
VIMA 代表了机器人学习向更通用、更灵活的人机交互迈进的一大步。
-
改进与不同点:
-
多模态指令输入:VIMA 的创新之处在于它不仅仅模仿视觉演示,还能理解和执行自然语言指令。它的输入是一种被称为“多模态提示(Multimodal Prompt)”的格式,可以将文本指令(如“将红色的杯子放到绿色的碗里”)和视觉示例(如一张最终目标的图片)灵活组合。
-
统一的 Transformer 架构:VIMA 使用一个单一的、巨大的 Transformer 解码器来处理这种交错的文本-视觉序列,并自回归地生成动作。
-
通往通用机器人:这种设计使得机器人不再局限于重复执行单一的、预先录制的任务,而是能够根据用户的即时指令,动态地组合技能来完成新任务,是通往通用型机器人的重要探索。
-
七、PyTorch 简单示例代码
由于 ACT 模型的完整实现依赖于特定的数据加载、机器人环境接口等,这里提供一个简化的、聚焦于模型核心结构伪代码实现,以帮助理解其构成。
1. 简单的模型结构伪代码
import torch
import torch.nn as nn
from torchvision.models import resnet18
from torch.distributions import Normal, kl_divergence
# 这是一个简化的伪代码,用于说明 ACT 的核心结构
# 实际实现中需要处理多视角图像、数据加载和机器人接口
class SimplifiedACT(nn.Module):
def __init__(self, state_dim, action_dim, chunk_size, latent_dim, num_encoder_layers=4, num_decoder_layers=4):
super().__init__()
self.chunk_size = chunk_size
self.latent_dim = latent_dim
# 1. 视觉主干网络 (Vision Backbone)
self.vision_encoder = resnet18(pretrained=True)
# 冻结权重,只用作特征提取器
for param in self.vision_encoder.parameters():
param.requires_grad = False
# 假设 ResNet 输出 512 维特征
vision_feature_dim = 512
# 2. 本体感觉编码器 (Proprioception Encoder)
# state_dim 是机器人关节角度的维度
self.proprio_encoder = nn.Linear(state_dim, vision_feature_dim)
# 3. 核心策略网络 (Transformer)
# 输入维度是融合后的特征维度
input_dim = vision_feature_dim * 2 # 假设一个摄像头 + 关节角度
self.transformer = nn.Transformer(
d_model=input_dim,
nhead=8,
num_encoder_layers=num_encoder_layers,
num_decoder_layers=num_decoder_layers,
dim_feedforward=1024
)
# 输出层,将 Transformer 输出映射到动作块
self.action_head = nn.Linear(input_dim, action_dim * chunk_size)
# 4. CVAE 模块 (用于训练)
# CVAE 编码器
self.cvae_encoder = nn.Sequential(
nn.Linear(input_dim + action_dim * chunk_size, 256),
nn.ReLU(),
nn.Linear(256, latent_dim * 2) # 输出均值和对数方差
)
# 将潜变量 z 映射到 Transformer 输入维度
self.latent_proj = nn.Linear(latent_dim, input_dim)
def forward(self, image, qpos, actions=None, is_training=False):
# 提取视觉特征
vision_features = self.vision_encoder(image) # (batch, 512)
# 提取本体感觉特征
proprio_features = self.proprio_encoder(qpos) # (batch, 512)
# 融合特征
state_features = torch.cat([vision_features, proprio_features], dim=1)
# Transformer 需要 (seq_len, batch, dim) 格式
transformer_input = state_features.unsqueeze(0)
if is_training:
# --- 训练流程 ---
# 1. 使用 CVAE 编码器获取潜变量分布
flat_actions = actions.view(actions.shape[0], -1)
encoder_input = torch.cat([state_features, flat_actions], dim=1)
mu, logvar = self.cvae_encoder(encoder_input).chunk(2, dim=1)
# 2. 从分布中采样 z (重参数化技巧)
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
z = mu + eps * std
# 3. KL 散度损失
prior = Normal(torch.zeros_like(mu), torch.ones_like(std))
posterior = Normal(mu, std)
kl_loss = kl_divergence(posterior, prior).mean()
# 4. 将 z 作为条件输入到 Transformer
latent_cond = self.latent_proj(z).unsqueeze(0)
transformer_input = transformer_input + latent_cond
else:
# --- 推理流程 ---
# 直接从先验分布中采样 z
z = torch.randn(state_features.shape[0], self.latent_dim).to(state_features.device)
kl_loss = 0 # 推理时无 KL 损失
latent_cond = self.latent_proj(z).unsqueeze(0)
transformer_input = transformer_input + latent_cond
# Transformer 推理
# 在实际实现中,解码器的输入(tgt)需要query_pos embeddings
# 这里简化为直接处理
transformer_output = self.transformer(transformer_input, transformer_input) # 简化处理
# 预测动作块
action_preds_flat = self.action_head(transformer_output.squeeze(0))
action_preds = action_preds_flat.view(-1, self.chunk_size, actions.shape[-1] if actions is not None else -1)
return action_preds, kl_loss
2. 官方库的 Pipeline 调用示例
ACT 模型没有像 Hugging Face 那样的标准化 Pipeline 库。要使用它,最好的方式是访问其官方 GitHub 仓库,并遵循作者提供的指南。以下是根据其官方代码 imitate_episodes.py 简化后的推理调用流程概念:
import torch
import numpy as np
# 假设已从官方仓库导入了模型定义和辅助函数
# from act.model import ACTPolicy
# from act.utils import get_norm_stats
def run_inference_with_act(camera_images, robot_qpos, model_checkpoint_path):
"""
一个调用预训练 ACT 模型的概念性函数
"""
# 1. 设置设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 2. 加载模型配置和归一化统计数据
# 模仿学习中,对数据进行归一化至关重要
# checkpoint = torch.load(model_checkpoint_path, map_location=device)
# config = checkpoint['config']
# stats = checkpoint['stats']
# qpos_mean, qpos_std = stats['qpos_mean'], stats['qpos_std']
# action_mean, action_std = stats['action_mean'], stats['action_std']
# 3. 初始化策略网络
# policy = ACTPolicy(config)
# policy.load_state_dict(checkpoint['model_state_dict'])
# policy.to(device)
# policy.eval()
print("模型加载成功!")
# 4. 准备输入数据 (单个时间步)
# a. 对机器人关节角度进行归一化
# normalized_qpos = (robot_qpos - qpos_mean) / qpos_std
# qpos_tensor = torch.from_numpy(normalized_qpos).float().unsqueeze(0).to(device)
# b. 对图像进行预处理 (e.g., resize, normalize)
# image_tensor = preprocess_images(camera_images).unsqueeze(0).to(device)
# 5. 执行前向传播,获取动作预测
with torch.no_grad():
# action_chunk_prediction = policy(qpos_tensor, image_tensor)
pass # 伪代码,实际调用 policy.forward()
# 6. 反归一化得到真实世界的动作指令
# action_chunk_normalized = action_chunk_prediction.cpu().numpy().squeeze()
# predicted_actions = action_chunk_normalized * action_std + action_mean
# 在实际应用中,还需要实现 Temporal Ensembling
# 这里只返回了第一个预测的动作
# first_action = predicted_actions[0]
# print(f"预测出的下一步动作: {first_action}")
# return first_action
# 使用示例
# if __name__ == '__main__':
# # 假设你已经有了摄像头图像和机器人状态
# # mock_images = [np.random.rand(480, 640, 3) for _ in range(2)] # 2个摄像头
# # mock_qpos = np.random.rand(14) # 14个关节
# # model_path = "path/to/your/policy_best.ckpt"
#
# # next_action = run_inference_with_act(mock_images, mock_qpos, model_path)
要实际运行,请访问官方项目页面:Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware 并克隆其代码仓库。
八、总结
ACT 模型与 ALOHA 硬件系统的结合,是机器人学领域中一次教科书式的“软硬协同”创新。它有力地证明了,通过先进的算法设计,我们可以在成本可控的硬件平台上,实现过去只有在昂贵系统中才能见到的高精度、高动态性的双臂灵巧操作。
其核心贡献可以总结为:
-
democratization(民主化):通过 ALOHA 大幅降低了研究门槛,让更多人能参与到灵巧操作的研究中。
-
算法创新:ACT 提出的“动作分块”和“时序集成”有效缓解了模仿学习中的核心痛点——误差累积,而 CVAE 的引入则优雅地处理了人类演示的多样性。
-
范式引领:它所代表的“以智取胜”的设计哲学——即利用更智能的算法来最大化廉价硬件的潜力——为未来机器人系统的发展提供了宝贵的思路。
尽管它仍然面临泛化性等挑战,但 ACT 无疑为我们描绘了一幅激动人心的未来图景:灵巧、智能且价格亲民的机器人助手,正在从遥远的实验室构想,一步步走向我们的真实世界。
更多推荐
所有评论(0)