LeRobot機械臂教程
本教程已更新至12月15日,可選擇跟隨最新版官方文檔進行操作,官方文檔具體教程可以參考本鏈接。若需要URDF等文件請參考本鏈接。9月15日舊版本請參考該鏈接。SO-ARM101與SO-ARM100運行代碼相互兼容。
A. 教程說明
Pro版 黑色主動臂使用5V6A電源適配器,白色從動臂使用12V5A電源適配器!
舵機安裝和舵機角度校準要提前做好,可參考官方組裝教程,本教程不涉及這些內容!
組裝教程可參考 Lerobot机械臂组装教程
若未配置好舵機或未組裝機械臂,請先按照這個README中的內容操作。它包含了材料清單,以及獲取零件的鏈接,還包括3D打印零件的說明,以及如果您是第一次打印或者沒有3D打印機時的建議。
讓我們先從安裝 LeRobot 環境開始。
B. 環境準備
For Ubuntu X86:
Ubuntu 22.04
CUDA 12+
Python 3.10
Torch 2.6+
For Jetson Orin:
Jetson Jetpack 6.0+
Python 3.10
Torch 2.5.0a0+872d972e41
安裝 LeRobot 環境
1. 安裝 Miniconda環境:
需要根據你的 CUDA 版本安裝 pytorch 和 torchvision 等環境。
- 對於 Jetson:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
bash ~/Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc或者,對於 X86 Ubuntu 22.04:
mkdir -p ~/miniconda3
cd miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/miniconda3/bin/activate
conda init --all2. 在想要部署的 目錄(創建例如:lerobot) 下爲 lerobot 創建並激活一個新的 conda 環境:
請不要在 ~/miniconda3目錄下創建或者導入lerobot項目
conda create -y -n lerobot python=3.103. 然後激活您的 conda 環境(每次打開終端使用 lerobot 時都需要執行此操作!):
conda activate lerobot4. 克隆 LeRobot:
git clone https://github.com/Juxi-Technology/lerobot.git可選擇跟隨最新版: https://github.com/huggingface/lerobot.git
注:最新版本的命令代碼可能不一致!
5. 在您的環境中安裝 ffmpeg:
使用 miniconda 時,在您的環境中安裝 ffmpeg:
conda install ffmpeg -c conda-forge這通常會爲你的平臺安裝使用 libsvtav1 編碼器編譯的 ffmpeg 7.X。如果不支持 libsvtav1(可以通過 ffmpeg -encoders 查看支持的編碼器),你可以:
【適用於所有平臺】顯式安裝 ffmpeg 7.X:
安裝ffmpeg=7.1.1-c conda-forge
無圖形依賴(gdk-pixbuf、librsvg)用此命令安裝:
安裝ffmpeg=7.1.1-c conda-forge--no-deps
【僅限 Linux】安裝 ffmpeg 的構建依賴並從源碼編譯支持 libsvtav1 的 ffmpeg,並確保使用的 ffmpeg 可執行文件是正確的,可以通過 which ffmpeg 確認。
如果你遇到以下報錯,也可以使用上述命令解決。
6. 進入lerobot目錄下,安裝帶有 feetech 電機依賴的 LeRobot:
cd ~/lerobot && pip install -e ".[feetech]"對於 Jetson Jetpack 6.0+ 設備(請確保在執行此步驟前按照此鏈接教程第 5 步安裝了 Pytorch-gpu 和 Torchvision):
conda install -y -c conda-forge "opencv>=4.10.0.84" # 通过 conda 安装 OpenCV 和其他依赖,仅适用于 Jetson Jetpack 6.0+
conda remove opencv # 卸载 OpenCV
pip3 install opencv-python==4.10.0.84 # 使用 pip3 安装指定版本 OpenCV
conda install -y -c conda-forge ffmpeg
conda uninstall numpy
pip3 install numpy==1.26.0 # 该版本需与 torchvision 兼容7. 檢查 Pytorch 和 Torchvision
由於通過 pip 安裝 lerobot 環境時會卸載原有的 Pytorch 和 Torchvision 並安裝 CPU 版本,因此需要在 Python 中進行檢查。
import torch
print(torch.cuda.is_available())如果輸出結果爲 False,需要根據官網教程重新安裝 Pytorch 和 Torchvision。
如果你使用的是 Jetson 設備,請根據此教程安裝 Pytorch 和 Torchvision。
8. intelRealSense深度相機SDK依賴環境安裝(若有intelRealSense深度相機)
若需使用RealSense深度攝像頭,在lerobot/src/lerobot/下安裝pyrealsense2:
pip install pyrealsense2C. 機械臂控制
端口授權
連接好電源線,黑色主動臂使用5V6A電源適配器,白色從動臂使用12V5A電源適配器,舵機驅動板通過數據線連接到主機端
首先進入到lerobot/src/lerobot/目錄下
cd ~/lerobot/src/lerobot/然後激活您的 conda 環境(每次打開終端使用 lerobot 時都需要執行此操作!):
conda activate lerobot1. 運行腳本以查找端口
查找機械臂對應的 USB 端口 爲了找到每個機械臂正確的端口,請運行實用腳本兩次::
lerobot-find-port2. 示例輸出
識別Leader機械臂端口時的示例輸出(例如,Mac 上爲 /dev/tty.usbmodem575E0031751,或 Linux 上可能爲 /dev/ttyACM0):
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/ttyACM1
Reconnect the USB cable.識別Follower機械臂端口時的示例輸出(例如,/dev/tty.usbmodem575E0032081,或在 Linux 上可能爲 /dev/ttyACM1):
Finding all available ports for the MotorBus.
['/dev/ttyACM0', '/dev/ttyACM1']
Remove the usb cable from your MotorsBus and press Enter when done.
[...Disconnect corresponding leader or follower arm and press Enter...]
The port of this MotorsBus is /dev/ttyACM0
Reconnect the USB cable.請記住要拔出 USB 接頭,否則將無法檢測到接口。
3. 疑難解答
在 Linux 上,您需要通過運行以下命令來授予對 USB 端口的訪問權限:
sudo chmod 666 /dev/ttyACM0sudo chmod 666 /dev/ttyACM1校準機械臂
接下來,你需要對你的 SO-10x 機器人接上電源和數據線進行校準,以確保在相同的物理位置時,Leader機械臂和 Follower機械臂的位置信息一致。這個校準過程至關重要,因爲它可以讓在一個 SO-10x 機器人上訓練的神經網絡在另一個機器人上也能正常工作。如果需要重新校準機械臂,請完全刪除~/.cache/huggingface/lerobot/calibration/robots或者~/.cache/huggingface/lerobot/calibration/teleoperators下的文件並重新校準機械臂,否者會出現報錯提示,校準的機械臂信息會存儲該目錄下的json文件中。
1. Follower機械臂的手動校準
請通過 3 針接口連接 6 個機器人舵機的接口,並將底盤舵機連接到舵機驅動板,然後運行以下命令或 API 示例來校準機械臂:
以PC(linux)和jetson板卡爲例,第一個插入usb接口會映射爲ttyACM0,第二個插入usb接口會映射爲ttyACM1。
在運行代碼前請注意leader和follower的映射接口。
2. 接口授權
首先,您需要授予接口權限,運行以下命令:
sudo chmod 666 /dev/ttyACM*3. 然後校準Follower機械臂
接下來,通過運行以下 Python 命令來校準從動臂:
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm首先,您需要將機器人移動到所有關節都位於其 可活動範圍中間 的位置 並 保持機械臂不動。然後,按下回車鍵後,您必須將每個關節在其完整的運動範圍內移動,校準文件會記錄下可活動範圍的中位、最大值和最小值,並保存在~/.cache/huggingface/lerobot/calibration/robots或者~/.cache/huggingface/lerobot/calibration/teleoperators 目錄下json文件中。
4. 校準Leader機械臂
對主機械臂進行校準的步驟與上述相同,請運行以下命令或 API 示例:
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm[机械臂中位校准视频.mp4]
遙感操作
1. 簡單遙感****操作
然後,您就可以準備遙操作您的機器人了!運行這個簡單的腳本(它不會連接和顯示攝像頭):
請注意,與機器人關聯的 ID 用於存儲校準文件。在使用相同設置進行遙控操作、錄製和評估時,使用相同的 ID 至關重要。
先對串口給予權限:
sudo chmod 666 /dev/ttyACM*運行遙操作:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm遙控操作命令將自動執行以下步驟:
識別任何缺失的校準文件並啓動校準程序。
連接機器人和遙控設備,並開始遙控操作。
2. 帶攝像頭顯示的遠程操作
爲了實例化攝像頭,您需要一個攝像頭標識符。這個標識符可能會在您重啓電腦或重新插拔攝像頭時發生變化,這主要取決於您的操作系統。
要查找連接到您系統的攝像頭的攝像頭索引,請運行以下腳本:
lerobot-find-cameras realsense # or realsense for Intel Realsense cameras終端會打印相關攝像頭信息。
您可以在 ~/lerobot/outputs/captured_images 目錄中找到每臺攝像頭拍攝的圖片。
在 macOS 中使用 Intel RealSense 攝像頭時,您可能會遇到 “Error finding RealSense cameras: failed to set power state” 的錯誤。這可以通過使用 sudo 權限運行相同的命令來解決。請注意,在 macOS 中使用 RealSense 攝像頭是不穩定的。
之後,您就可以在遙控操作時在電腦上顯示攝像頭畫面了,只需運行以下代碼即可。這對於在錄製第一個數據集之前準備您的設置非常有用。
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=truefourcc: "MJPG"格式圖像是經過壓縮後的圖像,你可以嘗試更高分辨率,當然你可以嘗試YUYV格式圖像,但是這會導致圖像的分辨率和FPS降低導致機械臂運行卡頓。目前MJPG格式下可支持3個攝像頭1920*1080分辨率並且保持30FPS, 但是依然不推薦2個攝像頭通過同一個USB HUB接入主機
如果您有更多攝像頭,可以通過更改 --robot.cameras 參數來添加。您應該注意index_or_path 的格式,它由 python -m lerobot.find_cameras opencv 命令輸出的攝像頭 ID 的最後一位數字決定。
例如,如果你想添加攝像頭:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true如果你想添加RealSense深度相機,先運行python -m lerobot.find_cameras realsense 獲取Id,並將此命令中robot.cameras參數的serial_number_or_name: "323622271780" 替換爲自己的深度相機Id,use_depth: true 啓用深度流:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: intelrealsense, serial_number_or_name: "323622271780", width: 1280, height: 720, fps: 30, use_depth: true}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=trueD. 數據採集
記錄一個數據集
- 如果你想數據集保存在本地,可以直接運行:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=juxi/test \
--dataset.num_episodes=5 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.push_to_hub=false \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30其中dateset.repo_id和dataset.single_task可以自定義修改,push_to_hub=false,最後數據集會保存在主目錄的~/.cache/huggingface/lerobot下會創建上述juxi/test文件夾,若使用RealSense深度相機,可自行修改運行命令
- 如果您想使用 Hugging Face Hub 的功能來上傳您的數據集,並且您之前尚未這樣做,請確保您已使用具有寫入權限的令牌登錄,該令牌可以從 Hugging Face 設置 中生成:
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:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.push_to_hub=true \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30你會看到類似如下數據:
INFO 2024-08-10 15:02:58 ol_robot.py:219 dt:33.34 (30.0hz) dtRlead: 5.06 (197.5hz) dtWfoll: 0.25 (3963.7hz) dtRfoll: 6.22 (160.7hz) dtRlaptop: 32.57 (30.7hz) dtRphone: 33.84 (29.5hz)參數說明
episode_time_s: 表示每次收集數據的時間。
reset_time_s: 是每次數據收集之間的準備時間。
num_episodes: 表示預期收集多少組數據。
push_to_hub: 決定是否將數據上傳到 HuggingFace Hub。
| 按鍵 | 動作 |
|---|---|
| 右箭頭 → | 提前終止當前劇集/重置;進入下一個。 |
| 左箭頭 ← | 取消當前劇集;重新錄製。 |
| ESC | 立即停止會話,編碼視頻,並上傳數據集。 |
數據收集技巧
任務建議:在不同位置抓取物體並將其放入箱子中。
規模:記錄 ≥50 個劇集(每個位置 10 個劇集)。
一致性:
保持攝像頭固定。
保持相同的抓取行爲。
確保操作的物體在攝像頭畫面中可見。
逐步推進:
先從可靠的抓取開始,然後再增加變化(新位置、抓取技巧、攝像頭調整)。
避免複雜性急劇增加,以防止失敗。
💡 經驗法則:僅使用攝像頭畫面作爲指導,只根據屏幕反饋的視頻圖像,來控制機械臂完成任務。
如果你想要深入瞭解這個重要主題,可以查看我們撰寫的關於什麼是好的數據集的博客文章。
在接下來的章節中,你將訓練你的神經網絡。在實現可靠的抓取性能後,你可以在數據收集過程中引入更多變化,例如增加抓取位置、不同的抓取技巧以及改變相機位置。
避免快速添加過多變化,因爲這可能會阻礙您的結果。
"如果你希望將數據保存在本地 (
--dataset.push_to_hub=false),請將--dataset.repo_id=${HF_USER}/so101_test替換爲一個自定義的本地文件夾名稱,例如--dataset.repo_id=juxi/so101_test。數據將存儲在系統主目錄下的~/.cache/huggingface/lerobot."如果你通過
--dataset.push_to_hub=true將數據集上傳到了 Hugging Face Hub,可以通過 在線可視化你的數據集,只需複製粘貼你的 repo id。在回合記錄過程中任何時候按下右箭頭 → 可提前停止並進入重置狀態。重置過程中同樣,可提前停止並進入下一個回合記錄。
在錄製或重置到早期階段時,隨時按左箭頭 ← 可提前停止當前劇集,並重新錄製。
在錄製過程中隨時按 ESCAPE ESC 可提前結束會話,直接進入視頻編碼和數據集上傳。
可以通過重新運行相同的命令並添加
--resume=true來恢復錄製。⚠️ 重要提示:在恢復時,需將--dataset.num_episodes設置爲要額外記錄的劇集數量(而不是數據集中目標的總劇集數量)。如果要從頭開始錄製,請手動刪除數據集目錄。在 Linux 上,如果在數據記錄期間左右箭頭鍵和 Esc 鍵沒有效果,請確保您已設置 $DISPLAY 環境變量。參見 pynput 限制。
如果你的鍵盤按下後沒有反應,可能你需要降低你pynput的版本,例如安裝個1.6.8版本的。
安裝pynput==1.6.8
可視化一個數據集(可跳過,可嘗試)
echo ${HF_USER}/so101_test如果您沒有使用 --dataset.push_to_hub=false ,並上傳了數據,您也可以在本地通過以下命令進行可視化:
lerobot-dataset-viz \
--repo-id ${HF_USER}/so101_test \如果您使用了 --dataset.push_to_hub=false ,沒有上傳數據,您也可以通過以下命令在本地進行可視化:
lerobot-dataset-viz \
--repo-id juxi/test \這裏,juxi 是數據收集時自定義的 repo_id 名稱。
回放一個片段(可跳過,可嘗試)
現在,嘗試在您的機器人上重播第一個數據集:
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.episode=0此時,機器人應該做出與你遙操記錄時一樣的動作。
E. 數據集訓練及評估
ACT
參考官方教程ACT
訓練
要訓練一個控制您機器人策略,使用 python -m lerobot.scripts.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=false \
--steps=300000如果您想在本地數據集上進行訓練,請確保 repo_id 與數據收集時使用的名稱匹配,並添加 --policy.push_to_hub=false。
lerobot-train \
*--dataset.repo_id*=juxi/test \
*--policy.type*=act \
*--output_dir*=outputs/train/act_so101_test \
*--job_name*=act_so101_test \
*--policy.device*=cuda \
*--wandb.enable*=false \
*--policy.push_to_hub*=false\
*--steps*=300000命令解釋
數據集指定:我們通過
--dataset.repo_id=${HF_USER}/so101_test參數提供了數據集。訓練步數:我們通過
--steps=300000修改訓練步數,算法默認爲800000,根據自己的任務難易程度,觀察訓練時候的loss來進行調整。策略類型:我們使用
policy.type=act提供了策略,同樣你可以更換[act,diffusion,pi0,pi0fast,pi0.5,sac,smolvla]等策略,這將從configuration_act.py加載配置。重要的是,這個策略會自動適應您機器人(例如laptop和phone)的電機狀態、電機動作和攝像頭數量,這些信息已保存在您的數據集中。設備選擇:我們提供了
policy.device=cuda,因爲我們正在 Nvidia GPU 上進行訓練,但您可以使用policy.device=mps在 Apple Silicon 上進行訓練。可視化工具:我們提供了
wandb.enable=true來使用 Weights and Biases 可視化訓練圖表。這是可選的,但如果您使用它,請確保您已通過運行wandb login登錄。
如果你遇到了以下報錯:
嘗試運行以下命令來解決:
pip install datasets==2.19訓練可能需要幾個小時。您將在 outputs/train/act_so101_test/checkpoints 目錄中找到訓練結果權重文件。
要從某個訓練結果權重文件恢復訓練,下面是一個從 act_so101_test 策略的最後一個訓練結果權重文件恢復訓練的示例命令:
lerobot-train \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true評估
您可以使用 lerobot/record.py 中的 record 功能,但需要將策略訓練結果訓練結果權重文件作爲輸入。例如,運行以下命令記錄 10 個評估回合:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30,fourcc: "MJPG"}}" \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
--dataset.push_to_hub=false--policy.path參數,指示您的策略訓練結果權重文件的路徑(例如outputs/train/act_so101_test/checkpoints/last/pretrained_model)。如果您將模型訓練結果權重文件上傳到 Hub,也可以使用模型倉庫(例如${HF_USER}/act_so101_test)。數據集的名稱
dataset.repo_id以eval_開頭,這個操作會在你評估的時候爲你單獨錄製評估時候的視頻和數據,將保存在eval_開頭的文件夾下,例如juxi/eval_test123。如果評估階段遇到
File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/juxi/eval_xxxx'請先刪除eval_開頭的這個文件夾再次運行程序。當遇到
mean is infinity. You should either initialize with stats as an argument or use a pretrained model請注意--robot.cameras這個參數中的front和side等關鍵詞必須和採集數據集的時候保持嚴格一致。
斯莫夫拉
參考官方教程SmolVLA
pip install -e ".[smolvla]"訓練
lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=${HF_USER}/mydataset \
--batch_size=64 \
--steps=20000 \
--output_dir=outputs/train/my_smolvla \
--job_name=my_smolvla_training \
--policy.device=cuda \
--wandb.enable=true驗證
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \ # <- Use your robot id
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30,fourcc: "MJPG"}}" \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.repo_id=juxi/eval_test123 \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=so101_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_awesome_leader_arm \
--policy.path=HF_USER/FINETUNE_MODEL_NAME # <- Use your fine-tuned modelPi0
參考官方教程Pi0
pip install -e ".[pi]"訓練
lerobot-train \
--policy.type=pi0 \
--dataset.repo_id=juxi/eval_test123 \
--job_name=pi0_training \
--output_dir=outputs/pi0_training \
--policy.pretrained_path=lerobot/pi0_base \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--policy.dtype=bfloat16 \
--steps=20000 \
--policy.device=cuda \
--batch_size=32 \
--wandb.enable=false驗證
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30,fourcc: "MJPG"}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--policy.path=outputs/pi0_training/checkpoints/last/pretrained_modelPi0.5
參考官方教程Pi0.5
pip install -e ".[pi]"訓練
lerobot-train \
--dataset.repo_id=juxi/eval_test123 \
--policy.type=pi05 \
--output_dir=outputs/pi05_training \
--job_name=pi05_training \
--policy.pretrained_path=lerobot/pi05_base \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--wandb.enable=false \
--policy.dtype=bfloat16 \
--steps=3000 \
--policy.device=cuda \
--batch_size=32驗證
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30,fourcc: "MJPG"}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--policy.path=outputs/pi05_training/checkpoints/last/pretrained_modelGR00T N1.5
請參考官方教程GR00T N1.5
F.雲服務器訓練部署及模型導出
以 AutoDL算力雲 爲例, www.autodl.com ,註冊登錄充值餘額
1.點擊“算力市場”,選擇需要的顯卡,儘量選多核心
2.選擇“按量計費”,基礎鏡像選擇“Miniconda/conda3/3.8(ubuntu20.04)/11.8”,點擊“立即創建”
3.點擊“JupyterLab”進入控制界面,打開終端
4.初始化conda環境
conda env listconda activate baseconda init5.關閉此終端,打開新的終端,配置學術資源加速
參考 https://www.autodl.com/docs/network_turbo/
source /etc/network_turbo6.創建lerobot環境
conda create -y -n lerobot python=3.10conda activate lerobotgit clone https://github.com/JuxiTechnology/lerobot.git可選擇跟隨最新版: https://github.com/huggingface/lerobot.git
注:最新版本的命令代碼可能不一致!
conda install ffmpeg -c conda-forge7.進入src目錄下的lerobot,安裝帶有 feetech 電機依賴的 LeRobot:
cd ~/lerobot && pip install -e ".[feetech]"8.數據集導入到雲服務器裏
分爲兩種情況,一種是數據採集 時已上傳數據集到huggingface數據庫裏,一種是未上傳數據集到huggingface數據庫裏,通過FileZilla上傳本地數據集到雲服務器裏。
①若 數據採集 時已上傳數據集到huggingface數據庫裏,可通過配置huggingface數據庫得到的key獲取
huggingface-cli login --token ${HUGGINGFACE_TOKEN} --add-to-git-credentialHF_USER=$(huggingface-cli whoami | head -n 1)echo $HF_USERexport HYDRA_FULL_ERROR=1②通過FileZilla上傳本地數據集,參考 https://www.autodl.com/docs/filezilla/
Linux最簡單的安裝方式:
sudo apt install filezillafilezilla打開filezilla,點擊“文件”選擇“站點管理器”,創建“新站點”,選擇“SFTP協議”
返回AutoDL算力雲複製“登錄指令”並粘貼到方便查看的地方,將對應信息複製粘貼進去,點擊“連接”
在雲服務器的lerobot目錄下 創建 data 文件夾
將數據集文件夾 拉到 右邊 進行傳輸,等待傳輸完成
9.數據集訓練
參考本教程的 E.數據集訓練及評估,在雲服務器中運行訓練命令
10.模型文件導出
訓練完成後,將對應train目錄下的訓練模型導出
G. 常見問題
如果使用本文檔教程,請git clone本文檔推薦的github倉庫 https://github.com/JuxiTechnology/lerobot.git
本文檔推薦的倉庫是驗證過後的穩定版本,Lerobot官方倉庫是實時更新的最新版本,會出現一些無法預知的問題,例如數據集版本不同,指令不同等。
在Jetson設備中,運行評估命令後未設置回合數和回合時間只能通過ctrl+z中斷進程會導致機械臂和相機斷連,重連後所有端口都改變
在命令中加入評估的回合數和回合時長的參數
如:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30,fourcc: "MJPG"}}" \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=false \
--dataset.repo_id=juxi/eval_test123 \
--dataset.single_task="Put the blue cube on the black box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30 \
--dataset.num_episodes=5 \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
--dataset.push_to_hub=false- 如果校準舵機ID時候遇到
`Motor ‘gripper’ was not found, Make sure it is connected`請仔細檢查通訊線是否與舵機連接正常,電源是否正確電壓供電。”
- 如果遇到
Could not connect on port "/dev/ttyACM0"並且通過ls /dev/ttyACM*看到是有ACM0存在的,則是忘記給串口權限了,終端輸入sudo chmod 666 /dev/ttyACM* 即可`
- 如果遇到
No valid stream found in input file. Is -1 of the desired media type?請安裝ffmpeg7.1.1,conda install ffmpeg=7.1.1-c conda-forge。
- 如果遇到
ConnectionError: Failed to sync read 'Present_Position' on ids=[1,2,3,4,5,6] after 1 tries. [TxRxResult] There is no status packet!需要檢查對應端口號的機械臂是否接通電源,總線舵機是否出現數據線鬆動或者脫落,哪個舵機燈不亮就是前面那個舵機的線鬆了。
- 如果校準機械臂的時候遇到
Magnitude 30841 exceeds 2047 (max for sign_bit_index=11)對機械臂進行重新斷電和上電,再次嘗試校準機械臂加準,如果在校準過程中遇到MAX角度達到上萬的值也可以使用這個方法,如果不行則需要對相應舵機進行重新舵機校準,即中位校準和ID寫入。
- 如果評估階段遇到
File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/juxi/eval_xxxx'請先刪除eval_開頭的這個文件夾再次運行程序。
- 如果評估階段遇到
`mean` is infinity. You should either initialize with `stats` as an argument or use a pretrained model請注意--robot.cameras這個參數中的front和side等關鍵詞必須和採集數據集的時候保持嚴格一致。
如果你維修或者更換過機械臂零件,請完全刪除
~/.cache/huggingface/lerobot/calibration/robots或者~/.cache/huggingface/lerobot/calibration/teleoperators下的文件並重新校準機械臂,否者會出現報錯提示,校準的機械臂信息會存儲該目錄下的json文件中。在3060的8G筆記本上訓練ACT的50組數據的時間大概爲6小時,在4090和A100的電腦上訓練50組數據時間大概爲2~3小時。
數據採集過程中要確保攝像頭位置和角度和環境光線的穩定,並且減少攝像頭採集到過多的不穩定背景和行人,否則部署的環境變化過大會導致機械臂無法正常抓取。
數據採集命令的num-episodes要確保採集數據足夠,不可中途手動暫停,因爲在數據採集結束後纔會計算數據的均值和方差,這在訓練中是必要的數據。
如果程序提示無法讀取USB攝像頭圖像數據,請確保USB攝像頭不是接在Hub上的,USB攝像頭必須直接接入設備,確保圖像傳輸速率快。
如果你遇到無法解決的軟件問題或環境依賴問題,除了查看本教程末尾的常見問題 部分外,請及時在 LeRobot 平臺 或 LeRobot Discord 頻道 反饋問題。
Windows查找舵機(飛特舵機上位機調試軟件)
爲了進行調試,任何 Windows PC 都可以通過 USB 連接來對舵機進行編程、調試或測試。爲此,請下載Feetech 軟件。對於 Ubuntu 系統,您可以使用FT_SCServo_Debug_Qt 工具。
[fddebug-master.zip]
選擇端口號,波特率選1000000,打開,並點擊“搜索”
ROS2 仿真控制(可自行實現)
https://github.com/holmsslk/so-arm-moveit-hardware
網頁端設置舵機ID和中位校準
https://bambot.org/feetech.js?lang=zh
1、根據舵機型號輸入0或1,點擊“連接”
2、掃描ID 1~6 的舵機,可以根據掃描結果裏的FOUND確認對應ID舵機。例如圖片裏舵機 ID 1 被掃描到了
3、ID設置和中位校準
①當前舵機ID輸入爲被掃描到的舵機ID
②在“ID管理”中輸入數字,點擊“更改ID”即可設置ID
③中位校準(STS3215舵機中位是2047,SCS0009舵機中位是511)
STS舵機:在“位置控制”輸入2047,並點擊“Set”
SCS舵機:在“位置控制”輸入511,並點擊“Set”
