LeRobot 文档

真实世界机器人上的模仿学习

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

真实世界机器人上的模仿学习

本教程将解释如何训练一个神经网络来自动控制一个真实机器人。

你将学到:

  1. 如何记录和可视化您的数据集。
  2. 如何使用您的数据训练一个策略并准备评估。
  3. 如何评估您的策略并可视化结果。

通过遵循这些步骤,您将能够以高成功率复制任务,例如捡起一块乐高积木并将其放入一个箱子中,如下面的视频所示。

视频:捡起乐高积木任务

本教程不局限于特定的机器人:我们将引导您了解可以适用于任何支持平台的命令和 API 片段。

在数据收集期间,您将使用一个“遥操作”设备,例如一个主导臂或键盘来遥控机器人并记录其运动轨迹。

一旦您收集了足够多的轨迹,您将训练一个神经网络来模仿这些轨迹,并部署训练好的模型,以便您的机器人可以自主执行任务。

如果在任何时候遇到任何问题,请加入我们的 Discord 社区获取支持。

设置和校准

如果您尚未设置和校准您的机器人和遥控设备,请按照特定于机器人的教程进行操作。

遥操作

在这个例子中,我们将演示如何遥控 SO101 机器人。对于每个命令,我们还提供了一个相应的 API 示例。

请注意,与机器人关联的 id 用于存储校准文件。在使用相同设置进行遥操作、记录和评估时,使用相同的 id 非常重要。

命令
API 示例
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

遥操作命令将自动

  1. 识别任何缺失的校准并启动校准程序。
  2. 连接机器人和遥操作设备并开始遥操作。

摄像头

要为您的设置添加摄像头,请遵循本指南

带摄像头的遥操作

通过 rerun,您可以再次进行遥操作,同时可视化摄像头画面和关节位置。在本例中,我们使用的是 Koch 臂。

命令
API 示例
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 示例。

命令
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 示例在您的机器人上重放第一个片段

命令
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

让我们来解释一下这个命令:

  1. 我们使用 --dataset.repo_id=${HF_USER}/so101_test 提供了数据集作为参数。
  2. 我们使用 policy.type=act 提供了策略。这将从 configuration_act.py 加载配置。重要的是,该策略将自动适应您机器人中电机状态、电机动作和摄像头(例如 laptopphone)的数量,这些信息已保存在您的数据集中。
  3. 我们提供了 policy.device=cuda,因为我们是在 Nvidia GPU 上训练,但你也可以使用 policy.device=mps 在 Apple 芯片上进行训练。
  4. 我们提供了 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.pyrecord 脚本,并将策略检查点作为输入,以运行推理并评估您的策略。例如,运行此命令或 API 示例来运行推理并记录 10 个评估片段

命令
API 示例
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

如您所见,这与之前用于记录训练数据集的命令几乎相同。有两点变化

  1. 有一个额外的 --control.policy.path 参数,它指示您策略检查点的路径(例如 outputs/train/eval_act_so101_test/checkpoints/last/pretrained_model)。如果您已将模型检查点上传到 Hub,您也可以使用模型仓库(例如 ${HF_USER}/act_so101_test)。
  2. 数据集的名称以 eval 开头,以反映您正在运行推理(例如 ${HF_USER}/eval_act_so101_test)。
< > 在 GitHub 上更新