VLA:视觉-语言-动作

把"看、听、动"三条通路合为一体。这就是具身智能的终局形态——让机器人看着场景、听懂指令、自主完成动作序列。

4-6 周
5 个章节
6 个代码示例
4 个验收实验

本阶段目录

  1. 行为克隆:示教即编程
  2. ACT:一次预测未来多步
  3. Diffusion Policy:处理多模态
  4. 遥操作数据采集
  5. VLA端到端:RT-2路线
  6. 具身智能基础模型前沿
  7. 真机部署实战

1. 行为克隆:示教即编程

对照已有知识

示教编程你用了多年——手动引导机器人做一遍,它记住路径回放。行为克隆是它的AI版本:网络不仅记忆,还能泛化到未见过的场景。

人类遥控机器人完成任务→记录(图像,关节)对→训练网络从图像预测动作。

class BCPolicy(nn.Module):
    """图像+本体感知 → 关节动作"""
    def __init__(self):
        super().__init__()
        self.vision = nn.Sequential(  # 简化CNN
            nn.Conv2d(3,32,3,2), nn.ReLU(),
            nn.Conv2d(32,64,3,2), nn.ReLU(),
            nn.AdaptiveAvgPool2d((1,1)), nn.Flatten()
        )
        self.proprio = nn.Linear(14, 64)  # 7关节角度+7速度
        self.head = nn.Sequential(
            nn.Linear(128+64,256), nn.ReLU(),
            nn.Linear(256,7)  # 7维关节动作
        )
    def forward(self, img, prop):
        return self.head(torch.cat([self.vision(img), self.proprio(prop)], -1))

BC的致命缺陷

分布偏移:训练时见过的轨迹都是"好轨迹",但推理时一旦偏离,小误差就会滚雪球。因为BC从未见过偏离后的状态,无法纠正。这就是为什么单纯BC通常不够。

2. ACT:一次预测未来多步

ACT (Action Chunking Transformer) 不预测单步动作,而是一次预测未来K步的动作序列(称为"动作块"),然后执行前几步后重新预测。这大幅减少了累积误差。

# ACT核心结构
class ACT(nn.Module):
    def __init__(self, chunk_size=20, d_model=256):
        super().__init__()
        self.encoder = nn.TransformerEncoder(...)  # 编码观测
        self.decoder = nn.TransformerDecoder(...)  # 自回归生成动作
        self.query = nn.Parameter(torch.randn(chunk_size, d_model))
    def forward(self, obs):
        mem = self.encoder(obs); return self.decoder(self.query, mem)
🔧 工程直觉:ACT就像给你未来20个时间步的控制量一起优化。你先执行前5步,利用新的观测重新预测。这种"滚动时域"策略让系统对环境变化和自身误差都有更强的鲁棒性。

3. Diffusion Policy:处理多模态

同一张图片,你可以抓杯子的把手,也可以抓杯身——两者都是正确的。BC用MSE会学出均值(无效动作),而Diffusion Policy学习整个动作分布 $p(a|s)$,自然地处理了多模态问题。

$a_t \sim p_\theta(a | s)$ —— 从学习到的条件分布中采样
class DiffusionPolicy(nn.Module):
    def __init__(self, n_steps=100):
        super().__init__()
        self.noise_net = UNet1D(...)  # 从噪声动作预测噪声
        self.betas = self._cosine_schedule(n_steps)  # 噪声调度

    def sample(self, obs):
        """从纯噪声逐步去噪,生成动作"""
        x = torch.randn(obs.shape[0], horizon, act_dim)
        for t in reversed(range(self.n_steps)):
            noise_pred = self.noise_net(x, obs, t)
            x = self._denoise_step(x, noise_pred, t)  # 去噪一步
        return x

4. 遥操作数据采集

公开数据集覆盖的任务有限。你必须自己采数据。

方案成本精度适用
键盘控制末端0元2D推送、简单抓取
SpaceMouse 3D鼠标~500元3D操作入门
ALOHA 双臂遥操作~2万元双臂精细操作
VR手柄 + IK映射~3000元中高通用3D操作
# 数据记录伪代码
class DemoRecorder:
    def record(self, task):
        obs = env.reset()
        while not done:
            action = self.get_input()  # 键盘/SpaceMouse/VR
            next_obs, _, done = env.step(action)
            self.buffer.append((obs, action, next_obs))
            obs = next_obs
        np.savez_compressed(f'{task}_demo.npz', **buffer)

