史上最全Mobile ALOHA项目: 低成本双臂移动操作机器人论文和代码实现分析和讲解
首先,我的系列原创教程Unleashing Robotics: Mastering Quaternion Kinematics with Python - (原创系列教程)还在继续,今天先插个我特别感兴趣的论文的技术分析和讲解,这个项目也在中文互联网大火的了一段时间。
同样本篇文章禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱 fanzexuan135@163.com
教授的讲座,年初农历新年假期回老家闲来无事,在B站翻译并上传了Chelsea Finn最新的讲座,感兴趣的捧个场点个赞。
大火斯坦福服务机器人ALOHA团队教授Chelsea Finn MIT讲座-Robot Learning
正文开始:
1. 项目概览
Mobile ALOHA是一个低成本、模块化的双臂移动操作机器人系统,包含创新的硬件设计和端到端模仿学习算法。它的目标是实现家庭和办公场景中的自主机器人辅助,如整理房间、烹饪、清洁等。
1.1 硬件系统
- 双臂机器人ALOHA固定在自主移动底座上,配有机载电源与计算单元,实现了完全自主的移动操作。
- 创新的全身遥操作方式:人直接背驱动机器人底座采集数据,直观高效。
- 模块化可拆卸的结构设计方便运输与维护。
- 整个系统造价约3.2万美元,远低于商用双臂移动机器人。
1.2 软件算法
- 端到端模仿学习:将静态双臂操作数据与少量新采集的移动双臂操作数据协同训练,大幅提升模仿学习性能。
- 该方法在ACT、Diffusion Policy、VINN等多种SOTA模仿学习算法上都取得了显著效果提升,展现了很好的普适性。
- 在真实家庭和办公场景中执行了一系列复杂的双臂移动操作任务,如擦拭、做饭、开关橱柜、乘电梯等,展现出该系统的实用性。
2. 硬件系统设计
2.1 双臂机器人本体
项目采用了ALOHA双臂机器人作为操作本体。ALOHA每个手臂有6个自由度,末端带一个并联抓手。手臂采用了模块化、线缆驱动的设计,运动灵活且易于维护。两个手臂呈现人体手臂的自然姿态,有利于操作和扩大工作空间。
2.2 移动底座
ALOHA安装在一个全向轮式移动底座上,底盘采用了直径较大的Mecanum轮,机动性好,同时可以在底部安装配重提高稳定性。整个移动机器人系统可以在室内环境灵活移动。
2.3 机载供电与计算
为实现完全的自主作业,Mobile ALOHA搭载了大容量电池组和高性能工控机。电池组可提供数小时的续航能力。工控机配备英伟达3070Ti显卡,可以运行实时的视觉感知、运动规划、模仿学习等算法。
2.4 全身遥操作界面
项目设计了一种创新的全身遥操作方式来采集示教数据。操作者背部与机器人底座直接相连,通过前后左右移动自己的身体,就可以驱动机器人底座运动。同时,操作者的双手分别控制ALOHA两个机械臂的运动。这种方式简单直观,且提供了一定的力反馈。相比游戏手柄等其他遥操作界面,该方法可以实现手臂、底座的协同控制,获得更自然流畅的示教数据。
3. 端到端模仿学习
3.1 问题建模
在Mobile ALOHA项目中,模仿学习的目标是让机器人通过模仿人类专家的示教,学会执行各种双臂移动操作任务。这可以建模为一个马尔可夫决策过程(MDP):
- 状态空间 S \mathcal{S} S:机器人关节角度、速度等本体感知和RGB图像、深度图等视觉观测。
- 动作空间 A \mathcal{A} A:14维的机械臂关节角度和2维的底座线速度、角速度。
- 转移函数 P \mathcal{P} P:机器人动力学模型和环境动力学模型,隐式地建模了状态之间的因果关系。
- 奖励函数 R \mathcal{R} R:人类专家的示教轨迹可以视作隐式地指定了奖励函数,即认为专家轨迹在当前奖励函数下是最优的。
模仿学习的优化目标是学习一个策略 π θ ( a t ∣ s t ) \pi_{\theta}(\mathbf{a}_t|\mathbf{s}_t) πθ(at∣st)去拟合专家策略 π ∗ ( a t ∣ s t ) \pi^{*}(\mathbf{a}_t|\mathbf{s}_t) π∗(at∣st)。用极大似然估计来刻画这一目标:
max θ E ( s t , a t ) ∼ π ∗ [ log π θ ( a t ∣ s t ) ] \max_{\theta} \mathbb{E}_{(\mathbf{s}_{t},\mathbf{a}_{t})\sim\pi^{*}} [\log \pi_{\theta}(\mathbf{a}_t|\mathbf{s}_t)] θmaxE(st,at)∼π∗[logπθ(at∣st)]
其中 ( s t , a t ) (\mathbf{s}_t,\mathbf{a}_t) (st,at)为专家轨迹的状态-动作对。为了解决这一优化问题,需要设计合适的策略网络结构、损失函数和训练方法。项目尝试了多种SOTA模仿学习算法。
3.2 行为克隆(Behavior Cloning)
最简单的模仿学习方法是行为克隆,即用监督学习拟合专家的策略。策略网络以状态 s t \mathbf{s}_t st为输入,输出一个参数化的动作分布如高斯分布 π θ ( a t ∣ s t ) = N ( a t ∣ μ θ ( s t ) , σ θ 2 ( s t ) ) \pi_{\theta}(\mathbf{a}_t|\mathbf{s}_t)=\mathcal{N}(\mathbf{a}_t|\mu_{\theta}(\mathbf{s}_t),\,\sigma^{2}_{\theta}(\mathbf{s}_t)) πθ(at∣st)=N(at∣μθ(st),σθ2(st))。
用最大似然估计可以得到优化目标:
L ( θ ) = ∑ t ∥ μ θ ( s t ) − a t ∥ 2 \mathcal{L}(\theta)=\sum_{t}\Vert \mu_{\theta}(\mathbf{s}_t)-\mathbf{a}_{t} \Vert^{2} L(θ)=t∑∥μθ(st)−at∥2
即最小化策略网络输出的动作均值与专家动作之间的均方误差。
论文使用的CNNMLP策略网络就是这种思路,以ResNet18作为视觉Backbone提取图像特征,然后与机器人本体状态拼接,经过MLP输出预测的动作。网络可以端到端训练。
行为克隆的一个问题是难以处理长时间步的任务,因为小误差会随着时间步累积。一种改进是引入自回归机制,即在下一时刻的状态输入中加入上一时刻的动作输出,让网络考虑历史轨迹。
# CNNMLP策略网络定义
class CNNMLPPolicy(nn.Module):
def __init__(self, args_override):
super().__init__()
model, optimizer = build_CNNMLP_model_and_optimizer(args_override)
self.model = model # decoder
self.optimizer = optimizer
def __call__(self, qpos, image, actions=None, is_pad=None):
env_state = None # TODO
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
image = normalize(image)
if actions is not None: # training time
actions = actions[:, 0]
a_hat = self.model(qpos, image, env_state, actions)
mse = F.mse_loss(actions, a_hat)
loss_dict = dict()
loss_dict['mse'] = mse
loss_dict['loss'] = loss_dict['mse']
return loss_dict
else: # inference time
a_hat = self.model(qpos, image, env_state) # no action, sample from prior
return a_hat
3.3 GenerativeAdversarial Imitation Learning (GAIL)
GAIL将模仿学习问题转化为生成对抗学习,即训练一个生成器(策略网络)去生成与专家轨迹相似的状态-动作对,同时训练一个判别器去区分生成的轨迹和专家轨迹。
生成器 π θ \pi_{\theta} πθ以状态为输入,输出动作的概率分布。判别器 D ϕ D_{\phi} Dϕ以状态-动作对为输入,输出一个标量表示状态-动作对来自专家轨迹的概率。训练过程通过最小化如下的目标函数实现博弈:
min θ max ϕ E π θ [ log ( D ϕ ( s , a ) ) ] + E π ∗ [ log ( 1 − D ϕ ( s , a ) ) ] − λ H ( π θ ) \min_{\theta} \max_{\phi} \mathbb{E}_{\pi_{\theta}}[\log(D_{\phi}(\mathbf{s},\mathbf{a}))] + \mathbb{E}_{\pi^{*}}[\log(1-D_{\phi}(\mathbf{s},\mathbf{a}))] - \lambda H(\pi_{\theta}) θminϕmaxEπθ[log(Dϕ(s,a))]+Eπ∗[log(1−Dϕ(s,a))]−λH(πθ)
其中 H ( ⋅ ) H(\cdot) H(⋅)为策略的熵,是一个正则项。在实现时需要解决高维、连续动作空间的问题,通常采用某种形式的信任区域策略优化(TRPO)算法交替更新生成器和判别器。
GAIL利用了专家数据的隐式信息,不需要直接拟合动作,能更好处理多峰、高维动作分布。但是它需要与环境交互收集数据,针对Mobile ALOHA这样的实机环境代价较高。
# GAIL训练流程伪代码
Initialize generator pi_theta and discriminator D_phi
Initialize replay buffer B with expert trajectories
for i = 1, 2, ..., max_iter do:
# Generator update
Collect trajectories tau_i using pi_theta
Compute H(pi_theta)
G_loss = E(log(D_phi(s,a))) - lambda*H(pi_theta)
Update pi_theta via TRPO to minimize G_loss
Add tau_i to B
# Discriminator update
Sample state-action pairs (s, a) from B
Sample state-action pairs (s_e, a_e) from expert trajectories
Compute D_loss = - (E(log D(s_e,a_e)) + E(log(1-D(s,a))))
Update D_phi to minimize D_loss via SGD
end for
3.4 Soft Q Imitation Learning (SQIL)
SQIL结合了模仿学习和强化学习,它学习专家策略同时也能进行探索。具体来说,它将模仿学习问题转化为一个稀疏奖励的强化学习问题,即专家轨迹的每个状态-动作对都有+1奖励,其他为0。这避免了对奖励函数的人工设计。
SQIL用Soft Actor-Critic (SAC)算法来解这个RL问题。SAC学习两个Q函数 Q ϕ 1 , Q ϕ 2 Q_{\phi_1},Q_{\phi_2} Qϕ1,Qϕ2来评估策略,以及一个策略网络 π θ \pi_{\theta} πθ。训练目标是最大化期望奖励和策略熵的和:
J π ( θ ) = E s t , a t ∼ π θ [ r ( s t , a t ) + α H ( π θ ( ⋅ ∣ s t ) ) ] J_{\pi}(\theta)=\mathbb{E}_{\mathbf{s}_{t},\mathbf{a}_{t}\sim\pi_{\theta}}[r(\mathbf{s}_{t},\mathbf{a}_{t})+\alpha H(\pi_{\theta}(\cdot|\mathbf{s}_{t}))] Jπ(θ)=Est,at∼πθ[r(st,at)+αH(πθ(⋅∣st))]
而Q函数的训练目标是最小化Bellman误差:
J Q ( ϕ i ) = E s t , a t [ ( Q ϕ i ( s t , a t ) − ( r ( s t , a t ) + γ V ϕ ‾ ( s t + 1 ) ) ) 2 ] J_{Q}(\phi_i)=\mathbb{E}_{\mathbf{s}_{t},\mathbf{a}_{t}}[(Q_{\phi_i}(\mathbf{s}_{t},\mathbf{a}_{t})-(r(\mathbf{s}_{t},\mathbf{a}_{t})+\gamma V_{\overline{\phi}}(\mathbf{s}_{t+1})))^2] JQ(ϕi)=Est,at[(Qϕi(st,at)−(r(st,at)+γVϕ(st+1)))2]
其中值函数 V ϕ ‾ V_{\overline{\phi}} Vϕ定义为状态下两个Q函数的最小值再减去策略熵。策略、Q函数、值函数轮流优化直到收敛。SAC在连续控制任务上表现优异,结合专家数据后能进一步提升采样效率。
SQIL需要与环境交互,但它允许策略偏离专家数据分布进行探索,对环境动力学的建模更鲁棒。
3.5 Adversarial Contrastive Tuning (ACT)
ACT引入了对比学习的思想来解决分布偏移问题。它不直接拟合动作,而是学习一个隐空间,使得专家数据在隐空间聚集、非专家数据发散。
策略网络包含一个编码器 f θ e n c f_{\theta_{enc}} fθenc和一个解码器 π θ d e c \pi_{\theta_{dec}} πθdec。编码器将状态映射到隐空间 z t = f θ e n c ( s t ) \mathbf{z}_t=f_{\theta_{enc}}(\mathbf{s}_t) zt=fθe

最低0.47元/天 解锁文章
1865

被折叠的 条评论
为什么被折叠?



