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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.