最近在看Genesis这个仿真器,总结了一下机器人manipulation任务是怎么通过这个仿真器来完成模型训练的
> 本文介绍 Genesis 仿真框架中一个完整的机械臂抓取任务示例,涵盖特权强化学习(Privileged RL)→ 视觉行为克隆(Visual BC)→ 评估部署的端到端训练流程。
背景与动机
在机器人操作任务中,有一个经典矛盾:
强化学习训练速度快、效果好,但需要精确的状态信息(物体位置、末端位姿等),在真实环境中无法直接获取。
视觉策略更贴近真实部署,仅依赖摄像头图像,但直接用 RL 训练视觉策略极其困难。
该示例采用了业界流行的两阶段"教师-学生"框架来解决这一矛盾:
阶段一:在仿真中用特权状态信息训练教师(RL)
↓
阶段二:用教师的动作监督学生学习视觉策略(BC + DAgger)
任务设定
机器人:Franka Emika Panda 7 自由度机械臂
目标:将末端执行器(夹爪)精确对准桌面上随机摆放的红色长方体(位置和朝向均随机)
仿真器:Genesis,支持数千个并行环境的 GPU 加速仿真
感知方案:双目 RGB 相机(左右各一,64×64 分辨率)
阶段一:特权强化学习训练教师模型
环境设计
环境实现在 grasp_env.py 中,核心接口为标准 Gym 风格(reset / step / get_observations)。
观测空间(14 维):教师模型直接获取精确的数字状态,无需依赖感知:
动作空间(6 维):末端执行器的增量位姿(ΔX/Y/Z + Δroll/pitch/yaw),通过阻尼最小二乘逆运动学(DLS-IK)转化为关节角度指令,控制频率 100 Hz。
奖励函数 —— 关键点对齐奖励:
不直接用距离作奖励,而是在物体上均匀采样 7 个三维关键点(原点 + 6 个轴方向点),计算夹爪关键点与物体关键点的总距离,通过指数函数转为密集奖励:
$$r = e^{-\sum_{i=1}^{7} \|p_i^{finger} - p_i^{object}\|}$$
这样的设计同时约束了位置和朝向对齐,比单纯的欧氏距离更鲁棒。
随机化:每个 episode 重置时,物体随机放置在桌面 x∈[0.2, 0.6]、y∈[-0.25, 0.25] 的范围内,并随机偏转 ±45°,以增强策略的泛化能力。
PPO 训练
使用 rsl_rl 库的 OnPolicyRunner 驱动 PPO 算法,策略网络为三层 MLP([256, 256, 128])的 ActorCritic 结构:
并行环境数:2048
每步采集:24 步 × 2048 环境 = 49152 条数据
每次迭代:5 轮 mini-batch 更新
自适应学习率(基于 KL 散度调节,目标 KL = 0.01)
训练轮数:300 次迭代
python examples/manipulation/grasp_train.py --stage=rl --num_envs=2048 --max_iterations=300
阶段二:视觉行为克隆(BC + DAgger)
教师模型训练完成后,冻结其参数作为"专家策略",用来指导仅依赖视觉的学生模型学习。
学生模型架构
学生策略 Policy(实现于 behavior_cloning.py)的输入为双目 RGB 图像(6 通道,左右相机各 3 通道):
左图 (3×64×64) ──┐
├── 共享 CNN Encoder ──┐
右图 (3×64×64) ──┘ ├── 特征融合 (Linear + ReLU)
│ ↓
├── ActionHead (MLP + 末端位姿) → 6维动作输出
└── PoseHead (MLP) → 物体位姿(辅助任务)
共享编码器采用三层卷积网络(8→16→32 通道)+ 自适应平均池化(4×4),提取左右图像特征后拼接融合。
辅助任务设计:在动作预测之外,额外增加一个物体位姿预测头,监督编码器学习语义特征,提升视觉表征质量。
DAgger 策略混合执行
行为克隆的最大问题是分布偏移(distribution shift):学生策略在训练数据之外的状态会犯错,导致误差不断积累。
本示例使用简化版 DAgger(Dataset Aggregation)来缓解这一问题:
action_diff = torch.norm(student_action - teacher_action, dim=-1)
condition = (action_diff < 1.0).unsqueeze(-1).expand_as(student_action)
action = torch.where(condition, student_action, teacher_action)若学生动作与教师动作差距 < 1.0:执行学生自己的动作(让学生在自身分布上探索)
否则:回退为教师动作(防止策略进入危险状态)
联合损失训练
每次迭代先采集数据,再对经验缓冲区(FIFO,容量 1000)中的数据做监督训练:
$$\mathcal{L} = \underbrace{\mathcal{L}{MSE}(\hat{a}, a{teacher})}{\text{动作预测损失}} + \underbrace{\mathcal{L}{pos} + \mathcal{L}{quat}}{\text{位姿估计损失(辅助)}}$$
其中四元数损失使用 $1 - |\hat{q} \cdot q|$ 近似旋转距离,避免了四元数重归一化的复杂性。
python examples/manipulation/grasp_train.py --stage=bc --max_iterations=300
评估与可视化
grasp_eval.py 支持分别加载并可视化两种策略的推理效果,还可以录制视频:
# 评估 RL 教师策略
python examples/manipulation/grasp_eval.py --stage=rl
# 评估 BC 学生策略(视觉输入)
python examples/manipulation/grasp_eval.py --stage=bc
# 录制双目摄像头视频
python examples/manipulation/grasp_eval.py --stage=bc --record# 评估 RL 教师策略
python examples/manipulation/grasp_eval.py --stage=rl
# 评估 BC 学生策略(视觉输入)
python examples/manipulation/grasp_eval.py --stage=bc
# 录制双目摄像头视频
python examples/manipulation/grasp_eval.py --stage=bc --record评估时会自动切换为物理碰撞模式(box_collision=True,box_fixed=False),验证策略真正接触、抓取物体的能力,并在推理结束后执行一段预设的 grasp_and_lift_demo 展示抓取提升动作。
完整流程总览
Genesis 仿真环境(2048 并行)
↓
【Stage 1】PPO 强化学习
• 输入:14 维特权状态
• 网络:ActorCritic MLP (256-256-128)
• 奖励:关键点对齐 exp(-dist)
• 输出:6 维末端位姿增量
↓ 保存教师策略检查点
【Stage 2】行为克隆 + DAgger
• 输入:双目 RGB 图像 (6×64×64) + 末端位姿
• 网络:共享 CNN + 特征融合 + ActionHead + PoseHead
• 损失:动作 MSE + 位姿估计(辅助)
• 执行:DAgger 混合动作
↓
【Eval】可视化推理 + 视频录制
评论区