旧バージョンLerobotでSO-ARM100およびSO-ARM101ロボットアームを使用する方法
このチュートリアルリポジトリは、2025年6月5日時点で検証された安定版Lerobotを維持しています。現在、Hugging Faceは多くの新機能を導入したLerobotの大幅なアップグレードを展開しています。最新のチュートリアルを体験したい場合は、公式ドキュメントのガイダンスに従ってください。
はじめに
SO-10xARMは、TheRobotStudioによって開始された完全オープンソースのロボットアームプロジェクトです。フォロワーアームとリーダーロボットアームが含まれており、詳細な3Dプリントファイルと操作ガイドも提供されています。LeRobotは、PyTorchで実世界のロボティクス向けのモデル、データセット、ツールを提供することに取り組んでいます。その目的は、ロボティクスの参入障壁を下げ、誰もがデータセットと事前訓練済みモデルの共有に貢献し、恩恵を受けることができるようにすることです。LeRobotは、模倣学習を中心とした実世界での応用に検証された最先端の方法論を統合しています。人間が収集したデモンストレーションを特徴とする事前訓練済みモデル、データセット、シミュレーション環境のスイートを提供し、ユーザーがロボットの組み立ての必要なしに開始できるようにしています。今後数週間で、現在利用可能な最もコスト効率的で有能なロボットでの実世界ロボティクスのサポートを拡張する予定です。
プロジェクト紹介
SO-ARM10xとreComputer Jetson AIインテリジェントロボットキットは、高精度ロボットアーム制御と強力なAIコンピューティングプラットフォームをシームレスに組み合わせ、包括的なロボット開発ソリューションを提供します。このキットは、Jetson OrinまたはAGX Orinプラットフォームをベースとし、SO-ARM10xロボットアームとLeRobot AIフレームワークを組み合わせて、教育、研究、産業自動化などの複数のシナリオに適用可能なインテリジェントロボットシステムをユーザーに提供します。 このwikiは、SO ARM10xの組み立てとデバッグのチュートリアルを提供し、Lerobotフレームワーク内でのデータ収集とトレーニングを実現します。

