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
)。