ROBOMETER 是一个通用视频-语言机器人奖励模型。它根据轨迹视频和任务描述预测密集的、帧级的任务进度和帧级成功。
论文:ROBOMETER: Scaling General-Purpose Robotic Reward Models via Trajectory Comparisons 项目:robometer.github.io 原始代码:github.com/robometer/robometer checkpoint:lerobot/Robometer-4B
ROBOMETER 基于 Qwen/Qwen3-VL-4B-Instruct 构建,并添加了三个轻量级预测头:
[0, 1]。论文使用复合目标训练 ROBOMETER:
L = L_pref + L_prog + L_succ
LeRobot 集成目前仅支持 inference。它保留偏好头,以便已发布的 Robometer-4B checkpoint 无需重新映射即可加载,但 compute_reward() 只查询进度头或成功头。
reward_model.type=robometer 配置。RobometerEncoderProcessorStep 进行 Qwen3-VL 图像和文本预处理。PreTrainedRewardModel 的 LeRobot 奖励模型保存/加载 API。compute_reward() 提供标量奖励,供下游 LeRobot 奖励模型使用。本页重点介绍如何将已发布的 ROBOMETER checkpoint 用作零样本奖励模型。从零开始训练 ROBOMETER 不在当前 LeRobot 集成的范围内。
pip install -e ".[robometer]"如果你直接从源码检出使用 uv:
uv sync --extra robometerROBOMETER 使用 Qwen3-VL-4B 骨干,因此强烈建议使用 GPU inference。
ROBOMETER 需要:
在 LeRobot dataset 中,预处理器读取:
| 配置字段 | 默认值 | 含义 |
|---|---|---|
reward_model.image_key | observation.images.top | ROBOMETER 使用的相机/视频 observation |
reward_model.task_key | task | 存储任务字符串的补充数据中的键 |
reward_model.max_frames | 8 | 传递给 ROBOMETER 的最大帧数 |
模型内部预测每帧的进度和成功。LeRobot 奖励 API 为每个样本返回一个标量:
reward_output="progress"(默认):返回最后一帧的进度,并限制在 [0, 1]。reward_output="success":如果最后一帧成功概率高于 success_threshold,则返回 1.0,否则返回 0.0。from lerobot.rewards.robometer import RobometerConfig, RobometerRewardModel
cfg = RobometerConfig(
pretrained_path="lerobot/Robometer-4B",
device="cuda",
reward_output="progress",
)
reward_model = RobometerRewardModel.from_pretrained(cfg.pretrained_path, config=cfg)对于直接的 Python 调用,以形状为 (T, H, W, C) 的 uint8 数组提供帧,并提供任务字符串:
from lerobot.rewards.robometer.modeling_robometer import ROBOMETER_FEATURE_PREFIX
from lerobot.rewards.robometer.processor_robometer import RobometerEncoderProcessorStep
# frames: np.ndarray, shape (T, H, W, C), dtype uint8
# task: str
encoder = RobometerEncoderProcessorStep(
base_model_id=cfg.base_model_id,
use_multi_image=cfg.use_multi_image,
use_per_frame_progress_token=cfg.use_per_frame_progress_token,
max_frames=cfg.max_frames,
)
encoded = encoder.encode_samples([(frames, task)])
batch = {f"{ROBOMETER_FEATURE_PREFIX}{key}": value for key, value in encoded.items()}
reward = reward_model.compute_reward(batch)reward 是一个形状为 (batch_size,) 的张量。
你也可以通过奖励工厂实例化 ROBOMETER:
from lerobot.rewards import make_reward_model, make_reward_model_config, make_reward_pre_post_processors
cfg = make_reward_model_config(
"robometer",
pretrained_path="lerobot/Robometer-4B",
device="cuda",
image_key="observation.images.top",
)
reward_model = make_reward_model(cfg)
preprocessor, postprocessor = make_reward_pre_post_processors(cfg)预处理器将 Qwen-VL 张量写入 observation.robometer.* 命名空间,compute_reward() 则读取这些编码后的张量。
已发布的 checkpoint 使用 Qwen3-VL-4B 骨干。ROBOMETER 按固定顺序向分词器添加五个特殊 token:
<|split_token|> <|reward_token|> <|pref_token|> <|sim_token|> <|prog_token|>
<|prog_token|> 插入到每一帧之后,是用于逐帧进度和成功预测的隐藏 state 位置。<|split_token|> 和 <|pref_token|> 用于论文的成对轨迹偏好目标。<|reward_token|> 和 <|sim_token|> 为 checkpoint 兼容性而保留。
LeRobot 配置存储一个序列化后的 vlm_config,其中包含调整大小后的词表,以便模型可以从 config.json 重新加载,而无需先下载基础 Qwen 权重。对于 Qwen/Qwen3-VL-4B-Instruct,分词器长度为 151669,五个 ROBOMETER token 使 checkpoint 词表大小达到 151674。
在已发布的 checkpoint 中,进度是离散的。进度头输出在 [0, 1] 内均匀分布的 progress_discrete_bins=10 个区间中心上的 logits。LeRobot 通过应用 softmax 并对区间中心取期望,将这些 logits 转换为连续值,与上游 ROBOMETER 实现保持一致。
成功头为每帧输出原始 logits。LeRobot 使用 sigmoid 将它们转换为概率。当 reward_output="success" 时,compute_reward() 使用 success_threshold 对最后一帧成功概率进行阈值判断。
compute_reward() 仍为 LeRobot 奖励模型 API 的每个样本返回一个标量。@inproceedings{liang2026robometer,
title = {Robometer: Scaling General-Purpose Robotic Reward Models via Trajectory Comparisons},
author={Anthony Liang and Yigit Korkmaz and Jiahui Zhang and Minyoung Hwang and Abrar Anwar and Sidhant Kaushik and Aditya Shah and Alex S. Huang and Luke Zettlemoyer and Dieter Fox and Yu Xiang and Anqi Li and Andreea Bobu and Abhishek Gupta and Stephen Tu and Erdem Biyik and Jesse Zhang},
year={2026},
booktitle={Robotics: Science and Systems 2026},
}此 LeRobot 集成遵循 LeRobot 使用的 Apache 2.0 License。请查看上游 ROBOMETER 代码和模型页面,了解原始实现和已发布 checkpoint 的许可证。
在 GitHub 上更新