LeRobot 文档
真实世界机器人上的模仿学习
并获得增强的文档体验
开始使用
真实世界机器人上的模仿学习
本教程将解释如何训练一个神经网络来自动控制一个真实机器人。
你将学到:
- 如何记录和可视化您的数据集。
- 如何使用您的数据训练一个策略并准备评估。
- 如何评估您的策略并可视化结果。
通过遵循这些步骤,您将能够以高成功率复制任务,例如捡起一块乐高积木并将其放入一个箱子中,如下面的视频所示。
视频:捡起乐高积木任务
本教程不局限于特定的机器人:我们将引导您了解可以适用于任何支持平台的命令和 API 片段。
在数据收集期间,您将使用一个“遥操作”设备,例如一个主导臂或键盘来遥控机器人并记录其运动轨迹。
一旦您收集了足够多的轨迹,您将训练一个神经网络来模仿这些轨迹,并部署训练好的模型,以便您的机器人可以自主执行任务。
如果在任何时候遇到任何问题,请加入我们的 Discord 社区获取支持。
设置和校准
如果您尚未设置和校准您的机器人和遥控设备,请按照特定于机器人的教程进行操作。
遥操作
在这个例子中,我们将演示如何遥控 SO101 机器人。对于每个命令,我们还提供了一个相应的 API 示例。
请注意,与机器人关联的 id
用于存储校准文件。在使用相同设置进行遥操作、记录和评估时,使用相同的 id
非常重要。
lerobot-teleoperate \ --robot.type=so101_follower \ --robot.port=/dev/tty.usbmodem58760431541 \ --robot.id=my_awesome_follower_arm \ --teleop.type=so101_leader \ --teleop.port=/dev/tty.usbmodem58760431551 \ --teleop.id=my_awesome_leader_arm
遥操作命令将自动
- 识别任何缺失的校准并启动校准程序。
- 连接机器人和遥操作设备并开始遥操作。
摄像头
要为您的设置添加摄像头,请遵循本指南。
带摄像头的遥操作
通过 rerun
,您可以再次进行遥操作,同时可视化摄像头画面和关节位置。在本例中,我们使用的是 Koch 臂。
lerobot-teleoperate \
--robot.type=koch_follower \
--robot.port=/dev/tty.usbmodem58760431541 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=koch_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true
记录数据集
一旦您熟悉了远程操作,您就可以记录您的第一个数据集。
我们使用 Hugging Face Hub 的功能来上传您的数据集。如果您以前没有使用过 Hub,请确保您可以通过命令行使用具有写权限的令牌登录,此令牌可以从 Hugging Face 设置中生成。
通过运行此命令将您的令牌添加到 CLI
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
然后将您的 Hugging Face 存储库名称存储在一个变量中
HF_USER=$(huggingface-cli whoami | head -n 1)
echo $HF_USER
现在您可以记录一个数据集了。要记录 5 个片段并上传您的数据集到 Hub,请根据您的机器人调整下面的代码并执行命令或 API 示例。
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube"
数据集上传
在本地,您的数据集存储在此文件夹中:~/.cache/huggingface/lerobot/{repo-id}
。数据记录结束后,您的数据集将被上传到您的 Hugging Face 页面(例如 https://huggingface.co/datasets/${HF_USER}/so101_test
),您可以通过运行以下命令获取该页面
echo https://huggingface.co/datasets/${HF_USER}/so101_test
您的数据集将自动标记为 LeRobot
,以便社区轻松找到它,您还可以添加自定义标签(例如,在此示例中为 tutorial
)。
您可以通过搜索 LeRobot
标签在 Hub 上查找其他 LeRobot 数据集。
您也可以手动将本地数据集推送到 Hub,运行
huggingface-cli upload ${HF_USER}/record-test ~/.cache/huggingface/lerobot/{repo-id} --repo-type dataset
记录函数
record
函数提供了一套在机器人操作期间捕获和管理数据的工具
1. 数据存储
- 数据使用
LeRobotDataset
格式存储,并在记录期间保存在磁盘上。 - 默认情况下,记录后数据集会推送到您的 Hugging Face 页面。
- 要禁用上传,请使用
--dataset.push_to_hub=False
。
- 要禁用上传,请使用
2. 检查点和恢复
- 在记录期间会自动创建检查点。
- 如果出现问题,您可以通过重新运行相同的命令并添加
--resume=true
来恢复。当恢复记录时,--dataset.num_episodes
必须设置为 需要额外记录的片段数量,而不是数据集中目标总片段数! - 要从头开始记录,手动删除 数据集目录。
3. 记录参数
使用命令行参数设置数据记录的流程
--dataset.episode_time_s=60
每个数据记录片段的持续时间(默认值:60 秒)。--dataset.reset_time_s=60
每个片段后重置环境的持续时间(默认值:60 秒)。--dataset.num_episodes=50
要记录的总片段数(默认值:50)。
4. 记录期间的键盘控制
使用键盘快捷键控制数据记录流程
- 按 右箭头键 (
→
):提前停止当前片段或重置时间并移至下一个。 - 按 左箭头键 (
←
):取消当前片段并重新录制。 - 按 Escape (
ESC
):立即停止会话,编码视频并上传数据集。
收集数据的技巧
一旦您熟悉了数据记录,就可以创建一个更大的数据集进行训练。一个好的起始任务是在不同位置抓取一个物体并将其放入箱子中。我们建议至少记录 50 个片段,每个位置 10 个片段。在整个记录过程中保持摄像头固定和一致的抓取行为。同时确保您正在操作的物体在摄像头中可见。一个好的经验法则是,您应该能够仅通过观察摄像头图像就完成该任务。
在接下来的部分中,您将训练您的神经网络。在实现可靠的抓取性能后,您可以开始在数据收集中引入更多的变化,例如增加抓取位置、不同的抓取技术以及改变摄像头位置。
避免过快地添加太多变化,因为它可能会阻碍您的结果。
如果您想深入了解这个重要主题,您可以查看我们撰写的关于什么是一个好的数据集的博客文章。
故障排除:
- 在 Linux 上,如果左右箭头键和 escape 键在数据记录期间没有任何效果,请确保您已设置
$DISPLAY
环境变量。请参阅 pynput 的限制。
可视化数据集
如果您使用 --control.push_to_hub=true
将数据集上传到 Hub,您可以通过复制粘贴由以下命令给出的仓库 ID 来在线可视化您的数据集
echo ${HF_USER}/so101_test
重放片段
一个有用的功能是 replay
函数,它允许您重放您录制的任何片段或任何现有数据集中的片段。此功能可帮助您测试机器人动作的可重复性,并评估同一型号机器人之间的可迁移性。
您可以使用下面的命令或 API 示例在您的机器人上重放第一个片段
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem58760431541 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.episode=0 # choose the episode you want to replay
您的机器人应该会复制与您录制的动作相似的动作。例如,查看这个视频,我们在来自 Trossen Robotics 的 Aloha 机器人上使用 replay
。
训练策略
要训练一个控制您机器人的策略,请使用 lerobot-train
脚本。需要一些参数。这是一个示例命令
lerobot-train \
--dataset.repo_id=${HF_USER}/so101_test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=true \
--policy.repo_id=${HF_USER}/my_policy
让我们来解释一下这个命令:
- 我们使用
--dataset.repo_id=${HF_USER}/so101_test
提供了数据集作为参数。 - 我们使用
policy.type=act
提供了策略。这将从configuration_act.py
加载配置。重要的是,该策略将自动适应您机器人中电机状态、电机动作和摄像头(例如laptop
和phone
)的数量,这些信息已保存在您的数据集中。 - 我们提供了
policy.device=cuda
,因为我们是在 Nvidia GPU 上训练,但你也可以使用policy.device=mps
在 Apple 芯片上进行训练。 - 我们提供了
wandb.enable=true
来使用 Weights and Biases 可视化训练图。这是可选的,但如果您使用它,请确保通过运行wandb login
登录。
训练应需要几个小时。您将在 outputs/train/act_so101_test/checkpoints
中找到检查点。
要从检查点恢复训练,以下是从 act_so101_test
策略的 last
检查点恢复的示例命令
lerobot-train \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true
如果您不想在训练后将模型推送到 Hub,请使用 --policy.push_to_hub=false
。
此外,您还可以为您的模型提供额外的 tags
或指定一个 license
,或者通过添加以下内容使模型仓库 private
:--policy.private=true --policy.tags=\[ppo,rl\] --policy.license=mit
使用 Google Colab 训练
如果您的本地计算机没有强大的 GPU,您可以利用 Google Colab 按照 ACT 训练笔记本 来训练您的模型。
上传策略检查点
训练完成后,使用以下命令上传最新的检查点:
huggingface-cli upload ${HF_USER}/act_so101_test \
outputs/train/act_so101_test/checkpoints/last/pretrained_model
你也可以使用以下命令上传中间检查点:
CKPT=010000
huggingface-cli upload ${HF_USER}/act_so101_test${CKPT} \
outputs/train/act_so101_test/checkpoints/${CKPT}/pretrained_model
运行推理并评估您的策略
您可以使用来自 lerobot/record.py
的 record
脚本,并将策略检查点作为输入,以运行推理并评估您的策略。例如,运行此命令或 API 示例来运行推理并记录 10 个评估片段
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM1 \
--robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30}, side: {type: intelrealsense, serial_number_or_name: 233522074606, width: 640, height: 480, fps: 30}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=${HF_USER}/eval_so100 \
--dataset.single_task="Put lego brick into the transparent box" \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=so100_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_awesome_leader_arm \
--policy.path=${HF_USER}/my_policy
如您所见,这与之前用于记录训练数据集的命令几乎相同。有两点变化
- 有一个额外的
--control.policy.path
参数,它指示您策略检查点的路径(例如outputs/train/eval_act_so101_test/checkpoints/last/pretrained_model
)。如果您已将模型检查点上传到 Hub,您也可以使用模型仓库(例如${HF_USER}/act_so101_test
)。 - 数据集的名称以
eval
开头,以反映您正在运行推理(例如${HF_USER}/eval_act_so101_test
)。