跳转至

策略部署(lerobot-rollout)

lerobot-rollout 是在真实机器人上部署训练策略的单一 CLI。它支持多种执行策略和推理后端,从快速评估到连续记录和人机协同数据收集。

快速入门

除了您的机器人和策略额外依赖项之外,不需要额外的依赖项。

lerobot-rollout \
    --strategy.type=base \
    --policy.path=lerobot/act_koch_real \
    --robot.type=koch_follower \
    --robot.port=/dev/ttyACM0 \
    --task="pick up cube" \
    --duration=30

这将运行策略 30 秒,不进行记录。


策略

使用 --strategy.type=<name> 选择策略。每个策略定义了具有自己的记录和交互语义的不同控制循环。

Base(--strategy.type=base

无数据记录的自主策略执行。用于快速评估、演示或当您只需要观察机器人时。

lerobot-rollout \
    --strategy.type=base \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --task="Put lego brick into the box" \
    --duration=60
标志 描述
--duration 运行时间(秒)(0 = 无限)
--task 传递给策略的任务描述
--display_data 将观测/动作流式传输到 Rerun 进行可视化

Sentry(--strategy.type=sentry

带有定期上传到 Hugging Face Hub 的连续自主记录。回合边界根据相机分辨率和 FPS 自动计算,因此每个保存的回合都会生成一个完整的视频文件,保持上传效率。

策略状态(隐藏状态、RTC 队列)在回合边界之间持续存在:机器人不会在回合之间重置。

lerobot-rollout \
    --strategy.type=sentry \
    --strategy.upload_every_n_episodes=5 \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --dataset.repo_id=${HF_USER}/rollout_eval_data \
    --dataset.single_task="Put lego brick into the box" \
    --duration=3600
标志 描述
--strategy.upload_every_n_episodes 每 N 个回合推送到 Hub(默认:5)
--strategy.target_video_file_size_mb 回合轮换的目标视频文件大小(默认:自动)
--dataset.repo_id 必需。 记录数据集的 Hub 仓库
--dataset.push_to_hub 是否在拆卸时推送到 Hub(默认:true)

Highlight(--strategy.type=highlight

通过内存限制的环形缓冲区进行按需记录的自主推出。机器人连续运行,而缓冲区捕获最后 N 秒的遥测数据。按保存键刷新缓冲区并开始实时记录;再次按下以保存回合。

lerobot-rollout \
    --strategy.type=highlight \
    --strategy.ring_buffer_seconds=30 \
    --strategy.save_key=s \
    --strategy.push_key=h \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=koch_follower \
    --robot.port=/dev/ttyACM0 \
    --dataset.repo_id=${HF_USER}/rollout_highlight_data \
    --dataset.single_task="Pick up the red cube"

键盘控制:

动作
s(可配置) 开始记录(刷新缓冲区)/ 停止并保存回合
h(可配置) 将数据集推送到 Hub
ESC 停止会话
标志 描述
--strategy.ring_buffer_seconds 缓冲遥测的持续时间(默认:30)
--strategy.ring_buffer_max_memory_mb 环形缓冲区的内存上限(默认:2048)
--strategy.save_key 切换记录的键(默认:s
--strategy.push_key 推送到 Hub 的键(默认:h)

DAgger(--strategy.type=dagger

人机协同数据收集。在自主策略执行和通过远程操作器的人工干预之间交替。干预帧标记为 intervention=True。需要远程操作器(--teleop.type)。

有关详细演练,请参阅人机协同数据收集指南。

仅纠正模式(默认):仅记录人工纠正窗口。每次纠正成为一个回合。

lerobot-rollout \
    --strategy.type=dagger \
    --strategy.num_episodes=20 \
    --policy.path=outputs/pretrain/checkpoints/last/pretrained_model \
    --robot.type=bi_openarm_follower \
    --teleop.type=openarm_mini \
    --dataset.repo_id=${HF_USER}/rollout_hil_data \
    --dataset.single_task="Fold the T-shirt"

连续记录模式--strategy.record_autonomous=true):自主和纠正帧都记录,带有基于时间的回合轮换(与 Sentry 相同)。

lerobot-rollout \
    --strategy.type=dagger \
    --strategy.record_autonomous=true \
    --strategy.num_episodes=50 \
    --policy.path=${HF_USER}/my_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --teleop.type=so101_leader \
    --teleop.port=/dev/ttyACM1 \
    --dataset.repo_id=${HF_USER}/rollout_dagger_data \
    --dataset.single_task="Grasp the block"

键盘控制(默认输入设备):

动作
Space 暂停/恢复策略执行
Tab 开始/停止人工纠正
Enter 将数据集推送到 Hub(仅纠正模式)
ESC 停止会话

也支持通过 --strategy.input_device=pedal 进行脚踏板输入。使用 --strategy.pedal.* 标志配置踏板代码。

标志 描述
--strategy.num_episodes 要记录的纠正回合数(默认:10)
--strategy.record_autonomous 也记录自主帧(默认:false)
--strategy.upload_every_n_episodes 每 N 个回合推送到 Hub(默认:5)
--strategy.input_device 输入设备:keyboardpedal(默认:keyboard)
--teleop.type 必需。 远程操作器类型

推理后端

使用 --inference.type=<name> 选择后端。所有策略都适用于两种后端。

Sync(默认)

每个控制周期一次策略调用。主循环阻塞,直到计算出动作。

适用于所有策略。不需要额外的标志。

实时分块(--inference.type=rtc

后台线程异步生成动作块。主控制循环轮询下一个就绪动作,而策略并行计算下一个块。

对于大型、慢速 VLA 模型(Pi0、Pi0.5、SmolVLA),使用 RTC 可以实现平滑、连续的运动,尽管推理延迟很高。

lerobot-rollout \
    --strategy.type=base \
    --inference.type=rtc \
    --inference.rtc.execution_horizon=10 \
    --inference.rtc.max_guidance_weight=10.0 \
    --policy.path=${HF_USER}/pi0_policy \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
    --task="Pick up the cube" \
    --duration=60 \
    --device=cuda
标志 描述
--inference.rtc.execution_horizon 与前一个块混合的步数(默认:因策略而异)
--inference.rtc.max_guidance_weight 一致性执行强度(默认:因策略而异)
--inference.rtc.prefix_attention_schedule 混合计划:LINEAREXPONESZEROS
--inference.queue_threshold 背压前的最大队列大小(默认:30)

有关调整 RTC 参数的详细信息,请参阅实时分块指南。


常用标志

标志 描述 默认
--policy.path 必需。 HF Hub 模型 ID 或本地检查点路径 --
--robot.type 必需。 机器人类型(例如 so100_followerkoch_follower --
--robot.port 机器人的串行端口 --
--robot.cameras 相机配置(JSON 字典) --
--fps 控制循环频率 30
--duration 运行时间(秒)(0 = 无限) 0
--device Torch 设备(cpucudamps auto
--task 任务描述(未提供数据集时使用) --
--display_data 将遥测流式传输到 Rerun 可视化 false
--display_ip / --display_port 远程 Rerun 服务器地址 --
--interpolation_multiplier 动作插值因子 1
--use_torch_compile 为推理启用 torch.compile false
--resume 恢复之前的记录会话 false
--play_sounds 事件的语音合成 true

编程使用

对于自定义部署(例如,使用运动学处理器),直接使用推出模块 API:

from lerobot.rollout import BaseStrategyConfig, RolloutConfig, build_rollout_context
from lerobot.rollout.inference import SyncInferenceConfig
from lerobot.rollout.strategies import BaseStrategy
from lerobot.utils.process import ProcessSignalHandler

cfg = RolloutConfig(
    robot=my_robot_config,
    policy=my_policy_config,
    strategy=BaseStrategyConfig(),
    inference=SyncInferenceConfig(),
    fps=30,
    duration=60,
    task="my task",
)

signal_handler = ProcessSignalHandler(use_threads=True)
ctx = build_rollout_context(
    cfg,
    signal_handler.shutdown_event,
    robot_action_processor=my_custom_action_processor,       # 可选
    robot_observation_processor=my_custom_obs_processor,     # 可选
)

strategy = BaseStrategy(cfg.strategy)
try:
    strategy.setup(ctx)
    strategy.run(ctx)
finally:
    strategy.teardown(ctx)

有关使用运动学处理器的完整示例,请参阅 examples/so100_to_so100_EE/rollout.pyexamples/phone_to_so100/rollout.py