基于RoboTwin评测平台的强化学习训练#
本文档给出在 RLinf 框架内启动与管理 Vision-Language-Action Models (VLAs) 训练任务的完整指南, 在 RoboTwin 环境中微调 VLA 模型以完成机器人操作。
主要目标是让模型具备以下能力:
视觉理解:处理来自机器人相机的 RGB 图像。
语言理解:理解自然语言的任务描述。
动作生成:产生精确的机器人动作(位置、旋转、夹爪控制)。
强化学习:结合环境反馈,使用 PPO 和 GRPO 优化策略。
RoboTwinEnv 环境介绍#
RoboTwinEnv 环境
Environment:RLinf 框架基于 RoboTwin 2.0 仿真环境提供了用于强化学习训练的 RoboTwinEnv 环境。
Task:控制机械臂完成多种操作任务。RLinf RoboTwinEnv 目前支持以下 46 个任务 ,用户可以根据需要选择任务进行训练。
放置类任务(Placement Tasks)
adjust_bottle:使用正确的手臂将桌上的瓶子拾起并保持瓶口朝上place_a2b_left:使用合适的手臂将物体 A 放置在物体 B 的左侧place_a2b_right:使用合适的手臂将物体 A 放置在物体 B 的右侧place_bread_basket:若桌上有一个面包,用单臂抓取并放入篮子;若有两个面包,用双臂同时抓取并放入篮子place_bread_skillet:用单臂抓取桌上的面包并放入平底锅place_burger_fries:使用双臂抓取汉堡和薯条并放置到托盘上place_can_basket:一只手臂将易拉罐放入篮子,另一只手臂提起篮子place_cans_plasticbox:使用双臂将易拉罐抓取并放入塑料箱place_container_plate:将容器放置到盘子上place_empty_cup:使用单臂将空杯放置到杯垫上place_mouse_pad:抓取鼠标并放置到彩色垫子上place_object_basket:一只手臂将目标物体放入篮子,另一只手臂抓起篮子并向外移动place_object_stand:使用合适的手臂将物体放置到支架上place_phone_stand:抓取手机并放置到手机支架上place_shoe:使用单臂从桌上抓取鞋子并放到垫子上place_dual_shoes:使用双臂抓取两只鞋并放入鞋盒,且鞋头朝左
抓取类任务(Pick Tasks)
pick_dual_bottles:用双臂分别抓取两个瓶子pick_diverse_bottles:用双臂分别抓取两个不同的瓶子move_can_pot:用单臂抓取易拉罐并移动到锅旁move_pillbottle_pad:用单臂抓取药瓶并放到垫子上move_playingcard_away:抓取扑克牌并将其朝远离桌面的方向移动move_stapler_pad:使用合适的手臂将订书机移动到彩色垫子上grab_roller:使用双臂抓取桌上的滚轴lift_pot:使用双臂抬起锅put_bottles_dustbin:抓取瓶子并放入桌子左侧的垃圾桶
堆叠类任务(Stacking Tasks)
stack_blocks_two:将绿色积木堆叠在红色积木上stack_blocks_three:将蓝色积木叠在绿色积木上,再将绿色积木叠在红色积木上stack_bowls_two:将两个碗上下堆叠stack_bowls_three:将三个碗上下堆叠
排序类任务(Ranking Tasks)
blocks_ranking_rgb:按红、绿、蓝顺序从左到右排列积木blocks_ranking_size:将积木从左到右按由大到小排列
使用工具类任务(Tool Use & Interaction Tasks)
click_alarmclock:按下闹钟顶部中央按钮click_bell:按下铃铛顶部中央beat_block_hammer:抓起锤子敲击积木open_microwave:用单臂打开微波炉press_stapler:用单臂按压订书机stamp_seal:抓取印章并盖在指定颜色的垫子上turn_switch:用机械臂拨动开关
交接类任务(Handover Tasks) -
handover_block:左臂抓取红色积木并交接给右臂,随后放置到蓝色垫子上 -handover_mic:单臂抓取麦克风并交接给另一只手臂倾倒、投掷与摇晃任务(Pouring, Dumping & Shaking Tasks)
shake_bottle:使用合适的手臂摇晃瓶子shake_bottle_horizontally:使用合适的手臂水平摇晃瓶子dump_bin_bigbin:抓取小箱并将其中物体倒入大箱中
悬挂与特殊任务(Hanging & Special Tasks)
hanging_mug:左臂抓取杯子并调整姿态,右臂再次抓取并将杯子挂到挂架上scan_object:一只手臂持扫描器,另一只手臂持物体并完成扫描rotate_qrcode:抓取二维码板并旋转,使二维码朝向机器人
备注
目前有四个任务尚未支持,分别是
place_fan,open_laptop,place_object_scale和put_object_cabinet。另外,dense reward 奖励函数还在开发中,后续将逐步扩展到所有任务。Observation:RLinf RoboTwinEnv 环境返回的观测信息是一个字典(dict),包含以下字段:
images:头部相机 RGB 图像类型:
torch.Tensor形状:
[batch_size, 224, 224, 3]数据类型:
uint8(0-255)说明:经过中心裁剪(center crop)处理的头部相机图像,每个环境返回一张图像
wrist_images:腕部相机 RGB 图像(可选)类型:
torch.Tensor或None形状:
[batch_size, num_wrist_images, 224, 224, 3](如果存在)数据类型:
uint8(0-255)说明:可能包含左腕相机(
left_wrist_image)和/或右腕相机(right_wrist_image)的图像,如果任务不需要腕部图像则为None
states:本体感觉信息(proprioception)类型:
torch.Tensor形状:
[batch_size, 14]数据类型:
float32说明:包含末端执行器的位姿信息(位置和姿态),共 14 维,对应
proprio_dim=14
task_descriptions:任务描述文本类型:
List[str]长度:
batch_size说明:每个环境对应的自然语言任务描述,例如 "What action should the robot take to place the empty cup on the coaster?"
Action Space:14 维连续动作空间
类型:
torch.Tensor或numpy.ndarray形状:
[batch_size, action_dim]或[batch_size, horizon, action_dim],其中action_dim=14数据类型:
float32动作组成:
末端执行器三维位置控制(x, y, z):3 维
三维旋转控制(roll, pitch, yaw):3 维
夹爪控制(开/合):1 维
关节位置控制:7 维
总计:14 维
依赖安装#
1. 克隆 RLinf 仓库#
# 如果希望在中国大陆更快地下载,可以使用:
# git clone https://ghfast.top/github.com/RLinf/RLinf.git
git clone https://github.com/RLinf/RLinf.git
cd RLinf
2. 安装依赖#
选项 1:Docker 镜像
RLinf 提供了预配置的 RoboTwin 环境 Docker 镜像,镜像中已包含所有必需的依赖,可以直接使用,无需进行后续安装步骤。
docker run -it --rm --gpus all \
--shm-size 20g \
--network host \
--name rlinf \
-v .:/workspace/RLinf \
rlinf/rlinf:agentic-rlinf0.2-robotwin
# 如果需要国内加速下载镜像,可以使用:
# docker.1ms.run/rlinf/rlinf:agentic-rlinf0.2-robotwin
备注
Docker 镜像已包含:
RLinf RoboTwin 环境相关依赖
兼容性补丁已应用
支持 OpenVLA-OFT、OpenPI 模型
使用 Docker 镜像后,可以直接跳转到 RoboTwin 代码克隆 和 Assets 下载 , 模型下载 和 运行脚本 章节,无需进行后续安装步骤。
选项 2:自建环境
在本地环境直接安装依赖,运行以下命令。根据要训练的模型,将 --model openvla-oft 参数替换为对应的模型名称(openvla-oft 或 OpenPI):
# 为提高国内依赖安装速度,可以添加`--use-mirror`到下面的install.sh命令
bash requirements/install.sh embodied --model openvla-oft --env robotwin
source .venv/bin/activate
该脚本会自动完成:
安装 RLinf RoboTwin 环境相关依赖
应用 RoboTwin 兼容性补丁(修复 sapien 和 mplib 的兼容性问题)
安装对应 VLA 模型的依赖包
RoboTwin 代码克隆 和 Assets 下载#
RoboTwin Assets 是 RoboTwin 环境所需的资产文件,需要从 HuggingFace 下载。
# 1. 克隆 RoboTwin 仓库
git clone https://github.com/RoboTwin-Platform/RoboTwin.git -b RLinf_support
# 2. 下载并解压 Assets 文件
bash script/_download_assets.sh
模型下载#
在开始训练之前,您需要下载相应的SFT模型:
# 下载模型(选择任一方法)
# 方法 1: 使用 git clone
git lfs install
git clone https://huggingface.co/RLinf/RLinf-OpenVLAOFT-RoboTwin-SFT-place_empty_cup
# 方法 2: 使用 huggingface-hub
# 为提升国内下载速度,可以设置:
# export HF_ENDPOINT=https://hf-mirror.com
pip install huggingface-hub
hf download RLinf/RLinf-OpenVLAOFT-RoboTwin-SFT-place_empty_cup --local-dir RLinf-OpenVLAOFT-RoboTwin-SFT-place_empty_cup
下载后,请确保在配置 yaml 文件中正确指定模型路径(actor.model.model_path)。
运行脚本#
请确保您在运行下面的命令前已激活正确的 Python 虚拟环境(venv)。 如果您使用的是官方 Docker 镜像,请根据模型类型切换环境:
OpenVLA-OFT:
source switch_env openvla-oftOpenPI(π0/ π0.5):
source switch_env OpenPI
1. 关键参数配置
1.1 OpenVLA-OFT + GRPO
以 OpenVLA-OFT 模型为例,在 actor.model 中需要配置以下关键参数:
actor:
model:
model_path: "/path/to/RLinf-OpenVLAOFT-RoboTwin-SFT-place_empty_cup" # SFT 模型路径
model_type: "openvla_oft" # 模型类型设置为openvla_oft
implement_version: "official" # openvla_oft实现版本(RLinf OpenVLA-OFT模型的实现接入了oft官方版本和rlinf sft微调版本,RoboTwin环境使用官方版本)
action_dim: 14 # RoboTwin 动作维度(14维)
use_proprio: True # 是否使用本体感觉信息
proprio_dim: 14 # 本体感觉维度
use_film: False # 是否使用 FiLM 层
num_images_in_input: 1 # 输入图像数量
num_action_chunks: 25 # 动作块数量
unnorm_key: "place_empty_cup" # 动作归一化键(需与SFT训练时使用的unnorm_key一致)
1.2 \(\pi_0\) + PPO
RoboTwin 中的 π0+ PPO 训练推荐沿用 OpenPI 的 RoboTwin 配置,并切换为 actor-critic 形式:
actor:
model:
model_path: "/path/to/RLinf/RLinf-Pi0-RoboTwin-SFT-adjust_bottle"
num_action_chunks: 50 # interface for the env
add_value_head: True
action_dim: 14
OpenPI:
config_name: "pi0_aloha_robotwin"
num_images_in_input: 3
detach_critic_input: True
1.3 \(\pi_0.5\) + PPO
π0.5在 RoboTwin 中已提供现成的 PPO 训练配置,示例如下:
actor:
model:
model_path: "/path/to/RLinf/RLinf-Pi05-RoboTwin-SFT-adjust_bottle"
num_action_chunks: 50 # interface for the env
action_dim: 14
add_value_head: True
OpenPI:
config_name: "pi05_aloha_robotwin"
num_images_in_input: 3
detach_critic_input: True
2. 环境配置
在环境配置文件中,需要设置以下关键参数:
env/train: robotwin_place_empty_cup
env/eval: robotwin_place_empty_cup
# 在 env/train/robotwin_place_empty_cup.yaml 中:
env_type: robotwin
assets_path: "/path/to/robotwin_assets"
task_config:
task_name: place_empty_cup # 或其他任务名称
step_lim: 200
embodiment: [piper, piper, 0.6]
camera:
head_camera_type: D435
wrist_camera_type: D435
collect_head_camera: true
collect_wrist_camera: false
对于 OpenPI(π0/ π0.5)配置,还需要额外注意:
env.train.center_crop: False和env.eval.center_crop: False:关闭中心裁剪env.*.task_config.embodiment: [aloha-agilex]:切换到 AgileX 机器人配置env.*.task_config.camera.collect_wrist_camera: true:启用腕部相机输入
3. 配置文件
RoboTwin 当前可直接参考的配置文件如下:
OpenVLA-OFT + GRPO:
examples/embodiment/config/robotwin_place_empty_cup_grpo_openvlaoft.yamlπ₀ + PPO:
examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI.yamlπ₀ Eval:
examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI_eval.yamlπ₀.₅ + PPO:
examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI_pi05.yamlπ₀.₅ Eval:
examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI_pi05_eval.yaml
4. 启动命令
选择配置后,运行以下命令开始训练:
# 设置ROBOT_PLATFORM环境变量
export ROBOT_PLATFORM=ALOHA
# 设置ROBOTWIN_PATH环境变量
export ROBOTWIN_PATH=/path/to/RoboTwin
bash examples/embodiment/run_embodiment.sh CHOSEN_CONFIG
例如,在 RoboTwin 环境中使用 GRPO 训练 OpenVLA-OFT 模型:
# 设置ROBOT_PLATFORM环境变量
export ROBOT_PLATFORM=ALOHA
# 设置ROBOTWIN_PATH环境变量
export ROBOTWIN_PATH=/path/to/RoboTwin
bash examples/embodiment/run_embodiment.sh robotwin_place_empty_cup_grpo_openvlaoft
例如,使用 PPO 训练 π0.5模型:
export ROBOT_PLATFORM=ALOHA
export ROBOTWIN_PATH=/path/to/RoboTwin
bash examples/embodiment/run_embodiment.sh robotwin_adjust_bottle_ppo_OpenPI_pi05
可视化与结果#
1. TensorBoard 日志
# 启动 TensorBoard
tensorboard --logdir ./logs --port 6006
2. 视频生成
训练和评估过程中的视频会自动保存。配置如下:
video_cfg:
save_video: True
info_on_video: True
video_base_dir: ${runner.logger.log_path}/video/train # 训练视频
# 或
video_base_dir: ${runner.logger.log_path}/video/eval # 评估视频
评估结果#
Task |
OpenVLA-OFT (SFT) |
OpenVLA-OFT (RLinf-GRPO) |
OpenVLA-OFT (RLinf-PPO) |
|---|---|---|---|
beat_block_hammer |
--- |
||
pick_dual_bottles |
--- |
||
place_empty_cup |
|||
place_container_plate |
--- |
||
move_can_pot |
--- |
||
lift_pot |
--- |
||
handover_block |
--- |
||
Average |
28.79% |
86.16% |
--- |
Δ Avg. |
--- |
+57.37% |
--- |
Task |
Pi0 (SFT) |
Pi0 (RLinf-PPO) |
Pi0.5 (SFT) |
Pi0.5 (RLinf-PPO) |
|---|---|---|---|---|
adjust_bottle |
||||
Average |
76.56% |
98.44% |
85.94% |
96.09% |
Δ Avg. |
--- |
21.88% |
--- |
10.15% |
备注
OpenVLA-OFT 模型的所有任务都在 demo_randomized 设置下进行训练; OpenPI 模型的所有任务都在 demo_clean 设置下进行训练。 更多信息请参考 RoboTwin 参数配置文档。
评估脚本#
本节介绍如何在 RoboTwin 评测平台上对不同 VLA 模型进行评估(Eval)。
在 RLinf 中,模型评估与训练复用同一套配置文件(YAML),
通常只需在对应 YAML 中将 runner.only_eval 设置为 True,即可进入评估模式。
OpenVLA-OFT 模型评估
请确保在运行前已激活正确的 Python 虚拟环境。 若使用官方 Docker 镜像,需要通过:
source switch_env openvla-oft
以 GRPO 算法、
place_empty_cup任务为例,对应配置文件为:examples/embodiment/config/robotwin_place_empty_cup_grpo_openvlaoft.yaml
π₀ 模型评估
请确保在运行前已激活正确的 Python 虚拟环境。 若使用官方 Docker 镜像,需要通过:
source switch_env OpenPI
以 PPO 算法、
adjust_bottle任务为例,对应配置文件为:examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI_eval.yaml
π₀.₅ 模型评估
请确保在运行前已激活正确的 Python 虚拟环境。 若使用官方 Docker 镜像,需要通过:
source switch_env OpenPI
以 PPO 算法、
adjust_bottle任务为例,对应配置文件为:examples/embodiment/config/robotwin_adjust_bottle_ppo_OpenPI_pi05_eval.yaml
评估模式设置
在上述任一配置文件中,将
runner.only_eval设置为True:runner: task_type: embodied logger: log_path: "../results" project_name: rlinf experiment_name: "robotwin_grpo_openvlaoft" logger_backends: ["tensorboard"] max_epochs: 1000 max_steps: -1 only_eval: True
启动评估
export ROBOT_PLATFORM=ALOHA export ROBOTWIN_PATH=/path/to/RoboTwin bash examples/embodiment/eval_embodiment.sh CHOSEN_CONFIG
注意事项
OpenVLA-OFT 模型目前使用
[piper, piper, 0.6]机械臂配置π0和 π0.5模型目前使用
[aloha-agilex]机械臂配置其余详细参数请参考下一节 配置说明
配置说明#
OpenVLA-OFT关键配置#
模型配置:
actor.model.model_type: "openvla_oft":使用 OpenVLA-OFT 模型actor.model.implement_version: "official":使用 OpenVLA-OFT 官方版本actor.model.action_dim: 14:14 维动作空间(包含本体感觉)actor.model.use_proprio: True:启用本体感觉输入actor.model.proprio_dim: 14:本体感觉维度actor.model.num_action_chunks: 25:动作块数量
算法配置:
algorithm.reward_type: chunk_level:chunk 级别的奖励algorithm.logprob_type: token_level:token 级别的对数概率algorithm.n_chunk_steps: 8:每个 chunk 的步数
环境配置:
env.train.task_config.task_name:任务名称(如place_empty_cup)env.train.task_config.embodiment:机器人配置env.train.task_config.camera:相机配置
π0和 π0.5关键配置#
模型配置:
actor.model.num_action_chunks: 50:动作块数量actor.model.action_dim: 14:动作维度actor.model.add_value_head: True:PPO 训练需要 value headactor.model.OpenPI.num_images_in_input: 3:输入图像数量
模型配置名称:
π0:
actor.model.OpenPI.config_name: "pi0_aloha_robotwin"π0.5:
actor.model.OpenPI.config_name: "pi05_aloha_robotwin"
算法配置:
algorithm.reward_type: chunk_level:chunk 级奖励algorithm.logprob_type: chunk_level:chunk 级对数概率algorithm.adv_type: gae:使用 GAE 估计优势algorithm.loss_type: actor_critic:使用 actor-critic 损失
环境配置:
env.train.center_crop: False与env.eval.center_crop: False:关闭中心裁剪env.*.task_config.embodiment: [aloha-agilex]:使用 AgileX 机器人配置,而非oft中使用的[piper, piper, 0.6]env.*.task_config.camera.collect_wrist_camera: true:启用腕部相机fsdp.gradient_checkpointing: False:OpenPI 当前不支持开启梯度检查点
更多关于 RoboTwin 配置的详细信息,请参考 RoboTwin 配置文档。
注意事项#
资源路径:确保
assets_path路径正确ROBOT_PLATFORM 环境变量:确保
ROBOT_PLATFORM变量设置为ALOHARoboTwin Repo:确保正确设置
ROBOTWIN_PATH,如export ROBOTWIN_PATH=/path/to/RoboTwinGPU 内存:RoboTwin 环境可能需要较多 GPU 内存,建议使用
enable_offload: True任务配置:根据具体任务修改
task_config中的参数