主な特徴
- オープンソースで低コスト:TheRobotStudioからのオープンソース、低コストロボットアームソリューションです
- LeRobotとの統合:LeRobotプラットフォームとの統合のために設計されています
- 豊富な学習リソース:組み立てと校正ガイド、テスト、データ収集、トレーニング、デプロイメントのチュートリアルなど、包括的なオープンソース学習リソースを提供し、ユーザーが迅速に開始してロボットアプリケーションを開発できるよう支援します。
- Nvidiaとの互換性:reComputer Mini J4012 Orin NX 16 GBでこのアームキットをデプロイします。
- マルチシーン応用:教育、科学研究、自動化生産、ロボティクスなどの分野に適用可能で、ユーザーが様々な複雑なタスクで効率的で精密なロボット操作を実現できるよう支援します。
新機能:
- 配線の最適化:SO-ARM100と比較して、SO-ARM101は改良された配線を特徴とし、以前にジョイント3で見られた切断問題を防ぎます。新しい配線設計により、ジョイントの可動範囲も制限されなくなりました。
- リーダーアームの異なるギア比:リーダーアームは最適化されたギア比のモーターを使用し、性能を向上させ、外部ギアボックスの必要性を排除しました。
- 新機能サポート:リーダーアームがフォロワーアームをリアルタイムで追従できるようになりました。これは、人間がロボットの動作に介入して修正できる今後の学習ポリシーにとって重要です。
Seeed Studioは、ハードウェア自体の品質についてのみ責任を負います。チュートリアルは公式ドキュメントに厳密に従って更新されます。ソフトウェアの問題や環境依存の問題で解決できない場合は、このチュートリアルの最後にあるFAQセクションを確認することに加えて、LeRobotプラットフォームまたはLeRobot Discordチャンネルに問題を速やかに報告してください。
仕様
タイプ | SO-ARM100 | SO-ARM101 | ||
---|---|---|---|---|
アームキット | アームキットPro | アームキット | アームキットPro | |
リーダーアーム | 全ジョイント用の1:345ギア比を持つ12x ST-3215-C001 (7.4V) モーター | 全ジョイント用の1:345ギア比を持つ12x ST-3215-C018/ST-3215-C047 (12V) モーター | ジョイント2のみ用の1:345ギア比を持つ1x ST-3215-C001 (7.4V) モーター | |
フォロワーアーム | SO-ARM100と同じ | |||
電源 | 5.5 mm × 2.1 mm DC 5 V 4 A | 5.5 mm × 2.1 mm DC 12 V 2 A | 5.5 mm × 2.1 mm DC 5 V 4 A | 5.5 mm × 2.1 mm DC 12 V 2 A(フォロワーアーム) |
角度センサー | 12ビット磁気エンコーダー | |||
推奨動作温度 | 0 °C から 40 °C | |||
通信 | UART | |||
制御方法 | PC |
アームキット版を購入した場合、両方の電源は5Vです。アームキットPro版を購入した場合は、リーダーロボットアームの校正とすべてのステップに5V電源を使用し、フォロワーロボットアームの校正とすべてのステップに12V電源を使用してください。
部品表(BOM)
部品 | 数量 | 含まれる |
---|---|---|
サーボモーター | 12 | ✅ |
モーター制御ボード | 2 | ✅ |
USB-Cケーブル 2本 | 1 | ✅ |
電源2 | 2 | ✅ |
テーブルクランプ | 4 | ✅ |
アームの3Dプリント部品 | 1 | オプション |
初期システム環境
Ubuntu x86の場合:
- Ubuntu 22.04
- CUDA 12+
- Python 3.10
- Torch 2.6
Jetson Orinの場合:
- Jetson JetPack 6.2
- Python 3.10
- Torch 2.6
目次
3Dプリントガイド
SO101の公式アップデートに伴い、SO100は公式によりサポートが終了し、ソースファイルが削除される予定ですが、ソースファイルは引き続き私たちのMakerworldで見つけることができます。ただし、以前にSO100を購入したユーザーについては、チュートリアルとインストール方法は引き続き互換性があります。SO101のプリントは、SO100のモーターキットインストールと完全に互換性があります。
ステップ1:プリンターを選択する
提供されるSTLファイルは、多くのFDMプリンターでプリント可能です。以下はテスト済みで推奨される設定ですが、他の設定でも動作する可能性があります。
- 材料:PLA+
- ノズル径と精度:0.2mmレイヤー高さでの0.4mmノズル径、または0.4mmレイヤー高さでの0.6mmノズル。
- 充填密度:15%
ステップ 2: プリンターのセットアップ
- プリンター固有の手順を使用して、プリンターが校正され、ベッドレベルが正しく設定されていることを確認してください。
- プリントベッドを清掃し、ほこりや油脂がないことを確認してください。水やその他の液体でベッドを清掃する場合は、ベッドを乾燥させてください。
- プリンターが推奨する場合は、標準的なグルースティックを使用し、ベッドのプリント領域全体に薄く均一な接着剤の層を塗布してください。塊や不均一な塗布は避けてください。
- プリンター固有の手順を使用してプリンターフィラメントをロードしてください。
- プリンター設定が上記で推奨されたものと一致することを確認してください(ほとんどのプリンターには複数の設定があるため、最も近いものを選択してください)。
- 水平面に対して45度を超える傾斜は無視して、すべての場所にサポートを設定してください。
- 水平軸を持つネジ穴にはサポートがないようにしてください。
ステップ 3: パーツの印刷
リーダーまたはフォロワーのすべてのパーツは、簡単な3Dプリント用に既に単一ファイルに含まれており、サポートを最小限に抑えるためにz軸上向きに正しく配向されています。
-
220mmx220mmのプリンターベッドサイズ(Enderなど)の場合、これらのファイルを印刷してください:
-
205mm x 250mmのプリンターベッドサイズ(Prusa/Upなど)の場合:
LeRobotのインストール
pytorchやtorchvisionなどの環境は、お使いのCUDAに基づいてインストールする必要があります。
- Minicondaのインストール: Jetson用:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
./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 --all
- lerobot用の新しいconda環境を作成してアクティベート
conda create -y -n lerobot python=3.10 && conda activate lerobot
- Lerobotのクローン:
git clone https://github.com/ZhuYaoHui1998/lerobot.git ~/lerobot
私たちはOrbbec Gemini2深度カメラを適応させ、単一の深度カメラが2つのRGBカメラよりも優れた性能を発揮することを発見しました。このカメラも使用している場合は、変換リポジトリブランチをOrbbecにクローンし、その後の手順に従ってカメラを設定してください。
cd ~/lerobot
git checkout orbbec
RGBのみを使用している場合は、ブランチを切り替えないでください。そうしないと依存関係関連のエラーが発生する可能性があります。既にorbbec
に切り替えて元のバージョンに戻したい場合:
cd ~/lerobot
git checkout main
- minicondaを使用する場合、環境にffmpegをインストール:
conda install ffmpeg -c conda-forge
これは通常、libsvtav1エンコーダーでコンパイルされたプラットフォーム用のffmpeg 7.Xをインストールします。libsvtav1がサポートされていない場合(ffmpeg -encodersでサポートされているエンコーダーを確認)、以下を実行できます:
- [すべてのプラットフォーム] 以下を使用してffmpeg 7.Xを明示的にインストール:
conda install ffmpeg=7.1.1 -c conda-forge
- [Linuxのみ] ffmpegビルド依存関係をインストールし、libsvtav1でソースからffmpegをコンパイルし、which ffmpegでインストールに対応するffmpegバイナリを使用していることを確認してください。
- feetechモーター用の依存関係を含むLeRobotのインストール:
cd ~/lerobot && pip install -e ".[feetech]"
- (このステップはX86 Ubuntuコンピューター側ではスキップできます。)Jetson Jetpackデバイス用(このステップを実行する前に、ステップ5からPytorch-gpuとTorchvisionをインストールしていることを確認してください):
conda install -y -c conda-forge "opencv>=4.10.0.84" # Install OpenCV and other dependencies through conda, this step is only for Jetson Jetpack 6.0+
conda remove opencv # Uninstall OpenCV
pip3 install opencv-python==4.10.0.84 # Then install opencv-python via pip3
conda install -y -c conda-forge ffmpeg
conda uninstall numpy
pip3 install numpy==1.26.0 # This should match torchvision
- PytorchとTorchvisionの確認
pipを介してlerobot環境をインストールすると、元のPytorchとTorchvisionがアンインストールされ、PytorchとTorchvisionのCPUバージョンがインストールされるため、Pythonで確認を実行する必要があります。
import torch
print(torch.cuda.is_available())
印刷された結果がFalseの場合、公式ウェブサイトのチュートリアルに従ってPytorchとTorchvisionを再インストールする必要があります。
Jetsonデバイスを使用している場合は、このチュートリアルに従ってPytorchとTorchvisionをインストールしてください。
モーターの設定
公式コードとサーボメーカーのファームウェア更新により、2025年6月30日以前のユーザーは、まずFeetech公式ホストコンピューターソフトウェア(Windowsシステム用)をダウンロードしてください。すべてのサーボに電源を入れて接続し、対応するPort Number
-> Baudrate 1000000
-> Open
-> Search
を選択してください。すべてのサーボを検出した後、Upgrade
-> Online Detection
-> Upgrade Firmware
をクリックして、ファームウェアバージョンが3.9から3.10に更新されていることを確認し、後続の問題を回避してください。
ファームウェア更新に失敗した後にサーボが再び認識されない場合は、検出可能な別のサーボをホストコンピューターに直接接続し、モータースキャンとファームウェアオンライン検出を実行できます。現在のウィンドウを開いたままにし、すぐに現在のサーボを切断し、代わりに認識されないサーボを接続してください。1秒以内に「オンラインアップグレード」をクリックしてください。失敗した場合は、複数回再試行できます。
- SO101
- SO100
SO-ARM101のサーボ校正と初期化プロセスは、方法とコードの両方でSO-ARM100と同じです。ただし、SO-ARM101リーダーアームの最初の3つの関節のギア比はSO-ARM100と異なるため、注意深く区別して校正することが重要です。
モーターを設定するには、リーダーアーム用に1つのバスサーボアダプターと6つのモーターを指定し、同様にフォロワーアーム用に他のバスサーボアダプターと6つのモーターを指定します。それらにラベルを付け、各モーターがフォロワーF用かリーダーL用か、そして1から6までのIDを書くと便利です。F1–F6を使用してフォロワーアームの関節1から6を表し、L1–L6を使用してリーダーアームの関節1から6を表します。対応するサーボモデル、関節割り当て、およびギア比の詳細は以下の通りです:
サーボモデル | ギア比 | 対応する関節 |
---|---|---|
ST-3215-C044(7.4V) | 1:191 | L1 |
ST-3215-C001(7.4V) | 1:345 | L2 |
ST-3215-C044(7.4V) | 1:191 | L3 |
ST-3215-C046(7.4V) | 1:147 | L4–L6 |
ST-3215-C001(7.4V) / C018(12V) / C047(12V) | 1:345 | F1–F6 |
モーターバスに5Vまたは12Vの電源を接続してください。STS3215 7.4Vモーター用には5V、STS3215 12Vモーター用には12Vです。リーダーアームは常に7.4Vモーターを使用するため、12Vと7.4Vモーターがある場合は正しい電源を接続するよう注意してください。そうしないとモーターを焼損する可能性があります!次に、USBを介してモーターバスをコンピューターに接続してください。USBは電力を供給しないため、電源とUSBの両方を接続する必要があります。

