一、ACT框架全景:从模仿学习到行为克隆
大家好,我是你们的老朋友。今天咱们聊聊ACT框架——这个在具身智能领域里,我个人觉得最实用的工具箱之一。
先问个问题:你让机器人学一个新技能,比如倒水、叠衣服,你会怎么做?
传统做法是写死程序:关节角度、轨迹规划、力控参数……写出来能累死人,而且换个杯子就得重调。说白了,这条路走不通。
那换个思路呢?让机器人看人做一遍,然后自己学着做。这就是模仿学习(Imitation Learning)的核心思想。而ACT,就是模仿学习里一个非常高效的实现框架。
ACT = Action Chunking with Transformers
翻译过来就是:用Transformer把动作切成块,然后学。
1.1 模仿学习 vs 行为克隆
这两个概念经常被混用,我简单区分一下:
- 模仿学习:大概念。只要机器人通过观察人类示范来学习,都算。包括逆强化学习、GAIL等。
- 行为克隆:模仿学习的一种具体方法。直接把“状态→动作”的映射当成监督学习来做。你给我数据,我学一个神经网络,完事。
ACT本质上属于行为克隆。但它不是简单的“看一帧学一帧”,而是把连续几秒的动作打包成一个“动作块”(Action Chunk),一次性预测出来。
我的经验:早期做机器人抓取时,我用的是逐帧预测的BC方法。结果机器人动作抖得像帕金森。后来换成ACT的动作块策略,一下子就稳了。为什么?因为逐帧预测没有时序约束,而动作块强制了动作的连贯性。
1.2 ACT在具身智能中的定位
具身智能这个领域,说白了就是让机器人能“看懂世界、动起手来”。ACT解决的是其中最关键的一环:从视觉输入到动作输出的映射。
我画了一张图,帮你理解ACT在整个流程中的位置:
你看,ACT夹在感知和执行中间。它不负责图像识别,也不负责电机控制。它只做一件事:把感知到的信息,翻译成机器人能执行的动作序列。
1.3 核心组件概览
ACT框架由三个核心组件构成:编码器、解码器、动作头。我一个个说。
1.3.1 编码器(Encoder)
编码器的任务:把视觉信息压缩成特征向量。
具体来说,输入是两张图片(主摄像头视角 + 腕部摄像头视角),经过ResNet或ViT提取特征,然后通过一个Transformer编码器做时序融合。
关键点:编码器输出的不是单帧特征,而是整个观察序列的上下文特征。这保证了机器人能理解“物体正在移动”这种动态信息。
我曾经犯过一个错误:只用单帧图像做编码。结果机器人看到杯子就抓,但杯子被移动后它完全不知道。加上时序编码后,它终于能跟踪物体运动了。
1.3.2 解码器(Decoder)
解码器是ACT的“大脑”。它接收编码器输出的特征,以及一个“动作查询”(Action Query),然后输出动作块。
这里有个设计细节很有意思:动作查询是可学习的。说白了,就是让模型自己学会“我要预测未来几秒的动作”,而不是硬编码。
# 伪代码:ACT解码器核心逻辑
class ACTDecoder(nn.Module):
def __init__(self, num_queries=100, action_dim=7):
super().__init__()
# 可学习的动作查询
self.action_query = nn.Parameter(torch.randn(num_queries, action_dim))
self.transformer = nn.TransformerDecoder(...)
def forward(self, encoder_features):
# 用动作查询去解码特征
action_chunk = self.transformer(self.action_query, encoder_features)
return action_chunk # 形状: [batch, 100, 7]
我的建议:num_queries这个参数很关键。设太小,动作不够平滑;设太大,计算量暴增。我一般从50开始试,根据任务复杂度调整。精细操作(如穿针)用100,粗放操作(如搬运)用30就够了。
1.3.3 动作头(Action Head)
动作头是最后一层,把解码器的输出映射到实际的机器人控制信号。
常见的动作头有两种:
| 类型 | 输出格式 | 适用场景 | 我的评价 |
|---|---|---|---|
| 绝对位置控制 | 7维向量 (x,y,z,roll,pitch,yaw,gripper) | 桌面抓取、固定工作台 | 简单直接,但泛化性差 |
| 相对位置控制 | 7维增量向量 (Δx,Δy,Δz,Δroll,Δpitch,Δyaw,Δgripper) | 移动操作、动态环境 | 更鲁棒,我推荐用这个 |
| 关节角度控制 | N维向量 (每个关节的角度) | 高精度装配、力控场景 | 精度最高,但需要逆运动学 |
避坑指南:我曾经在项目里直接用绝对位置控制,结果机器人底座稍微挪动了几厘米,所有动作全废了。后来换成相对位置控制,机器人学会了“相对于当前状态移动多少”,鲁棒性提升了一大截。
1.4 三个组件如何协同工作
我再用一个具体的例子串起来:
- 输入:机器人看到桌上有杯子(主摄像头图)和夹爪靠近杯子(腕部摄像头图)。
- 编码器:把这两张图+过去几帧的信息,压缩成一个特征向量。
- 解码器:拿着这个特征向量,结合动作查询,生成未来2秒内100个动作点。
- 动作头:把这100个动作点转换成电机能理解的相对位置增量。
- 执行:机器人按顺序执行这100个动作,完成抓取。
整个过程一气呵成。你想想看,如果不用ACT,你得写多少行代码来处理轨迹规划、避障、平滑?
1.5 小结
ACT框架的核心思想其实就一句话:把动作切成块,用Transformer一次性预测。
编码器看世界,解码器想动作,动作头去执行。三个组件各司其职,配合默契。
嗯,这一章的内容就到这里。下一章咱们深入编码器的细节,聊聊怎么把图像变成特征向量。到时候我会分享一些我在数据增强和特征对齐上的踩坑经验。
一句话记住ACT:它不是让机器人一帧一帧地学,而是让它学会“一口气做完一套动作”。这个思路,后来被扩散策略(Diffusion Policy)等新方法继承和发展了。