策略部署(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 |
输入设备:keyboard 或 pedal(默认: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 |
混合计划:LINEAR、EXP、ONES、ZEROS |
--inference.queue_threshold |
背压前的最大队列大小(默认:30) |
有关调整 RTC 参数的详细信息,请参阅实时分块指南。
常用标志
| 标志 | 描述 | 默认 |
|---|---|---|
--policy.path |
必需。 HF Hub 模型 ID 或本地检查点路径 | -- |
--robot.type |
必需。 机器人类型(例如 so100_follower、koch_follower) |
-- |
--robot.port |
机器人的串行端口 | -- |
--robot.cameras |
相机配置(JSON 字典) | -- |
--fps |
控制循环频率 | 30 |
--duration |
运行时间(秒)(0 = 无限) | 0 |
--device |
Torch 设备(cpu、cuda、mps) |
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.py 和 examples/phone_to_so100/rollout.py。