LeRobot documentation
LaWAM
LaWAM
lawam 是 LaWAM 的 LeRobot 适配器,LaWAM 是一种用于感知动态的机器人策略的潜在世界动作模型。它结合了 Qwen3-VL 骨干网络、潜在动作/世界模型以及流匹配动作头,同时暴露了标准的 LeRobot 策略、训练和评估接口。
资源:
| 资源 | 链接 | 用于 |
|---|---|---|
| 项目页面 | rlinf.github.io/LaWAM | 方法概述 |
| 论文 | arXiv:2606.15768 | 引用与方法详情 |
| 代码 | RLinf/LaWAM | 原始训练和评估代码 |
| 原生预训练 | lawam-pretrain-lerobot | LeRobot 微调初始化 |
| 原生 LIBERO SFT | lawam-libero-sft-lerobot | LIBERO 评估 |
| 源检查点 | lawam-checkpoints | 原始 LaWAM 发布产物 |
| LIBERO 数据集 | jialei02/libero_merged_no_noops_20hz | LIBERO SFT |
安装
使用 LaWAM 附加组件安装 LeRobot:
pip install -e ".[lawam]"在复现已发布的 LaWAM LIBERO 评估时,请安装 LIBERO 基准的依赖项,并将 MuJoCo 固定为 3.3.2 版本:
pip install -e ".[lawam,libero]" "mujoco==3.3.2"LIBERO 基准的成功率对 MuJoCo 模拟器版本较为敏感。较新版本的 MuJoCo 可能会显著降低所测得的 LIBERO 成功率,且这一现象不仅限于 LaWAM 策略。这属于评估环境的兼容性问题,而非 LaWAM 适配器的问题。若要精确复现已发布的 LaWAM LIBERO 结果及论文中的结果,请使用 mujoco==3.3.2。
LaWAM 检查点使用 LeRobot 原生的 model.safetensors 格式。完整的 LAM、VLM 适配器以及 flow-head 状态通过 policy.path 恢复;适配器不会加载原始的 LaWAM .pt 文件。LAM 和 DINOv3 架构直接由 LaWAMConfig 表示,无需单独下载检查点。
将 policy.base_vlm 设置为可移植的 Hub 模型 ID。Hugging Face 的标准缓存设置,例如 HF_HOME,控制 Qwen 文件在本地存储的位置,而无需在策略或处理器配置中添加特定于机器的路径。
微调
从原生预训练的 LaWAM 策略进行微调:
lerobot-train \
--policy.path=jialei02/lawam-pretrain-lerobot \
--dataset.repo_id=jialei02/libero_merged_no_noops_20hz \
--dataset.image_transforms.enable=false \
--rename_map='{"observation.images.wrist_image":"observation.images.image2"}' \
--policy.action_horizon=8 \
--policy.n_action_steps=8 \
--policy.clip_normalized_actions=true \
--policy.pre_snap_gripper_action=true \
--policy.binarize_gripper_action=true \
--policy.repo_id=your_org/lawam_sft该适配器在构建 LaWAM 训练批次之前,使用 LeRobot 数据集的统计信息对动作和状态进行归一化。位姿动作采用 min-max 归一化,而 LIBERO 配方则显式地将夹爪通道对齐为二值 0/1 值,以匹配原生的 LaWAM 训练约定。这将 -1/+1 和 0/1 两种数据集约定映射到相同的模型目标。预训练检查点保留了其预训练值 action_horizon=24 和 n_action_steps=24;LIBERO SFT 配方将两者均覆盖为 8,同时保留 chunk_size=50 作为填充后的 Flow 序列长度。训练使用当前数据集的 FPS 进行 LaWAM 的自然时间编码,并且处理器会将该频率持久化作为评估的回退值。policy.num_video_frames 控制观察帧窗口。
已发布的 LaWAM 预训练和 LIBERO SFT 配方不使用随机图像增强。策略处理器仅应用 Qwen 和 LAM 主干网络所需的确定性缩放和 ImageNet 归一化。LeRobot 的数据集级图像变换仍然可用,供单独设计的训练配方使用。
发布的 LaWAM 检查点在内部使用 32 维的填充动作/状态空间。除非您使用不同的流维度训练了检查点,否则请保持 policy.flow_action_dim=32 和 policy.flow_state_dim=32 不变。
评估
通过标准评估器评估原生 LIBERO SFT 检查点:
lerobot-eval \ --policy.path=jialei02/lawam-libero-sft-lerobot \ --env.type=libero \ --env.task=libero_object \ --eval.n_episodes=10
Hub 仓库包含策略配置以及完整的预处理和后处理流水线,其中包括归一化张量和 LIBERO 夹爪处理。
要使用发布的 LIBERO SFT 检查点进行可复现的 LIBERO 基准测试,请在一次调用中评估所有套件和任务 ID:
lerobot-eval \
--policy.path=jialei02/lawam-libero-sft-lerobot \
--policy.device=cuda \
--env.type=libero \
--env.task=libero_spatial,libero_object,libero_goal,libero_10 \
--env.task_ids='[0,1,2,3,4,5,6,7,8,9]' \
--eval.n_episodes=50 \
--output_dir=outputs/lawam_libero报告每个套件中全部 10 个任务的成功率。在报告基准测试数字时,每个任务至少使用 50 个回合。
已发布的 LIBERO SFT 检查点在每项任务 50 个回合下的参考结果。这些数字是在 MuJoCo 3.3.2 上生成的。作为环境检查,libero_spatial 任务 5 的成功次数从 MuJoCo 3.8.1 下的 18/50 提升至 MuJoCo 3.3.2 下的 47/50。
| 套件 | 成功 | 剧集 | 成功率 |
|---|---|---|---|
libero_spatial | 492 | 500 | 98.4% |
libero_object | 498 | 500 | 99.6% |
libero_goal | 490 | 500 | 98.0% |
libero_10 | 490 | 500 | 98.0% |
overall | 1970 | 2000 | 98.5% |
相机选择
LaWAM 检查点会显式存储主相机和腕部相机的角色,而不是从诸如 image2 这样的名称中推断语义。在构建新的多相机 LaWAM 策略时,请配置这两个角色:
--policy.primary_image_features='["observation.images.front"]' \
--policy.wrist_image_features='["observation.images.wrist"]'policy.lam_image_feature 选择其时间帧被潜在动作模型使用的主摄像头。默认值为配置的第一个主摄像头,并在保存策略配置时显式写入。
运行时字段
LaWAM 特有的常见策略字段:
| 字段 | 描述 |
|---|---|
base_vlm | 存储在已发布的策略配置中的便携式 Qwen/Qwen3-VL Hub 模型 ID。 |
action_horizon | 每个块预测的动作数量,最多为 chunk_size。 |
flow_action_dim | LaWAM 流头内部使用的填充后的动作维度。 |
flow_state_dim | LaWAM 流头内部使用的填充状态维度。 |
embodiment_id | 当 LeRobot 数据集未提供时,使用的 LaWAM 具身 ID。 |
引用
@misc{chen2026lawam,
title = {LaWAM: Latent World Action Models for Efficient Dynamics-Aware Robot Policies},
author = {Chen, Jialei and Wang, Kai and Chen, Kang and Chen, Shuaihang and Gao, Feng and Tang, Wenhao and Li, Zhiyuan and Liu, Weilin and Yao, Zhuyu and Li, Boxun and Xu, Yuanbo and Yu, Chao},
journal = {arXiv preprint arXiv:2606.15768},
year = {2026},
archiveprefix = {arXiv},
primaryclass = {cs.RO},
}