VLA:视觉-语言-动作
把"看、听、动"三条通路合为一体。这就是具身智能的终局形态——让机器人看着场景、听懂指令、自主完成动作序列。
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条)对策略质量的影响,产出实验报告
上一阶段:← 机器人控制与仿真 | 返回首页