LeRobot 文件
實體機器人模仿學習
並獲得增強的文件體驗
開始使用
實體機器人模仿學習
本教學將說明如何訓練神經網路以自動化控制實體機器人。
你將學到:
- 如何記錄並視覺化你的資料集。
- 如何使用你的資料訓練策略,並為評估做好準備。
- 如何評估你的策略並視覺化結果。
遵循這些步驟,你將能夠複製各項任務,例如以高成功率抓取積木並放入容器中,如下方影片所示。
影片:拾取積木任務
本教學不限於特定機器人:我們將引導你使用適用於任何支援平台的指令與 API 片段。
在資料收集過程中,你將使用「遠端操作 (teleoperation)」設備(如主從式機械手臂或鍵盤)來操控機器人並記錄其運動軌跡。
當收集到足夠的軌跡後,你將訓練一個神經網路來模仿這些軌跡,並部署訓練好的模型,讓機器人能夠自主執行任務。
如果你在任何步驟遇到問題,歡迎加入我們的 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,請確保你能透過 CLI 使用具備寫入權限的 Token 進行登入,該 Token 可從 Hugging Face 設定中生成。
透過執行以下指令將 Token 加入 CLI:
hf auth login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential接著將你的 Hugging Face 儲存庫名稱儲存至變數中:
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
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" \
--dataset.streaming_encoding=true \
# --dataset.vcodec=auto \
--dataset.encoder_threads=2資料集上傳
你的資料集在本地儲存於此資料夾:~/.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)。
你可以在 Hub 上搜尋 LeRobot 標籤來尋找其他 LeRobot 資料集。
你也可以手動將本地資料集推送至 Hub,執行:
hf upload ${HF_USER}/record-test ~/.cache/huggingface/lerobot/{repo-id} --repo-type dataset記錄功能
record 函數提供了一套工具,用於在機器人運作期間擷取並管理資料。
1. 資料儲存
- 資料使用
LeRobotDataset格式,並在記錄時直接儲存於磁碟。 - 預設情況下,資料集會在記錄完成後推送至你的 Hugging Face 頁面。
- 若要停用上傳,請使用
--dataset.push_to_hub=False。
- 若要停用上傳,請使用
2. 檢查點 (Checkpointing) 與恢復 (Resuming)
- 記錄過程中會自動建立檢查點。
- 如果發生問題,你可以透過使用
--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 上,如果左右方向鍵與 ESC 鍵在資料記錄期間無效,請確保你已設定
$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。
訓練策略 (Policy)
要訓練控制機器人的策略,請使用 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 Silicon 上訓練。 - 我們提供了
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,你可以按照 ACT 訓練筆記本,利用 Google Colab 來訓練你的模型。
上傳策略檢查點
訓練完成後,使用以下指令上傳最新檢查點:
hf upload ${HF_USER}/act_so101_test \
outputs/train/act_so101_test/checkpoints/last/pretrained_model你也可以透過以下指令上傳中間檢查點:
CKPT=010000
hf upload ${HF_USER}/act_so101_test${CKPT} \
outputs/train/act_so101_test/checkpoints/${CKPT}/pretrained_model執行推理並評估你的策略
你可以使用 lerobot-record 中的 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" \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2 \
# --dataset.vcodec=auto \
# <- 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)。