在机器人技术的前沿,让机器拥有一双像人手一样灵巧的臂膀,能够完成诸如打开瓶盖、系鞋带、使用工具等精细任务,一直是科学家们追求的圣杯。然而,通往这一目标的道路上长期矗立着一座难以逾越的大山——高昂的成本。动辄数十万美金的工业级机械臂和传感器,将无数研究者和潜在应用拒之门外。

今天,我们将要深入探讨的 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 系统在多个领域展现出巨大的应用潜力:

  • 家庭服务:整理衣物、准备简餐(如打开调味罐、涂抹果酱)、整理桌面。

  • 轻量级制造与装配:在生产线上完成插入电池、连接电缆、使用螺丝刀等精细任务。

  • 实验室自动化:操作移液管、开关仪器、处理样本,将科研人员从重复性劳动中解放出来。

  • 远程医疗与康复训练:作为低成本的训练平台,模拟手术操作或辅助病人进行康复训练。

优点
  1. 极致的性价比:将实现复杂双臂操作的硬件成本降低了一个数量级,极大地推动了相关研究和应用的普及。

  2. 卓越的性能:在多个具有挑战性的双臂协同任务上取得了非常高的成功率,证明了算法在低成本硬件上的有效性。

  3. 强大的鲁棒性:通过动作分块和 CVAE,有效克服了模仿学习中的误差累积和数据非马尔可夫性问题。

  4. 高效的实时推理:模型单步推理速度快,能够满足闭环控制的实时性要求。

缺点
  1. 依赖高质量演示:作为模仿学习方法,其性能上限受限于演示数据的质量和数量。无法自己探索出比人类演示者更优的策略。

  2. 硬件物理限制:低成本机械臂在负载、刚性和长期耐用性上无法与工业级机械臂相比,不适用于高负载或高强度工业场景。

  3. 泛化能力有待提升:对于在训练中未见过的物体或环境变化,模型的泛化能力仍是挑战。

三、模型结构详解

ACT 的核心是一个基于 Transformer 的策略网络,它巧妙地融合了视觉信息和机器人自身的状态信息,来预测未来的动作序列。

模型总体架构 (Mermaid 图)

各模块详解
  1. 感知模块 (Vision Backbone)

    • 输入:来自多个摄像头(例如,一个顶视摄像头和一个腕部摄像头)的实时图像流。

    • 结构:通常采用一个预训练好的卷积神经网络(CNN),如 ResNet-18。为了效率,这个网络的权重在训练过程中通常被冻结。

    • 功能:该模块负责从原始像素中提取出高级的、有意义的视觉特征,例如物体的形状、位置、姿态等。每个摄像头的图像都经过独立的 CNN 处理,然后将提取出的特征图展平并拼接在一起,形成一个综合的视觉特征向量。

  2. 本体感觉编码器 (Proprioception Encoder)

    • 输入:机器人所有关节的当前角度或位置信息,这被称为“本体感觉”。

    • 结构:一个简单的多层感知机(MLP)。

    • 功能:将高维的关节角度向量编码成一个低维的特征向量,以便与视觉特征进行融合。

  3. 核心策略网络 (ACT Policy - Transformer)

    • 输入:融合后的视觉特征和本体感觉特征。在训练时,还会接收来自 CVAE 的条件潜变量 z

    • 结构:一个标准的 Transformer 编码器-解码器 架构。它强大的自注意力(Self-Attention)机制是其成功的关键。

    • 功能:这是模型的大脑。它接收描述当前“世界状态”的特征向量,通过自注意力机制分析不同特征之间的关联和重要性,最终解码输出一个动作块(Action Chunk),即未来 k 个时间步的关节目标位置序列。

  4. CVAE 模块 (用于训练)

    • 结构:包含一个编码器和一个解码器(此处的解码器与 ACT 的 Transformer 解码器共享)。编码器接收当前状态和人类演示的真实动作块,并输出一个高斯分布的参数(均值和方差)。

    • 功能:该模块仅在训练阶段使用。它通过学习将人类演示动作块压缩到一个低维的潜空间中,捕捉了演示行为的内在“风格”或“意图”。在训练时,从这个分布中采样一个潜变量 z 作为条件输入到 Transformer 中,迫使模型学会在给定相同初始状态下,根据不同的 z 生成不同但都合理的动作序列。这极大地增强了模型的鲁棒性。

四、模型工作流程

让我们一步步跟随数据流,看看 ACT 模型是如何思考和行动的。

  1. 数据输入与感知:在每一个控制周期(例如每秒 50 次),系统首先从多个摄像头获取实时图像,并从机械臂的电机编码器读取所有关节的当前角度。

  2. 特征提取与融合:图像被送入 CNN 模块,转化为包含场景信息的视觉特征向量。关节角度被送入 MLP,转化为代表机器人自身姿态的本体感觉特征向量。随后,这两个向量被拼接(Concatenate)成一个单一的、全面的状态向量

  3. 动作块预测:这个融合后的状态向量被作为输入,喂给 ACT 的 Transformer 网络。Transformer 内部的自注意力层会计算输入特征中各个元素的重要性权重,例如,当任务是“拿起杯子”时,它会更加关注代表“杯子位置”和“夹爪状态”的特征。经过一系列计算,Transformer 的解码器最终输出一个预测的动作序列,例如,接下来 15 个时间步的关节目标角度 [a_1, a_2, ..., a_15]

  4. 平滑处理与执行:这一步是时序集成(Temporal Ensembling)发挥作用的地方。假设在上一个时间步,模型预测了动作块 A_t,当前时间步预测了 A_{t+1}。这两个块在时间上是重叠的。为了决定下一步到底执行哪个动作,系统会对重叠部分的预测进行加权平均。例如,将 A_t 的第二个动作和 A_{t+1} 的第一个动作进行平均,得到一个更平滑的指令。最终,只有这个平滑处理后的第一个动作 a_1_smoothed 会被发送给机械臂的控制器去执行。

  5. 闭环循环:机械臂执行完 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))

我们来逐一解析这个公式:

  1. 重构项: 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 范数来计算这个损失:

      \mathcal{L}\_{recon} = || a - \\hat{a} ||\_1
  2. 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 硬件系统的结合,是机器人学领域中一次教科书式的“软硬协同”创新。它有力地证明了,通过先进的算法设计,我们可以在成本可控的硬件平台上,实现过去只有在昂贵系统中才能见到的高精度、高动态性的双臂灵巧操作。

其核心贡献可以总结为:

  1. democratization(民主化):通过 ALOHA 大幅降低了研究门槛,让更多人能参与到灵巧操作的研究中。

  2. 算法创新:ACT 提出的“动作分块”和“时序集成”有效缓解了模仿学习中的核心痛点——误差累积,而 CVAE 的引入则优雅地处理了人类演示的多样性。

  3. 范式引领:它所代表的“以智取胜”的设计哲学——即利用更智能的算法来最大化廉价硬件的潜力——为未来机器人系统的发展提供了宝贵的思路。

尽管它仍然面临泛化性等挑战,但 ACT 无疑为我们描绘了一幅激动人心的未来图景:灵巧、智能且价格亲民的机器人助手,正在从遥远的实验室构想,一步步走向我们的真实世界。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