アームに関連するUSBポートを見つける 各アームの正しいポートを見つけるには、ユーティリティスクリプトを2回実行してください:
python lerobot/scripts/find_motors_bus_port.py
リーダーアームのポートを識別する際の出力例(例:Macでは/dev/tty.usbmodem575E0031751
、Linuxでは/dev/ttyACM0
の可能性):
フォロワーアームのポートを識別する際の出力例(例:/dev/tty.usbmodem575E0032081
、またはLinuxでは/dev/ttyACM1
の可能性):
トラブルシューティング:Linuxでは、以下を実行してUSBポートへのアクセス権を付与する必要がある場合があります:
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
モーターの設定
リーダーモーター(ST-3215-C046、C044、001)の校正には5V電源を使用してください。
リーダーアーム関節6校正 | リーダーアーム関節5校正 | リーダーアーム関節4校正 | リーダーアーム関節3校正 | リーダーアーム関節2校正 | リーダーアーム関節1校正 |
---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Arm Kit版(ST-3215-C001)を購入した場合は、5V電源を使用してください。Arm Kit Pro版を購入した場合は、サーボの校正に12V電源を使用してください(ST-3215-C047/ST-3215-C018)。
フォロワーアーム関節6校正 | フォロワーアーム関節5校正 | フォロワーアーム関節4校正 | フォロワーアーム関節3校正 | フォロワーアーム関節2校正 | フォロワーアーム関節1校正 |
---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
SO-ARM100サーボ校正ビデオも参考にできますが、サーボ関節IDとギア比がSO-ARM101のものと厳密に対応していることを確認してください。
最初のモーターを接続し、このスクリプトを実行してIDを1に設定します。現在位置も2048に設定されるため、モーターが回転することを予期してください:
python lerobot/scripts/configure_motor.py \
--port /dev/ttyACM0 \
--brand feetech \
--model sts3215 \
--baudrate 1000000 \
--ID 1
注意:これらのモーターは現在制限されています。0から4096の値のみを取ることができ、これは1回転に相当します。それ以上回転することはできません。2048はこの範囲の中央にあるため、-2048ステップ(反時計回りに180度)を取って最大範囲に到達するか、+2048ステップ(時計回りに180度)を取って最大範囲に到達できます。設定ステップではホーミングオフセットも0に設定されるため、アームを誤って組み立てた場合でも、常にホーミングオフセットを更新して±2048ステップ(±180度)までのシフトを考慮できます。
次に、モーターを取り外し、2番目のモーターを接続してIDを2に設定します。
python lerobot/scripts/configure_motor.py \
--port /dev/ttyACM0 \
--brand feetech \
--model sts3215 \
--baudrate 1000000 \
--ID 2
ID 6まですべてのモーターに対してこのプロセスを繰り返します。リーダーアームの6つのモーターについても同様に行います。
リーダーアーム用に1つのバスサーボアダプターと6つのモーターを指定し、同様にフォロワーアーム用にもう1つのバスサーボアダプターと6つのモーターを指定します。それらにラベルを付け、各モーターがフォロワー用(F)かリーダー用(L)か、そして1から6までのID(F1...F6およびL1...L6)を書いておくと便利です。
以下のスクリプトの使用を説明する組み立てビデオのステップ1に従ってください。
アームに関連付けられたUSBポートを見つける 各アームの正しいポートを見つけるには、ユーティリティスクリプトを2回実行します:
python lerobot/scripts/find_motors_bus_port.py
リーダーアームのポートを識別する際の出力例(例:Macでは/dev/tty.usbmodem575E0031751
、Linuxでは/dev/ttyACM0
の可能性があります):
フォロワーアームのポートを識別する際の出力例(例:/dev/tty.usbmodem575E0032081
、またはLinuxでは/dev/ttyACM1
の可能性があります):
トラブルシューティング:Linuxでは、以下を実行してUSBポートへのアクセス権を付与する必要がある場合があります:
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
モーターを設定する
最初のモーターを接続し、このスクリプトを実行してIDを1に設定します。現在位置も2048に設定されるため、モーターが回転することを予期してください:
python lerobot/scripts/configure_motor.py \
--port /dev/ttyACM0 \
--brand feetech \
--model sts3215 \
--baudrate 1000000 \
--ID 1
注意:これらのモーターは現在制限されています。0から4096の値のみを取ることができ、これは1回転に相当します。それ以上回転することはできません。2048はこの範囲の中央にあるため、-2048ステップ(反時計回りに180度)を取って最大範囲に到達するか、+2048ステップ(時計回りに180度)を取って最大範囲に到達できます。設定ステップではホーミングオフセットも0に設定されるため、アームを誤って組み立てた場合でも、常にホーミングオフセットを更新して±2048ステップ(±180度)までのシフトを考慮できます。
次に、モーターを取り外し、2番目のモーターを接続してIDを2に設定します。
python lerobot/scripts/configure_motor.py \
--port /dev/ttyACM0 \
--brand feetech \
--model sts3215 \
--baudrate 1000000 \
--ID 2
ID 6まですべてのモーターに対してこのプロセスを繰り返します。リーダーアームの6つのモーターについても同様に行います。
組み立て
-
SO-ARM101のデュアルアーム組み立てプロセスは、SO-ARM100と同じです。唯一の違いは、SO-ARM101にケーブルクリップが追加されていることと、リーダーアームの関節サーボのギア比が異なることです。そのため、SO100とSO101の両方とも、以下の内容を参照して取り付けることができます
-
サーボを校正した後、ネジを締める前にサーボを回転させないでください。3Dプリント部品の向きが画像の基準方向と一致し、モーターが中央位置にあることを確認してください。
-
組み立て前に、モーターモデルと減速比を再度確認してください。SO100を購入した場合は、このステップを無視できます。SO101を購入した場合は、以下の表を確認してF1からF6およびL1からL6を区別してください。
サーボモデル | ギア比 | 対応する関節 |
---|---|---|
ST-3215-C044(7.4V) | 1:191 | L1 |
ST-3215-C001(7.4V) | 1:345 | L2 |
ST-3215-C044(7.4V) | 1:191 | L3 |
ST-3215-C046(7.4V) | 1:147 | L4–L6 |
ST-3215-C001(7.4V) / C018(12V) / C047(12V) | 1:345 | F1–F6 |
SO101 Arm Kit Standard Editionを購入した場合、すべての電源は5Vです。SO101 Arm Kit Pro Editionを購入した場合、リーダーアームは各ステップで5V電源を使用して校正・動作させ、フォロワーアームは各ステップで12V電源を使用して校正・動作させる必要があります。
リーダーアームの組み立て
ステップ1 | ステップ2 | ステップ3 | ステップ4 | ステップ5 | ステップ6 |
---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
ステップ7 | ステップ8 | ステップ9 | ステップ10 | ステップ11 | ステップ12 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
ステップ13 | ステップ14 | ステップ15 | ステップ16 | ステップ17 | ステップ18 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
ステップ19 | ステップ20 | ||||
![]() | ![]() |
フォロワーアームの組み立て
- フォロワーアームの組み立て手順は、基本的にリーダーアームと同じです。唯一の違いは、ステップ12以降のエンドエフェクター(グリッパーとハンドル)の取り付け方法です。
ステップ1 | ステップ2 | ステップ3 | ステップ4 | ステップ5 | ステップ6 |
---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
ステップ7 | ステップ8 | ステップ9 | ステップ10 | ステップ11 | ステップ12 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
ステップ13 | ステップ14 | ステップ15 | ステップ16 | ステップ17 | |
![]() | ![]() | ![]() | ![]() | ![]() |
キャリブレーション
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
SO101 Arm Kit Standard Editionを購入した場合、すべての電源は5Vです。SO101 Arm Kit Pro Editionを購入した場合、Leader Armは各ステップで5V電源を使用してキャリブレーションと操作を行い、Follower Armは各ステップで12V電源を使用してキャリブレーションと操作を行う必要があります。
次に、SO-10xロボットに電源とデータケーブルを接続してキャリブレーションを行い、リーダーアームとフォロワーアームが同じ物理的位置にあるときに同じ位置値を持つようにする必要があります。このキャリブレーションは、1つのSO-10xロボットで訓練されたニューラルネットワークが別のロボットで動作できるようにするために不可欠です。ロボットアームを再キャリブレーションする必要がある場合は、~/lerobot/.cache/huggingface/calibration/so101
フォルダを削除してください。
フォロワーアームの手動キャリブレーション
重要:ポートを取得したら、SO101RobotConfig(lerobot/lerobot/common/robot_devices/robots/configs.py
)のポートデフォルト値を更新してください。以下のようなものが見つかります:
@RobotConfig.register_subclass("so101")
@dataclass
class So101RobotConfig(ManipulatorRobotConfig):
calibration_dir: str = ".cache/calibration/so101"
# `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes.
# Set this to a positive scalar to have the same value for all motors, or a list that is the same length as
# the number of motors in your follower arms.
max_relative_target: int | None = None
leader_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="/dev/ttyACM0", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
follower_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="/dev//dev/ttyACM1", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
デュアルアームテレオペレーション(オプション)
デュアルアームテレオペレーションを実装したい場合、2つのLeaderロボットアームと2つのFollowerロボットアームが必要になります。そのため、leader_arms dick
とfollower_arms dick
にロボットアームのクラス名と対応するポート番号を追加する必要があります。例えば:
@RobotConfig.register_subclass("so101")
@dataclass
class So101RobotConfig(ManipulatorRobotConfig):
calibration_dir: str = ".cache/calibration/so101"
# `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes.
# Set this to a positive scalar to have the same value for all motors, or a list that is the same length as
# the number of motors in your follower arms.
max_relative_target: int | None = None
leader_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"left": FeetechMotorsBusConfig(
port="/dev/ttyACM0", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
"right": FeetechMotorsBusConfig(
port="/dev/ttyACM1", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
follower_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"left": FeetechMotorsBusConfig(
port="/dev//dev/ttyACM2", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
"right": FeetechMotorsBusConfig(
port="/dev//dev/ttyACM3", <-- UPDATE HERE
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
デュアルアームの左右の名前を正しく一致させ、各ロボットアームのデバイス上のシリアルポート番号が正しく割り当てられていることを確認する必要があります。
次のステップでは、ロボットアームをキャリブレーションする際に、4つのアームすべてを個別にキャリブレーションする必要があります。コマンドは以下の通りです:
sudo chmod 666 /dev/ttyACM*
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["left_follower"]'
# --control.arms='["right_follower"]'
# --control.arms='["left_leader"]'
# --control.arms='["right_leader"]'
キャリブレーションが完了したら、.cache/calibration/so101ディレクトリで結果を確認できます。
`-- calibration
`-- so101
|-- left_follower.json
|-- left_leader.json
|-- right_follower.json
`-- right_leader.json
その後のステップは、シングルアームセットアップと同じです。
sudo chmod 666 /dev/ttyACM*
Followerアームの手動キャリブレーション
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_follower"]'
Leaderアームの手動キャリブレーション
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--robot.cameras='{}' \
--control.type=calibrate \
--control.arms='["main_leader"]'
Follower中間位置 | Followerゼロ位置 | Follower回転位置 | Follower休止位置 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Leader中間位置 | Leaderゼロ位置 | Leader回転位置 | Leader休止位置 |
![]() | ![]() | ![]() | ![]() |
テレオペレーション
シンプルなテレオペレーション これで、ロボットをテレオペレーションする準備が整いました!この簡単なスクリプトを実行してください(カメラには接続せず、表示もしません):
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--robot.cameras='{}' \
--control.type=teleoperate
カメラの追加
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
2つのUSBカメラを挿入した後、以下のスクリプトを実行してカメラのポート番号を確認してください。カメラはUSBハブに接続せず、デバイスに直接接続することが重要です。USBハブの低速度により、画像データの読み取りができない場合があります。
python lerobot/common/robot_devices/cameras/opencv.py \
--images-dir outputs/images_from_opencv_cameras
ターミナルに以下の情報が出力されます。
Mac or X86 Ubuntu detected. Finding available camera indices through scanning all indices from 0 to 60
[...]
Camera found at index 2
Camera found at index 4
[...]
Connecting cameras
OpenCVCamera(2, fps=30.0, width=640, height=480, color_mode=rgb)
OpenCVCamera(4, fps=30.0, width=640, height=480, color_mode=rgb)
Saving images to outputs/images_from_opencv_cameras
Frame: 0000 Latency (ms): 39.52
[...]
Frame: 0046 Latency (ms): 40.07
Images have been saved to outputs/images_from_opencv_cameras
各カメラで撮影された画像はoutputs/images_from_opencv_cameras
ディレクトリで確認でき、異なる位置のカメラに対応するポートインデックス情報を確認できます。その後、lerobot/lerobot/common/robot_devices/robots/configs.py
ファイルでカメラパラメータの調整を完了してください。
@RobotConfig.register_subclass("so101")
@dataclass
class So101RobotConfig(ManipulatorRobotConfig):
calibration_dir: str = ".cache/calibration/so101"
''''''''''''''''
.
.
''''''''''''''''
cameras: dict[str, CameraConfig] = field(
default_factory=lambda: {
"laptop": OpenCVCameraConfig(
camera_index=0, ##### UPDATE HEARE
fps=30,
width=640,
height=480,
),
"phone": OpenCVCameraConfig(
camera_index=1, ##### UPDATE HEARE
fps=30,
width=640,
height=480,
),
}
)
mock: bool = False
Details
2台以上の追加カメラを追加する(オプション)
より多くのカメラを追加したい場合は、USB入力が許可する限り、カメラ辞書に異なるカメラ名とcamera_index
値を追加し続けることができます。カメラにUSBハブを使用することは推奨されないことにご注意ください。@RobotConfig.register_subclass("so101")
@dataclass
class So101RobotConfig(ManipulatorRobotConfig):
calibration_dir: str = ".cache/calibration/so101"
''''''''''''''''
.
.
''''''''''''''''
cameras: dict[str, CameraConfig] = field(
default_factory=lambda: {
"laptop": OpenCVCameraConfig(
camera_index=0, ##### UPDATE HEARE
fps=30,
width=640,
height=480,
),
"phone": OpenCVCameraConfig(
camera_index=1, ##### UPDATE HEARE
fps=30,
width=640,
height=480,
),
"new_camera": OpenCVCameraConfig( ##### UPDATE HEARE
camera_index=3, ##### UPDATE HEARE
fps=30,
width=640,
height=480,
),
}
)
mock: bool = False
単一のOrbbec Gemini 2深度カメラの使用
このプロジェクトはOrbbecによって開始され、貴重な指導を受け、華南師範大学の張家全、王文昭、黄金鵬によって実装されました。これにより、Orbbecカメラを使用してlerobotフレームワーク内で深度データを収集し、ロボットアームの環境認識を豊かにすることができます。 すでにOrbbec Gemini2深度カメラをお持ちの場合、現在のテスト構成では深度カメラを前方上部位置に配置しています。以下のインストール手順に従ってください。
Gemini 2深度カメラPython SDKのインストールとコンパイル
- pyOrbbecsdk をクローンする
cd ~/
git clone https://github.com/orbbec/pyorbbecsdk.git
cd pyorbbecsdk
- 依存関係をインストールし、pyOrbbecsdk をコンパイルする
conda activate lerobot
sudo apt-get install python3-dev python3-venv python3-pip python3-opencv
pip3 install -r requirements.txt
mkdir build
cd build
cmake -Dpybind11_DIR=`pybind11-config --cmakedir` ..
make -j4
make install
cd ~/pyorbbecsdk
pip install -e .
- 深度カメラが正常に動作するかテストする
cd ~/pyorbbecsdk
pip install -e .
export PYTHONPATH=$PYTHONPATH:~/pyorbbecsdk/install/lib/
sudo bash ./scripts/install_udev_rules.sh
sudo udevadm control --reload-rules && sudo udevadm trigger
python3 examples/depth.py
ただし、新しいターミナルを開く際には、これらのコマンドを再度実行する必要があります:
cd ~/pyorbbecsdk
export PYTHONPATH=$PYTHONPATH:~/pyorbbecsdk/install/lib/
sudo bash ./scripts/install_udev_rules.sh
sudo udevadm control --reload-rules && sudo udevadm trigger
また、.bashrc
ファイルの末尾に以下を追加することもできます:
export PYTHONPATH=$PYTHONPATH:~/pyorbbecsdk/install/lib/
sudo bash ~/pyorbbecsdk/scripts/install_udev_rules.sh
sudo udevadm control --reload-rules && sudo udevadm trigger
これにより、ターミナル起動時に深度カメラ環境が自動的に読み込まれます。
Orbbec深度カメラを接続した後、以下のスクリプトを実行して深度データストリームとカラーデータストリームを確認してください。2つのウィンドウがポップアップし、カメラの位置を調整できます。ターミナルでCtrl+Cを使用して終了してください。重要:カメラはUSBハブを通さず、デバイスに直接接続する必要があります。ハブの帯域幅が画像データ転送には遅すぎる可能性があるためです。
カメラを調整した後、lerobot/lerobot/common/robot_devices/robots/configs.py
の設定ファイルでカメラパラメータを調整してください。
@RobotConfig.register_subclass("so101") # Also compatible with so100
@dataclass
class So101RobotConfig(ManipulatorRobotConfig):
calibration_dir: str = ".cache/calibration/so101"
''''''''''''''''
.
.
''''''''''''''''
cameras: dict[str, CameraConfig] = field(
default_factory=lambda: {
"Orbbec":OrbbecCameraConfig( # Add Orbbec camera configuration here
fps=30,
use_depth=True, # Whether to use depth
width = 640, # Resolution automatically adapts to width. Only 640 or 1280 (untested) are valid values
Hi_resolution_mode = False, # High resolution mode (may reduce visualization quality but improves depth data resolution)
),
}
)
mock: bool = False
その後、以下のコードを実行することで、テレオペレーション中にコンピュータ上でカメラを表示できるようになります。これは最初のデータセットを記録する前にセットアップを準備するのに役立ちます。
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=teleoperate \
--control.display_data=true
データセットの記録
SO100とSO101のコードは互換性があります。SO100のユーザーはSO101のパラメータとコードを直接利用して操作できます。
テレオペレーションに慣れたら、SO-10xで最初のデータセットを記録できます。
データセットのアップロードに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
2つのエピソードを記録し、データセットをハブにアップロードしてください:
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=record \
--control.fps=30 \
--control.single_task="Grasp a lego block and put it in the bin." \
--control.repo_id=${HF_USER}/so101_test \
--control.tags='["so101","tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=30 \
--control.reset_time_s=30 \
--control.num_episodes=2 \
--control.display_data=true \
--control.push_to_hub=true
以下のような行が多数表示されます:
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)
パラメータの説明
- wormup-time-s:初期化時間を指します。
- episode-time-s:各回のデータ収集時間を表します。
- reset-time-s:各データ収集間の準備時間です。
- num-episodes:収集予定のデータグループ数を示します。
- push-to-hub:データをHuggingFace Hubにアップロードするかどうかを決定します。
-
データをローカルに保存したい場合(
--control.push_to_hub=false
)、--control.repo_id=${HF_USER}/so101_test
をカスタムローカルフォルダ名(例:--control.repo_id=seeed_123/so101_test
)に置き換えてください。その後、システムのホームディレクトリの~/.cache/huggingface/lerobot
に保存されます。 -
--control.push_to_hub=true
でデータセットをハブにアップロードした場合、以下で提供されるリポジトリIDをコピー&ペーストしてデータセットをオンラインで視覚化できます: -
エピソード記録中はいつでも右矢印→を押すと早期停止してリセットに移行します。リセット中も同様に、早期停止して次のエピソード記録に移行します。
-
エピソード記録中またはリセット中はいつでも左矢印←を押すと早期停止し、現在のエピソードをキャンセルして再記録します。
-
エピソード記録中はいつでもESCキーを押すとセッションを早期終了し、直接ビデオエンコーディングとデータセットアップロードに移行します。
-
注意:--control.resume=trueを追加することで記録を再開できます。また、データセットをまだプッシュしていない場合は、--control.local_files_only=trueを追加してください。最初から記録を開始したい場合は、データセットディレクトリを手動で削除する必要があります。
-
データ記録に慣れたら、トレーニング用のより大きなデータセットを作成できます。良い開始タスクは、異なる場所でオブジェクトを掴み、ビンに配置することです。少なくとも50エピソードを記録し、場所ごとに10エピソードを記録することをお勧めします。カメラを固定し、記録全体を通して一貫した掴み動作を維持してください。また、操作しているオブジェクトがカメラに見えることを確認してください。良い経験則として、カメラ画像だけを見てタスクを自分で実行できるようにする必要があります。
-
以下のセクションでは、ニューラルネットワークをトレーニングします。信頼性の高い掴み性能を達成した後、データ収集中により多くのバリエーションを導入し始めることができます。例えば、追加の掴み場所、異なる掴み技術、カメラ位置の変更などです。
-
結果に悪影響を与える可能性があるため、あまりにも早く多くのバリエーションを追加することは避けてください。
-
Linuxでは、データ記録中に左右の矢印キーとエスケープキーが効果がない場合、$DISPLAY環境変数が設定されていることを確認してください。pynputの制限を参照してください。
データセットの可視化
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
echo ${HF_USER}/so101_test
--control.push_to_hub=false
でアップロードしなかった場合、以下でローカルで可視化することもできます:
python lerobot/scripts/visualize_dataset_html.py \
--repo-id ${HF_USER}/so101_test \
--control.push_to_hub=false
でアップロードした場合、以下でローカルで可視化することもできます:
python lerobot/scripts/visualize_dataset_html.py \
--repo-id seeed_123/so101_test \
ここで、seeed_123
はデータ収集時に定義されたカスタムrepo_id
名です。

エピソードの再生
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
ロボットで最初のエピソードを再生してみましょう:
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=replay \
--control.fps=30 \
--control.repo_id=${HF_USER}/so101_test \
--control.episode=0
注意:データセットをまだプッシュしていない場合は、--control.local_files_only=true
を追加してください。
ポリシーのトレーニング
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
ロボットを制御するポリシーをトレーニングするには、python lerobot/scripts/train.py
スクリプトを使用します。いくつかの引数が必要です。以下はコマンドの例です:
python lerobot/scripts/train.py \
--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
ローカルデータセットでトレーニングしたい場合は、repo_id
がデータ収集時に使用したものと一致することを確認してください。
説明しましょう:
--dataset.repo_id=${HF_USER}/so101_test
でデータセットを引数として提供しました。policy.type=act
を使用してポリシーを提供し、lerobot/lerobot/common/policies/act/configuration_act.py
から設定を読み込みます。現在、ACTがテストされていますが、diffusion、pi0、pi0fast、tdmpc、vqbetなどの他のポリシーも試すことができます。- Nvidia GPUでトレーニングしているため
policy.device=cuda
を提供しましたが、Apple siliconでトレーニングする場合はpolicy.device=mps
を使用できます。 - トレーニングプロットを可視化するためにWeights and Biasesを使用するため
wandb.enable=true
を提供しました。これはオプションですが、使用する場合はwandb login
を実行してログインしていることを確認してください。
トレーニングには数時間かかります。チェックポイントはoutputs/train/act_so100_test/checkpoints
にあります。
チェックポイントからトレーニングを再開するには、以下はact_so101_testポリシーの最後のチェックポイントから再開するコマンドの例です:
python lerobot/scripts/train.py \
--config_path=outputs/train/act_so101_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true
ポリシーチェックポイントのアップロード トレーニングが完了したら、最新のチェックポイントを以下でアップロードします:
huggingface-cli upload ${HF_USER}/act_so101_test \
outputs/train/act_so101_test/checkpoints/last/pretrained_model
ポリシーの評価
SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。
lerobot/scripts/control_robot.py
のrecord
関数を使用できますが、ポリシーチェックポイントを入力として使用します。例えば、10個の評価エピソードを記録するには、このコマンドを実行します:
python lerobot/scripts/control_robot.py \
--robot.type=so101 \
--control.type=record \
--control.fps=30 \
--control.single_task="Grasp a lego block and put it in the bin." \
--control.repo_id=${HF_USER}/eval_act_so101_test \
--control.tags='["tutorial"]' \
--control.warmup_time_s=5 \
--control.episode_time_s=30 \
--control.reset_time_s=30 \
--control.num_episodes=10 \
--control.push_to_hub=true \
--control.policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
ご覧のとおり、これは以前にトレーニングデータセットを記録するために使用したコマンドとほぼ同じです。2つのことが変わりました:
- ポリシーチェックポイントへのパスを示す追加の
--control.policy.path
引数があります(例:outputs/train/eval_act_so100_test/checkpoints/last/pretrained_model
)。モデルチェックポイントをハブにアップロードした場合は、モデルリポジトリも使用できます(例:${HF_USER}/act_so100_test
)。 - 推論を実行していることを反映するため、データセット名は
eval
で始まります(例:${HF_USER}/eval_act_so100_test
)。
FAQ
-
このドキュメント/チュートリアルに従っている場合は、推奨されるGitHubリポジトリ
https://github.com/ZhuYaoHui1998/lerobot.git
をgit cloneしてください。このドキュメントで推奨されるリポジトリは検証済みの安定版です。公式のLerobotリポジトリは最新版に継続的に更新されており、異なるデータセットバージョン、異なるコマンドなどの予期しない問題を引き起こす可能性があります。 -
以下のエラーが発生した場合、対応するポートに接続されたロボットアームの電源が入っているか、バスサーボのケーブルが緩んでいたり切断されていないかを確認する必要があります。
ConnectionError: Read failed due to comunication eror on port /dev/ttyACM0 for group key Present_Position_Shoulder_pan_Shoulder_lift_elbow_flex_wrist_flex_wrist_roll_griper: [TxRxResult] There is no status packet!
-
ロボットアームの部品を修理または交換した場合は、
~/lerobot/.cache/huggingface/calibration/so100
フォルダを完全に削除し、ロボットアームを再キャリブレーションしてください。 -
リモートコントロールは正常に機能するが、カメラ付きリモートコントロールで画像インターフェースが表示されない場合は、こちらを参照してください。
-
データセットのリモート操作中にlibtiffの問題が発生した場合は、libtiffのバージョンを更新してください。
conda install libtiff==4.5.0 #for Ubuntu 22.04 is libtiff==4.5.1
-
Lerobot Installationを実行した後、pytorchのGPUバージョンが自動的にアンインストールされる可能性があるため、torch-gpuを手動でインストールする必要があります。
-
Jetsonの場合、
conda install -y -c conda-forge ffmpeg
を実行する前に、まずPytorch and Torchvsionをインストールしてください。そうしないと、torchvisionをコンパイルする際にffmpegバージョンの不一致問題が発生する可能性があります。 -
以下の問題が発生した場合、コンピュータがこのビデオコーデック形式をサポートしていないことを意味します。ファイル
lerobot/lerobot/common/datasets/video_utils.py
の134行目を変更し、vcodec: str = "libsvtav1"
の値をlibx264
またはlibopenh264
に変更する必要があります。異なるコンピュータでは異なるパラメータが必要な場合があるため、さまざまなオプションを試すことができます。Issues 705[vost#0:0 @ 0x13207240] Unknown encoder 'libsvtav1' [vost#0:0 @ 0x13207240] Error selecting an encoder Error opening output file /home/han/.cache/huggingface/lerobot/lyhhan/so100_test/videos/chunk-000/observation.images.laptop/episode_000000.mp4. Error opening output files: Encoder not found
-
重要!!!実行中にサーボのケーブルが緩んだ場合は、サーボを初期位置に戻してからサーボケーブルを再接続してください。サーボ初期化コマンドを使用して個別にサーボをキャリブレーションすることもできます。個別キャリブレーション中は、サーボとドライバーボード間に1本のケーブルのみが接続されていることを確認してください。以下のエラーが発生した場合
Auto-correct calibration of motor 'wrist roll' by shifting value by 1 full turns, from '-270 < -312.451171875 < 270degrees' to'-270<-312.451171875 < 270 degrees'.
またはロボットアームのキャリブレーション過程で角度や制限値の超過に関連するその他のエラーが発生した場合でも、この方法は依然として適用可能です。
-
8G 3060ラップトップで50セットのACTデータをトレーニングするには約6時間かかりますが、4090またはA100コンピューターでは50セットのデータのトレーニングに約2〜3時間かかります。
-
データ収集中は、カメラの位置、角度、環境照明を安定に保ち、過度に不安定な背景や歩行者の撮影を最小限に抑えてください。そうしないと、デプロイ時の大幅な環境変化により、ロボットアームが適切に把握できなくなる可能性があります。
-
データ収集コマンドの
num-episodes
パラメータが十分なデータを収集するように設定されていることを確認し、途中で手動で一時停止しないでください。これは、データの平均と分散がデータ収集完了後にのみ計算されるためで、これはトレーニングに必要です。 -
プログラムがUSBカメラの画像データを読み取れないというプロンプトが表示される場合は、USBカメラがハブに接続されていないことを確認してください。USBカメラは高速な画像伝送レートを確保するために、デバイスに直接接続する必要があります。
解決できないソフトウェアの問題や環境依存の問題が発生した場合は、このチュートリアルの最後にあるFAQセクションを確認することに加えて、LeRobotプラットフォームまたはLeRobot Discordチャンネルに速やかに問題を報告してください。
引用
TheRobotStudio Project: SO-ARM10x
Huggingface Project: Lerobot
Dnsty: Jetson Containers
技術サポート & 製品ディスカッション
弊社製品をお選びいただき、ありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供いたします。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。