5. VLA端到端:RT-2路线

RT-2 核心思路

用大规模图文数据预训练VLM→把动作离散化为文本token→用机器人数据微调→输入图像+指令→输出动作序列。一个模型同时"看懂"和"动手"。

图像 + "pick up the red apple" → VLM → "Δx=+3 Δy=-2 Δz=+1 grip=close" → 反离散化 → 连续动作
def discretize(action, bins=256):
    """连续动作→离散token"""
    norm = (action - lo)/(hi - lo)
    return int(np.clip(norm*bins, 0,bins-1))

# 7维动作 × 256 bins = 7个vocab=256的"词"
# VLM生成这7个token → 反离散化 → 机器人执行

验收实验

  • 键盘遥操作采集50条"推送方块"演示,训练BC,成功率 > 60%
  • 用ACT在仿真Franka上完成方块堆叠,3块成功率 > 50%
  • 对比BC和Diffusion Policy在"插入"任务上的成功率差异
  • 分析演示数量(10/50/200条)对策略质量的影响,产出实验报告

上一阶段:← 机器人控制与仿真  |  返回首页

拓展资源:VLA与模仿学习

GitHub 仓库

视频

必读论文

具身智能基础模型:2024-2025 前沿

这个领域发展极快

2024-2025年,具身智能基础模型呈现爆发式增长。以下是面试和工作中必须了解的模型:

模型机构核心贡献关键思想
RT-2Google DeepMindVLM→动作token大规模图文预训练+机器人微调,首次展示VLA的规模化可行性
OctoUC Berkeley/Stanford/CMU开源通用机器人模型Transformer-based,跨机器人、跨任务、跨场景泛化
π₀ (Pi Zero)Physical Intelligence通用机器人基础模型从互联网数据和机器人数据联合训练,处理各种操作任务
GROOTNVIDIA人形机器人基础模型多模态(语言+视频+动作),从人类演示直接学习
RDT-1B清华1B参数扩散操作模型最大规模的扩散策略,在双臂操作上表现优异
# 使用 Octo 进行零样本机器人控制
# Octo 是一个预训练的通用机器人策略模型
# 输入:图像 + 任务描述 → 输出:动作

from octo import OctoModel
model = OctoModel.from_pretrained("octo-small")

# 给定一张桌面图片和自然语言指令
observation = {"image_primary": img, "timestep_pad_mask": mask}
task = model.create_tasks(texts=["pick up the red block"])

# 模型直接输出机器人动作
action = model.sample_actions(observation, task, rng=...)
🔧 转行者建议:不要试图从零训练 VLA 模型(那需要数百万美元的计算资源)。学习使用这些预训练模型——理解它们的局限性,知道如何微调,知道何时需要自己采集领域数据。

真机部署:从仿真到实物

真机部署的隐藏成本

仿真中 90% 成功率 → 真机上可能不到 50%。这不是你的模型有问题,而是真实世界有太多未知:延迟、标定误差、柔性、摩擦变化、传感器死区。你需要学会诊断和修复这些问题。

部署检查清单

类别检查项常见问题
通信ROS话题延迟、带宽图像传输延迟 > 100ms → 控制失稳
标定手眼标定、相机内参5mm标定误差 → 抓取失败率翻倍
控制频率策略推理速度Diffusion Policy 推理可能 > 500ms
安全关节限位、力矩限制RL策略可能产生超限指令
初始化每次实验的起始条件物体位置微小变化导致策略完全失效

调试策略

# 真机调试的口袋方法
def debug_deployment(policy, env, n_trials=10):
    failures = {'collision': 0, 'timeout': 0, 'wrong_action': 0,
                'perception': 0, 'undetected': 0}
    for i in range(n_trials):
        obs = env.reset()
        while not done:
            action = policy(obs)
            obs, reward, done, info = env.step(action)
            if info['collision']: failures['collision'] += 1
        # 分类失败原因
        categorize_failure(failures)
    return failures

# 经验法则:
# collision >30% → 加力/力矩限幅
# timeout >40% → 检查策略探索是否不足
# undetected >20% → 检查感知模块(照明/背景)

真机部署经验