LeRobot における SO-ARM100 と SO-ARM101 ロボットアーム入門
組み立てとキャリブレーションから、データセット収集、学習、実機デプロイまで
このWikiでは、LeRobot における SO-ARM100 / SO-ARM101 の完全なワークフローを順を追って説明します。 ハードウェアセットアップ、サーボ設定、アームキャリブレーション、テレオペレーション、カメラ統合、 データセット記録、可視化、リプレイ、ポリシー学習、評価、およびデプロイのコツまでを扱います。
ロボットアームを動かす可能性のあるプログラムを実行する前に、作業空間の半径1m以内から、貴重品、壊れやすい物、 工具、ケーブル、および無関係な物体を取り除いてください。デバッグや動作中は、 人がアームの動作範囲に近づかないようにしてください。
- アームの電源が入っている状態では、関節、モーター、リンク、グリッパー、エンドツールには触れないでください。
- サーボ設定、キャリブレーション、テレオペレーション、データセット記録、リプレイ、ポリシー評価を行う前に、アームがしっかり固定されていることを確認してください。
- 少なくとも1mの安全距離を保ち、周囲の人にアームが突然動く可能性があることを理解してもらってください。
- 異常な動き、異音、振動、ケーブルの緩み、電源接触不良、通信断などが発生した場合は、直ちにプログラムを停止し、点検前に電源を切ってください。
- サーボケーブル、USB ケーブル、電源コネクタ、モーター制御ボードのケーブルを抜き差しする前には、必ず電源を切ってください。
推奨学習パス
実際のデバッグワークフローに沿って一歩ずつ進める
SO-ARM10x を初めてセットアップする場合は、テレオペレーション、カメラ、データセット、学習、評価に進む前に、ハードウェア準備、環境構築、キャリブレーションを完了してください。
SO-ARM100 / SO-ARM101 のバージョン、モータータイプ、電圧、BOM を確認します。
Miniforge、検証済みの Seeed LeRobot リポジトリ、ffmpeg、PyTorch、カメラ依存関係をセットアップします。
サーボ ID とボーレートを設定し、リーダーアームとフォロワーアームを組み立てます。
両方のアームをキャリブレーションし、リーダーからフォロワーへの制御チェーンが安定していることを確認します。
OpenCV、RealSense、または Orbbec カメラを接続し、クリーンで再現性のあるエピソードを記録します。
まず ACT から始め、その後 SmolVLA、Pi0、Pi0.5、GR00T、PEFT、非同期推論を試してみてください。
概要
プロジェクト紹介
SO-ARM10x は、オープンソースで低コストなロボットアームと LeRobot エコシステムを組み合わせ、データ収集、模倣学習、実機デプロイを実現します。
このチュートリアルは最新の LeRobot に対応して更新されています。

Seeed Studio はキットのハードウェア品質に責任を負います。ソフトウェアチュートリアルは、可能な限り公式の LeRobot ドキュメントに従っています。ソフトウェアや依存関係に関する問題が解決できない場合は、このページ末尾の FAQ を確認し、LeRobot GitHub リポジトリ または LeRobot Discord チャンネル に問題を報告してください。
3D プリントガイド
3D プリントガイド
キット版アームを組み立てる前に、適切な STL ファイルとプリント設定を選択してください。
3D プリントパラメータを表示
SO101 の公式アップデートに伴い、SO100 は今後サポートされず、公式に従ってソースファイルは削除されますが、ソースファイルは引き続き当社の Makerworld で見つけることができます。ただし、以前に SO100 を購入したユーザー向けには、チュートリアルとインストール方法は引き続き互換性があります。SO101 のプリントは、SO100 のモーターキットの取り付けと完全に互換性があります。
ステップ 1:プリンターを選ぶ
提供されている STL ファイルは、多くの FDM プリンターですぐに印刷できるようになっています。以下はテスト済みで推奨される設定ですが、他の設定でも動作する場合があります。
- 材料:PLA+
- ノズル径と精度:0.4mm ノズル径で 0.2mm レイヤー高さ、または 0.6mm ノズルで 0.4mm レイヤー高さ。
- インフィル密度:15%
ステップ 2:プリンターをセットアップする
- プリンターがキャリブレーションされており、プリンター固有の手順に従ってベッドレベリングが正しく行われていることを確認します。
- プリントベッドを清掃し、ほこりや油分がない状態にします。水やその他の液体でベッドを清掃した場合は、ベッドを乾かしてください。
- プリンターが推奨している場合は、標準的なスティックのりを使用し、ベッドのプリント領域全体に薄く均一に塗布します。ダマやムラのある塗布は避けてください。
- プリンター固有の手順に従ってフィラメントをロードします。
- プリンター設定が上記の推奨設定と一致していることを確認します(多くのプリンターには複数の設定があるため、最も近いものを選択してください)。
- サポートは「すべて」に設定しますが、水平方向から 45 度を超える傾斜は無視します。
- 水平軸を持つネジ穴の中にはサポートが入らないようにします。
ステップ 3:パーツを印刷する
リーダーまたはフォロワー用のすべてのパーツは、簡単に 3D プリントできるよう、単一ファイルにまとめられており、サポートを最小限にするために z 方向が上になるよう正しく向きを揃えています。
-
ベッドサイズが 220mm×220mm(Ender など)のプリンターの場合、次のファイルを印刷します:
-
ベッドサイズが 205mm × 250mm(Prusa/Up など)のプリンターの場合:
ステップ 4:ソフトグリッパーとカメラマウントブラケットインサートを印刷する(オプション)
ロボットアームに柔らかい物体、壊れやすい物体、不規則な形状の物体を把持させたい場合は、デフォルトの剛性グリッパーの代わりにソフトグリッパーを印刷できます。カメラを取り付ける必要がある場合は、カメラマウントブラケットインサートも印刷できます。プリントファイルは soarm_soft_gripper リポジトリで入手できます。
印刷材料に関する指示:
- 2 本のグリッパーフィンガー:TPU 材料で印刷してください
- その他のパーツ:PLA 材料でプリントします
初期システム環境
初期システム環境
インストール前に、Ubuntu、Jetson、CUDA、Python、PyTorch、Torchvision の要件を確認してください。
Ubuntu x86 の場合:
- Ubuntu 22.04
- CUDA 12 以上
- Python 3.12
- Torch 2.6 以上
Jetson Orin の場合:
- Jetson JetPack 6.0 および 6.1(JetPack 6.2 はまだサポートされていません)
- Python 3.12
- Torch 2.3 以上
LeRobot をインストール
LeRobot をインストール
Miniforge、検証済みの Seeed LeRobot リポジトリ、ffmpeg、PyTorch、およびハードウェア固有の依存関係をインストールします。
pytorch や torchvision などの環境は、使用している CUDA に基づいてインストールする必要があります。
- Jetson
- X86 Ubuntu 22.04
- Miniforge をインストールします:
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
chmod +x Miniforge3-Linux-aarch64.sh
./Miniforge3-Linux-aarch64.sh
# Follow the prompts by entering 'yes' or pressing Enter. Once the installation is complete:
source ~/.bashrc
- lerobot 用の新しい conda 環境を作成して有効化します
conda create -y -n lerobot python=3.12 && conda activate lerobot
- Lerobot をクローンします:
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
- miniforge を使用している場合、環境内に 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]"
- Jetson Jetpack 6.0 以上のデバイスの場合(このステップを実行する前に、必ずステップ 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 がアンインストールされ、CPU 版の Pytorch と Torchvision がインストールされるため、Python で確認を行う必要があります。
python # Command to start Python in the terminal
import torch
print(torch.cuda.is_available())
exit() # Exit Python
出力結果が False の場合、現在の環境は CPU 版の PyTorch を使用しています。Jetson で GPU 対応の PyTorch と Torchvision が必要な場合は、このチュートリアル に従ってインストールしてください。GPU での学習または推論が必要な環境では、最終的な確認結果が True である必要があります。
- Miniforge をインストールします:
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
chmod +x Miniforge3-Linux-x86_64.sh
./Miniforge3-Linux-x86_64.sh
# Once the installation is complete:
source ~/.bashrc
# Initialize all shells
conda init --all
- lerobot 用の新しい conda 環境を作成して有効化します
conda create -y -n lerobot python=3.12 && conda activate lerobot
- Lerobot をクローンします:
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
- miniforge を使用している場合、環境内に 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 をインストールします:
新しく構成した Ubuntu 22.04 VM、特に最小インストールでは、gcc やその他の C ビルドツールがデフォルトでインストールされていない場合があります。その場合、feetech 依存関係付きで LeRobot をインストールしようとすると、evdev Python パッケージをビルドできないため失敗することがあります。
まず基本的なビルドツールをインストールします:
sudo apt update
sudo apt install build-essential
インストール後、LeRobot のインストールコマンドを再実行してください。
cd ~/lerobot && pip install -e ".[feetech]"
- Pytorch と Torchvision を確認します
pip で lerobot 環境をインストールすると、元の Pytorch と Torchvision がアンインストールされ、CPU 版の Pytorch と Torchvision がインストールされるため、Python で確認を行う必要があります。
python # Command to start Python in the terminal
import torch
print(torch.cuda.is_available())
exit() # Exit Python
出力結果が False の場合、現在の環境は CPU 版の PyTorch を使用しています。GPU での学習または推論が必要な場合は、公式 PyTorch ガイド に従って、CUDA バージョンに一致する Pytorch と Torchvision のバージョンをインストールしてください。GPU アクセラレーションが必要な NVIDIA GPU 搭載環境では、最終的な確認結果が True である必要があります。
注意:NVIDIA RTX 50 シリーズ GPU には、プレビュー版の CUDA 12.8 以上が必要です。
ダウンロードコマンドは次のとおりです:
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
モーターの設定とアームの組み立て
モーターを設定しアームを組み立てる
サーボ ID とボーレートを設定し、配線と電源を確認してから、リーダーアームとフォロワーアームを組み立てます。
ロボットアームの作業エリア 1 m 以内から、貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されており、電源とケーブルが正しく接続されていることを確認してください。
完成品のロボットアームを購入した場合は、キャリブレーションのセクションまでスキップしてください。
キット版の場合は、以下の手順に従ってください
SO-ARM101 のサーボキャリブレーションおよび初期化プロセスは、方法とコードの両方の観点から SO-ARM100 と同じです。ただし、SO-ARM101 の Leader Arm の最初の 3 つの関節のギア比は SO-ARM100 のものと異なるため、それらを区別して慎重にキャリブレーションすることが重要です。
モーターを構成するには、1 つのバスサーボアダプタと 6 個のモーターをリーダーアーム用に割り当て、同様にもう 1 つのバスサーボアダプタと 6 個のモーターをフォロワーアーム用に割り当てます。フォロワー F 用かリーダー L 用か、そして ID が 1 から 6 のいずれであるかを各モーターにラベルを書いておくと便利です。F1–F6 を Follower Arm の関節 1〜6、L1–L6 を Leader Arm の関節 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 の電源をモーターバスに接続する必要があります。ST3215 7.4V モーターには 5V、ST3215 12V モーターには 12V を使用します。Leader Arm は常に 7.4V モーターを使用するため、12V モーターと 7.4V モーターの両方をお持ちの場合は、正しい電源を接続しているか注意してください。そうしないとモーターを焼損するおそれがあります。次に、モーターバスを USB 経由でコンピュータに接続します。USB は電源を供給しないため、電源と USB の両方を接続する必要があることに注意してください。

以下はコードによるキャリブレーション手順です。上の画像の配線サーボを参照しながらキャリブレーションを行ってください
アームに対応する USB ポートを見つける 各アームに対して正しいポートを見つけるには、ユーティリティスクリプトを 2 回実行します。
lerobot-find-port
出力例:
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.
USB を抜くことを忘れないでください。そうしないとインターフェースが検出されません。
フォロワーアームのポートを特定する際の出力例(Mac では /dev/tty.usbmodem575E0031751、Linux では /dev/ttyACM0 など):
リーダーアームのポートを特定する際の出力例(/dev/tty.usbmodem575E0032081、または Linux では /dev/ttyACM1 など):
USB ポートへのアクセス権を付与する必要がある場合は、次を実行します。
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
アームを接続する際、最初に接続したデバイスは ttyACM0(Slave/Follower アーム)に割り当てられ、2 番目に接続したデバイスは ttyACM1(Master/Leader アーム)に割り当てられます。
モーターを設定する
Leader サーボキャリブレーション参照画像
| Leader Arm 関節 6 キャリブレーション | Leader Arm 関節 5 キャリブレーション | Leader Arm 関節 4 キャリブレーション | Leader Arm 関節 3 キャリブレーション | Leader Arm 関節 2 キャリブレーション | Leader Arm 関節 1 キャリブレーション |
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Follower サーボキャリブレーション参照画像
| Follower Arm 関節 6 キャリブレーション | Follower Arm 関節 5 キャリブレーション | Follower Arm 関節 4 キャリブレーション | Follower Arm 関節 3 キャリブレーション | Follower Arm 関節 2 キャリブレーション | Follower Arm 関節 1 キャリブレーション |
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
繰り返しになりますが、サーボ関節の ID とギア比が SO-ARM101 の仕様と厳密に一致していることを必ず確認してください。
Follower Arm サーボのキャリブレーション
コンピュータからフォロワーアームのコントローラボードまで USB ケーブルを接続し、電源をフォロワーアームのコントローラボードに接続します。その後、次のコマンドを実行します。
lerobot-setup-motors \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 # <- paste here the port found at previous step
次の指示が表示されるはずです。
Connect the controller board to the 'gripper' motor only and press enter.
指示どおり、グリッパーのモーターを接続します。このとき、ボードに接続されているモーターがそれ 1 つだけであり、そのモーター自体がまだ他のモーターとデイジーチェーン接続されていないことを確認してください。[Enter] を押すと、スクリプトがそのモーターの ID とボーレートを自動的に設定します。
その後、次のメッセージが表示されるはずです。
'gripper' motor id set to 6
続いて次の指示が表示されます。
Connect the controller board to the 'wrist_roll' motor only and press enter.
コントローラボードから 3 ピンケーブルを外してもかまいませんが、すでに正しい位置にあるため、反対側はグリッパーモーターに接続したままにしておけます。次に、別の 3 ピンケーブルを wrist roll モーターに接続し、それをコントローラボードに接続します。前のモーターと同様に、ボードに接続されているモーターがそれ 1 つだけであり、そのモーター自体が他のモーターに接続されていないことを確認してください。
指示に従って、各モーターに対して同じ操作を繰り返してください。
Enter を押す前に、各ステップで配線を確認してください。たとえば、ボードを操作している間に電源ケーブルが外れてしまう可能性があります。
すべて完了するとスクリプトは終了し、その時点でモーターは使用可能な状態になります。各モーターから次のモーターへ 3 ピンケーブルを接続し、最初のモーター(ID=1 の「shoulder pan」)からのケーブルをコントローラボードに接続します。コントローラボードはアームのベースに取り付けることができます。
Leader Arm サーボのキャリブレーション
Leader Arm についても同じ手順を実行します。
lerobot-setup-motors \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 # <- paste here the port found at previous step
組み立て
- SO-ARM101 のデュアルアーム組み立て手順は SO-ARM100 と同じです。違いは、SO-ARM101 ではケーブルクリップが追加されていることと、Leader Arm の関節サーボのギア比が異なることだけです。そのため、以下の内容を参照して SO100 と SO101 のどちらも組み立てることができます。
- 組み立て前に、モーターのモデル、ギア比、および電源電圧をもう一度確認してください。SO101 を購入した場合は、上記のサーボモデルと関節マッピング表を参照して、F1〜F6 と L1〜L6 を区別してください。
Leader Arm の組み立て
| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 |
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| Step 7 | Step 8 | Step 9 | Step 10 | Step 11 | Step 12 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| Step 13 | Step 14 | Step 15 | Step 16 | Step 17 | Step 18 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| Step 19 | Step 20 | ||||
![]() | ![]() |
フォロワーアームの組み立て
- フォロワーアームの組み立て手順は、基本的にリーダーアームと同じです。唯一の違いは、ステップ12以降のエンドエフェクタ(グリッパーとハンドル)の取り付け方法です。
| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 |
|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| Step 7 | Step 8 | Step 9 | Step 10 | Step 11 | Step 12 |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| Step 13 | Step 14 | Step 15 | Step 16 | Step 17 | |
![]() | ![]() | ![]() | ![]() | ![]() |
ロボットアームのキャリブレーション
ロボットアームのキャリブレーション
フォロワーアームとリーダーアームをキャリブレーションし、物理的な位置がソフトウェア上の状態と一致するようにします。
ロボットアームの作業空間から1メートル以内の貴重品および無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源およびケーブルが正しく接続されていることを確認してください。
SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。
SO101 Arm Kit Standard Edition を購入した場合、すべての電源は 5V です。SO101 Arm Kit Pro Edition を購入した場合、リーダーアームは各ステップで 5V 電源を使用してキャリブレーションおよび動作させ、フォロワーアームは各ステップで 12V 電源を使用してキャリブレーションおよび動作させる必要があります。
次に、SO-10x ロボットに電源とデータケーブルを接続してキャリブレーションを行い、同じ物理位置にあるときにリーダーアームとフォロワーアームが同じ位置値を持つようにする必要があります。このキャリブレーションは、ある SO-10x ロボットで学習したニューラルネットワークを別のロボットでも動作させるために不可欠です。
ロボットアームを再キャリブレーションする
再キャリブレーションオプションを表示
ロボットアームを再キャリブレーションする必要がある場合、次の 2 つのオプションがあります:
オプション 1:ローカルのキャリブレーションファイルを削除する
再キャリブレーションを行う前に、~/.cache/huggingface/lerobot/calibration/robots または ~/.cache/huggingface/lerobot/calibration/teleoperators 配下のファイルを完全に削除してください。そうしないと、以前のキャリブレーションデータがこれらのディレクトリ内の JSON ファイルに保存されているため、システムがエラープロンプトを出す可能性があります。
オプション 2:キャリブレーションコマンドで再キャリブレーションを選択する
ターミナルでキャリブレーションコマンドを直接実行します。アームが以前にキャリブレーションされている場合、次のプロンプトが表示されます:
Press ENTER to use provided calibration file associated with the id my_awesome_leader_arm, or type 'c' and press ENTER to run calibration:
c を入力して Enter を押すと再キャリブレーションが開始されます。既存のキャリブレーションデータを保持して使用する場合は、そのまま Enter を押してください。
6 個のロボットサーボを 3 ピンインターフェース経由で接続し、シャーシサーボをサーボドライバボードに接続します。その後、次のコマンドまたは API の例を実行してアームをキャリブレーションします:
PC(Linux)および Jetson デバイスでは、最初に接続した USB デバイスは通常 ttyACM0 に、2 番目は ttyACM1 にマッピングされます。コマンドを実行する前に、どのポートがリーダーとフォロワーにマッピングされているかを必ず確認してください。
フォロワーアームの手動キャリブレーション
6 個のロボットサーボのインターフェースを 3 ピンケーブルで接続し、シャーシサーボをサーボドライブプレートに接続してから、次のコマンドまたは API の例を実行してロボットアームをキャリブレーションしてください:
まずインターフェース権限を付与します
sudo chmod 666 /dev/ttyACM*
次にフォロワーアームをキャリブレーションします
lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 # <- The port of your robot
--robot.id=my_awesome_follower_arm # <- Give the robot a unique name
以下の動画はキャリブレーションの方法を示しています。まず、すべての関節が可動範囲の中央に来る位置までロボットを動かす必要があります。その後、Enter を押したら、各関節を可動範囲全体にわたって動かしてください。
lerobot リポジトリの更新により、マスタースレーブアームのキャリブレーションを行う際に、ターミナルがサーボ 5 から信号を受信しないのは正常です。そのまま操作を続行してかまいません。
リーダーアームの手動キャリブレーション
同じ手順でリーダーアームをキャリブレーションし、次のコマンドまたは API の例を実行します:
lerobot-calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 # <- The port of your robot
--teleop.id=my_awesome_leader_arm # <- Give the robot a unique name
リーダーアームまたはフォロワーアームのキャリブレーション中に “Could not connect on port '/dev/ttyACM0'. Make sure you are using the correct port., Try running lerobot-find-port” というエラーが発生した場合は、sudo chmod 666 /dev/ttyACM* を実行して必要な権限を付与する必要があります。
(オプション)Seeed Studio SoARM クイックツールによる中立位置キャリブレーション
ロボットのキャリブレーションまたは動作中に、次のようなエラーが表示される場合があります:
Magnitude 30841 exceeds 2047 (max for sign_bit_index=11)
これは通常、サーボの現在位置/ゼロオフセットが異常であり、その結果、読み取られる角度が想定範囲を超えていることを意味します。その場合、Seeed Studio の SoARM ツールを使用して中立位置キャリブレーション(現在位置を書き込み、中立値 2048 に設定)を行い、その後にアーム全体のキャリブレーションをやり直すことができます。
1) ツールを GitHub からクローンし、依存関係をインストールする
git clone https://github.com/Seeed-Projects/Seeed_RoboController.git
cd Seeed_RoboController
pip install -r requirements.txt
2) 中立位置キャリブレーションと検証
スクリプトの場所:
src/tools/servo_middle_calibration.py: 中立位置キャリブレーション(現在位置を 2048 として書き込む)src/tools/servo_disable.py: サーボトルクを無効化(関節を手で回しやすくする)src/tools/servo_center_test.py: 2048 に移動してキャリブレーション結果を検証
次の順番で実行します(コマンドは対話的にポートの選択を求めます):
- (オプション)トルクを無効化して、関節を手動で調整:
python -m src.tools.servo_disable
- 中立位置キャリブレーションを実行(現在位置を 2048 に設定):
python -m src.tools.servo_middle_calibration
- 検証:サーボを 2048 に移動し、想定どおりの中立位置に戻るか確認:
python -m src.tools.servo_center_test
中立位置キャリブレーションが完了したら、上記の lerobot-calibrate の手順に戻り、アーム全体のキャリブレーションをやり直してください。
上記のようなエラーが発生した場合は、ステアリングギアデバッグツールを使用してデバッグできます。これは Windows、Ubuntu、Mac をサポートしています。
テレオペレーション
テレオペレーション
カメラを追加したりデータを収集したりする前に、リーダーからフォロワーへのテレオペレーションテストを実行します。
ロボットアームの作業空間から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
teleoperate コマンドは自動的に以下を行います:
- 不足しているキャリブレーションを特定し、キャリブレーション手順を開始します。
- ロボットとテレオペデバイスに接続し、テレオペレーションを開始します。
カメラを追加する
カメラを追加する
OpenCV、RealSense、または Orbbec カメラを追加し、データセットを記録する前に画像ストリームを確認します。
RealSense D435i/D405 を使用する場合
RealSense 深度カメラは LeRobot に RGB-D 認識機能を提供し、物体認識、点群再構成、テーブルトップマニピュレーションなどのタスクに適しています。ここで推奨されるモデルは RealSense D405 と RealSense D435i です。
RealSense D405

RealSense D405 は短距離ステレオ深度カメラであり、テーブルトップロボットマニピュレーションなどの高精度な近距離タスク向けに設計されており、一般的な動作距離は 7 cm 〜 50 cm です。
RealSense D435i

RealSense D435i は深度センシング、RGB 画像、および IMU を組み合わせており、3D 再構成、SLAM、ロボット環境認識などの中距離〜近距離アプリケーションに適しています。
1. カメラ用ブランチに切り替える
現在のカメラサポートは DepthCameraSupport ブランチで利用できます:
git checkout DepthCameraSupport
git pull origin DepthCameraSupport
現在のブランチを確認します:
git branch --show-current
想定される出力:
DepthCameraSupport
2. RealSense を編集可能モードでインストールする
RealSense のみを使用する場合:
pip install -e ".[realsense]"
3. カメラの権限を付与する
chmod a+rw /dev/bus/usb/*/*
4. カメラを検出する
lerobot-find-cameras realsense
このステップでは次の情報が出力されます:
- カメラモデル
- シリアル番号
- USB 情報
- デフォルトのストリーム構成
取得した Serial number を、以下のカメラコマンドの serial_number_or_name パラメータに入力します。
5. RealSense の例
RealSense 2 台のテスト:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras='{
d435i_color: {
type: realsense_d435i_color,
serial_number_or_name: "419522072950",
width: 640,
height: 480,
fps: 30,
color_mode: rgb,
color_stream_format: rgb8,
rotation: 0,
warmup_s: 1
},
d435i_depth: {
type: realsense_d435i_depth,
serial_number_or_name: "419522072950",
width: 640,
height: 480,
fps: 30,
max_depth_m: 2.0,
depth_alpha: 0.2,
rotation: 0,
warmup_s: 5
},
d405_color: {
type: realsense_d405_color,
serial_number_or_name: "409122273421",
width: 640,
height: 480,
fps: 30,
color_mode: rgb,
color_stream_format: rgb8,
rotation: 0,
warmup_s: 1
},
d405_depth: {
type: realsense_d405_depth,
serial_number_or_name: "409122273421",
width: 640,
height: 480,
fps: 30,
depth_alpha: 0.03,
rotation: 0,
warmup_s: 5
}
}' \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true
6. パラメータに関する注意事項
depth_alphaは深度画像のスケーリング係数を制御し、表示結果や対象距離の範囲に応じて調整できます。- 3 台以上の深度カメラを接続する場合は、全体の安定性を高めるために
fpsを15に下げることを推奨します。 - 安定性とリアルタイム性のバランスを取るため、解像度は
640x480に保つことを推奨します。
Orbbec Gemini2/Gemini336 カメラを使用する場合

Orbbec Gemini 2 はロボットアプリケーション向けの高性能 RGB-D カメラであり、正確な深度とカラーのアライメントを備えた同期 RGB および深度ストリームを提供します。ステレオ深度センシングと内蔵 6 軸 IMU を組み合わせることで、物体検出、3D 認識、マッピング、ナビゲーションなどのロボットタスクに適しています。コンパクトな設計と完全な Orbbec SDK サポートにより、研究用途と実環境での導入の両方に適しています。

Gemini 336 は Gemini 330 シリーズの新しいメンバーです。Gemini 335 の優れた深度性能を受け継ぎつつ、反射の多い屋内エリア、高ダイナミックシーンの暗部、明るい屋外環境における深度画像品質をさらに向上させています。ロボットアプリケーションにおいては、認識、自己位置推定、マニピュレーションなどのタスクに対して、より安定した高品質の深度データを提供できます。
1. カメラ用ブランチに切り替える
現在のカメラサポートは DepthCameraSupport ブランチで利用できます:
git checkout DepthCameraSupport
git pull origin DepthCameraSupport
現在のブランチを確認します:
git branch --show-current
想定される出力:
DepthCameraSupport
2. LeRobot を編集可能モードでインストールする
Orbbec のみを使用する場合:
pip install -e ".[orbbec]"
3. カメラの権限を付与する
chmod a+rw /dev/bus/usb/*/*
4. USBFS キャッシュサイズの設定
デフォルトでは、USBFS のキャッシュサイズは 16 MB です。この値は高解像度画像、複数のデータストリーム、および複数デバイスのシナリオには不十分です。ユーザーはキャッシュサイズを最大 128 MB まで増やすことができます。
USBFS キャッシュサイズを確認する
cat /sys/module/usbcore/parameters/usbfs_memory_mb
USBFS キャッシュサイズを一時的に増やす
sudo sh -c 'echo 128> /sys/module/usbcore/parameters/usbfs_memory_mb'
それでも timeout error TimeoutError: Timed out waiting for frame from <lerobot.cameras.orbbec.camera_orbbec.OrbbecDepthCamera object at 0x7ba4ba130910.........> が発生する場合は、カメラを再接続するだけで構いません。
5. カメラを検出する
lerobot-find-cameras orbbec
このステップでは次の情報が出力されます:
- カメラモデル(Name)
- シリアル番号(Serial number)
- USB 情報
- デフォルトのストリーム構成
取得した Serial Number を、以下に示すカメラコマンドの serial_number_or_name パラメータに入力します。
6. Orbbec の例
Orbbec 1 台のテスト:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras='{
orbbec_color: {
type: orbbec_color,
serial_number_or_name: "CP9JA530003A",
width: 640,
height: 480,
fps: 30,
color_mode: rgb,
rotation: 0,
warmup_s: 1
},
orbbec_depth: {
type: orbbec_depth,
serial_number_or_name: "CP9JA530003A",
width: 640,
height: 400,
fps: 30,
depth_alpha: 0.2,
rotation: 0,
warmup_s: 5
}
}' \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true
Orbbec 単体カメラテスト + 標準カメラテスト:
lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras='{
orbbec_color: {
type: orbbec_color,
serial_number_or_name: "CP9JA530003A",
width: 640,
height: 480,
fps: 30,
color_mode: rgb,
rotation: 0,
warmup_s: 1
},
orbbec_depth: {
type: orbbec_depth,
serial_number_or_name: "CP9JA530003A",
width: 640,
height: 400,
fps: 30,
depth_alpha: 0.2,
rotation: 0,
warmup_s: 5
},
side: {
type: opencv,
index_or_path: 8,
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
単一の Orbbec カメラと通常のカメラを一緒に使用する場合は、最初に Orbbec カメラを接続し、その後に通常のカメラを接続することを推奨します。
カメラ ID を検出するために lerobot-find-cameras opencv コマンドを実行すると、Orbbec カメラが連続する 3 つのカメラ番号を占有していることがわかります。したがって、通常のカメラは最後に接続し、その番号が末尾に割り当てられるようにすることをお勧めします。
7. パラメータの注意事項
depth_alphaは深度画像のスケーリング係数を制御します。0.2を初期値として、表示結果に基づいて微調整してください。- 3 台以上の深度カメラを接続する場合は、安定性を高めるために
fpsを15に下げることを推奨します。 - より安定した表示とデータ転送のために、解像度は
640x480に保つことを推奨します。
カメラ関連のエラーについては、このページの最後にある FAQ セクションを参照してください。
通常のカメラを使用する場合
SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。
カメラをインスタンス化するには、カメラ識別子が必要です。この識別子は、コンピュータを再起動したりカメラを再接続したりすると変更される場合があり、この挙動は主にオペレーティングシステムに依存します。
システムに接続されているカメラのインデックスを見つけるには、次のスクリプトを実行します:
lerobot-find-cameras opencv # or realsense for Intel Realsense cameras
ターミナルには次のような情報が出力されます。
--- Detected Cameras ---
Camera #0:
Name: OpenCV Camera @ 0
Type: OpenCV
Id: 0
Backend api: AVFOUNDATION
Default stream profile:
Format: 16.0
Width: 1920
Height: 1080
Fps: 15.0
--------------------
(more cameras ...)
各カメラで撮影された画像は、outputs/captured_images ディレクトリで確認できます。
Intel RealSense カメラを macOS で使用する際に、次のようなエラーが発生することがあります:macOSError finding RealSense cameras: failed to set power statesudo。これは、同じコマンドを 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=true
カメラが複数ある場合は、--robot.cameras を変更してカメラを追加できます。index_or_path の形式は、python -m lerobot.find_cameras opencv によって出力されるカメラ ID の末尾の数字によって決まることに注意してください。
fourcc: "MJPG" 形式の画像は圧縮されています。より高い解像度を試すこともできますし、YUYV 形式を試すこともできます。ただし後者では画像の解像度と FPS が低下し、その結果ロボットアームの動作にラグが発生します。現在、MJPG 形式では、1920*1080 の解像度で 30FPS を維持しながら 3 台のカメラをサポートできます。とはいえ、同じ USB ハブ経由で 2 台のカメラをコンピュータに接続することは依然として推奨されません。
例えば、サイドカメラを追加したい場合:
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
fourcc: "MJPG" 形式の画像は圧縮されています。より高い解像度を試すこともできますし、YUYV 形式を試すこともできます。ただし後者では画像の解像度と FPS が低下し、その結果ロボットアームの動作にラグが発生します。現在、MJPG 形式では、1920*1080 の解像度で 30FPS を維持しながら 3 台のカメラをサポートできます。とはいえ、同じ USB ハブ経由で 2 台のカメラをコンピュータに接続することは依然として推奨されません。
このようなバグが見つかった場合。

rerun のバージョンをダウングレードすることで、この問題を解決できます。
pip3 install rerun-sdk==0.23
カメラマウントの取り付けと使用
カメラマウントの取り付け
カメラの位置を固定して、クリーンなデータ収集を実現します。多角度の自由調整に対応し、俯瞰 + 手首、俯瞰 + 側面などのビューに対応します。一般的な USB カメラや、D435i、D405、Gemini 2 などの深度カメラに対応し、SO-ARM101 や reBot などのロボットアームにも対応します。データ収集実験ボックスと組み合わせて使用でき、ダウンロードしたデータセットとモデルをそのまま再利用できます。
データセットの記録
データセットの記録
ローカルにデータセットを記録するか Hugging Face Hub にアップロードし、その後もデータセットをクリーンかつ一貫した状態に保ちます。
ロボットアームの作業空間から 1 メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源とケーブルが正しく接続されていることを確認してください。
- データセットをローカルに保存したい場合は、そのまま次を実行できます:
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=seeedstudio123/test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube" \
--dataset.push_to_hub=false \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=30
このうち、repo_id は任意に変更でき、push_to_hub=false となっています。最終的に、データセットはホームフォルダ内の ~/.cache/huggingface/lerobot ディレクトリに保存され、そこで前述の seeedstudio123/test フォルダが作成されます。
- Hugging Face Hub の機能を使ってデータセットをアップロードしたい場合で、まだ行っていない場合は、Hugging Face settings から作成できる書き込み権限付きトークンを使ってログインしていることを確認してください:
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="Grab the black cube" \
--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)
Record 関数
record 関数は、ロボットの動作中にデータを取得および管理するための一連のツールを提供します。
1. データ保存
- データは
LeRobotDataset形式で保存され、記録中にディスクに保存されます。 - デフォルトでは、記録後にデータセットはあなたの Hugging Face ページにプッシュされます。
- アップロードを無効にするには、
--dataset.push_to_hub=Falseを使用します。
2. チェックポイントと再開
- 記録中にチェックポイントが自動的に作成されます。
- 中断後に再開するには、同じコマンドを
--resume=trueを付けて再実行します。
⚠️ 重要な注意:再開する場合、--dataset.num_episodes には「データセット全体の目標エピソード数」ではなく、「追加で記録したいエピソード数」を設定してください。
- 最初から記録をやり直す場合は、データセットディレクトリを手動で削除してください。
3. 記録パラメータ
コマンドライン引数を使ってデータ記録の流れを設定します:
| パラメータ | 説明 | デフォルト |
|---|---|---|
| --dataset.episode_time_s | 1エピソードあたりのデータ記録時間(秒) | 60 |
| --dataset.reset_time_s | 各エピソード後の環境リセット時間(秒) | 60 |
| --dataset.num_episodes | 記録するエピソードの総数 | 50 |
4. 記録中のキーボード操作
キーボードショートカットを使ってデータ記録の流れを制御します:
| キー | 動作 |
|---|---|
| →(右矢印) | 現在のエピソード/リセットを早期終了し、次へ進む。 |
| ←(左矢印) | 現在のエピソードをキャンセルし、録り直す。 |
| ESC | セッションを即座に停止し、動画をエンコードしてデータセットをアップロードする。 |
キーボードが動作しない場合は、別バージョンの pynput をインストールする必要があるかもしれません。
pip install pynput==1.6.8
データ収集のヒント
- タスクの提案:さまざまな位置にある物体を把持し、ビンに入れる。
- 規模:50エピソード以上を記録する(位置ごとに10エピソード)。
- 一貫性:
- カメラは固定したままにする。
- 同じ把持動作を維持する。
- 操作対象の物体がカメラ映像内で見えるようにする。
- 段階的な拡張:
- まずは信頼性の高い把持ができるようにしてから、(新しい位置、手法、カメラ調整などの)バリエーションを追加する。
- 失敗を防ぐため、複雑さを急激に増やさない。
💡 経験則:カメラ画像だけを見て、自分自身でタスクを実行できる状態であるべきです。
この重要なトピックをさらに深く知りたい場合は、「良いデータセットとは何か」について執筆したブログ記事を参照してください。
記録中のキーボードショートカットに関する問題については、このページの最後にある FAQ セクションを参照してください。
データセットの可視化
データセットの可視化
学習前に、記録された画像・アクション・エピソードを確認します。
SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。
もし --control.push_to_hub=true でデータセットを Hub にアップロードしている場合は、以下で表示されるリポジトリ ID をコピー&ペーストすることで、オンラインでデータセットを可視化できます:
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 seeed_123/so101_test \
ここで、seeed_123 はデータ収集時に定義したカスタムの repo_id 名です。

データセットのリプレイ
データセットのリプレイ
実機アーム上で記録済みエピソードを再生し、アクションの一貫性を確認します。
ロボットアームの作業空間から半径1メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源やケーブルが正しく接続されていることを確認してください。
SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。
便利な機能として replay 関数があり、これを使うと自分で記録した任意のエピソードや、公開されている任意のデータセットのエピソードを再生できます。この機能により、ロボットの動作の再現性をテストしたり、同一モデルのロボット間での転移性を評価したりできます。
以下のコマンド、または API のサンプルを使って、ロボット上で最初のエピソードをリプレイできます:
lerobot-replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=seeedstudio123 \
--dataset.root=~/.cache/huggingface/lerobot/seeedstudio123 \
--dataset.episode=0 \
ロボットは、記録したものと同様の動きを再現するはずです。
このコマンドでは、dataset.root がデータセットへの物理パスを指定し、dataset.repo_id がデータ収集中に定義したカスタム名になります。
学習と評価
学習と評価
ACT、SmolVLA、Pi0、Pi0.5、GR00T、PEFT、非同期推論などのポリシーを学習・評価します。
ロボットアームの作業空間から半径1メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源やケーブルが正しく接続されていることを確認してください。
ACT
ACT を参照してください
ロボットを制御するポリシーを学習するには、lerobot-train スクリプトを使用します。
学習(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=seeedstudio123/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
RTX 50 シリーズ GPU を使用している場合は、学習コマンドに --dataset.video_backend=pyav を追加する必要があります。これは、torchvision のプレビュー版で不足している API を回避するためです。完全な学習コマンドは次のようになります:
lerobot-train \
--dataset.repo_id=seeedstudio123/test \
--dataset.video_backend=pyav \
--policy.type=act \
--output_dir=outputs/train/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,pi0fast,sac,smolvla] などのポリシーを切り替えることができ、その場合はconfiguration_act.pyから設定が読み込まれます。重要な点として、このポリシーは、データセット内にすでに保存されている情報に基づき、ロボット(例:laptopやphone)のモータ状態・モータアクション・カメラ数に自動的に適応します。 - デバイス選択:Nvidia GPU 上で学習するため
policy.device=cudaを指定していますが、Apple Silicon で学習する場合はpolicy.device=mpsを使用できます。 - 可視化ツール:学習チャートを Weights and Biases で可視化するために
wandb.enable=trueを指定します。これは任意ですが、使用する場合はwandb loginを実行してログインしておいてください。
評価(Evaluate)
SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。
ポリシーのチェックポイントを入力として、lerobot/record.py の record 関数を使用できます。例えば、次のコマンドを実行して 10 エピソード分の評価を記録します:
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30, fourcc: "MJPG"}, side: {type: intelrealsense, serial_number_or_name: 233522074606, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--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" \
--policy.path=${HF_USER}/my_policy
例えば次のようになります:
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=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/train/act_so101_test/checkpoints/last/pretrained_model
-
--policy.pathパラメータは、ポリシー学習結果の重みファイルへのパスを示します(例:outputs/train/act_so101_test/checkpoints/last/pretrained_model)。モデル学習結果の重みファイルを Hub にアップロードした場合は、モデルリポジトリ(例:\${HF_USER}/act_so100_test)を使用することもできます。 -
データセット名
dataset.repo_idはeval_で始まります。この操作により、評価中に動画とデータが別々に記録され、seeed/eval_test123のようなeval_で始まるフォルダに保存されます。 -
評価フェーズ中に
File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/seeed/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
SmolVLA は、Hugging Face によるロボティクス向け軽量ファウンデーションモデルです。LeRobot データセット上で簡単にファインチューニングできるよう設計されており、開発を加速するのに役立ちます。
環境をセットアップする
次を実行して SmolVLA の依存関係をインストールします:
pip install -e ".[smolvla]"
自分のデータで SmolVLA をファインチューニングする
smolvla_base(事前学習済み 4.5 億パラメータモデル)を使用し、自分のデータでファインチューニングします。モデルを 20k ステップ学習するには、単一の A100 GPU でおおよそ 4 時間かかります。ステップ数は性能とユースケースに応じて調整してください。
GPU デバイスがない場合は、Google Colab 上のノートブックを使って学習できます。
--dataset.repo_id を使ってデータセットを学習スクリプトに渡します。インストールをテストしたい場合は、SmolVLA Paper 用に収集したデータセットの 1 つを使用する、次のコマンドを実行してください。
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
小さいバッチサイズから始めて、GPU が許す範囲で、かつ読み込み時間が短く保たれる限り、段階的に増やしていくことができます。
ファインチューニングは一種のアートです。ファインチューニング用オプションの完全な一覧を確認するには、次を実行します:
lerobot-train --help
ファインチューニング済みモデルを評価し、リアルタイムで実行する
エピソードを記録する場合と同様に、HuggingFace Hub にログインしておくことを推奨します。対応する手順は次を参照してください:Record a dataset。ログイン後は、次のようにして自分の環境で推論を実行できます:
lerobot-rollout \
--strategy.type=base \
--policy.path=${HF_USER}/act_policy \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras=="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--display_data=true \
--task="Your task description" \ # can be skipped for ACT
--duration=60
評価セットアップに応じて、評価スイート用に記録する時間(duration)やエピソード数を設定できます。
LIBERO
LIBERO は、生涯にわたるロボット学習を研究するために設計されたベンチマークです。ロボットは工場で一度だけ事前学習されるのではなく、時間の経過とともに人間のユーザーと一緒に学習と適応を続ける必要があります。この継続的な適応は、意思決定における生涯学習(LLDM)と呼ばれ、真にパーソナライズされたヘルパーロボットを構築するための重要なステップです。
LIBERO を用いた評価
LeRobot では、LIBERO をフレームワークに移植し、主に軽量 Vision-Language-Action モデルである SmolVLA の評価に使用しました。
LIBERO は現在、マルチ評価対応シミュレーションの一部となっており、フラグを 1 つ指定するだけで、単一のタスクスイートまたは複数のスイートをまとめて対象にポリシーをベンチマークできます。
LIBERO をインストールするには、LeRobot 公式手順に従った後、次を実行するだけです:pip install -e ".[libero]"
単一スイート評価
1 つの LIBERO スイート上でポリシーを評価します:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object \
--eval.batch_size=2 \
--eval.n_episodes=3
--env.taskはスイート(libero_object、libero_spatialなど)を選択します。--eval.batch_sizeは並列実行する環境数を制御します。--eval.n_episodesは実行するエピソードの総数を設定します。
マルチスイート評価
複数のスイートにまたがってポリシーを一度にベンチマークします:
lerobot-eval \
--policy.path="your-policy-id" \
--env.type=libero \
--env.task=libero_object,libero_spatial \
--eval.batch_size=1 \
--eval.n_episodes=2
- マルチスイート評価には、
--env.taskにカンマ区切りのリストを渡します。
学習コマンド例
lerobot-train \
--policy.type=smolvla \
--policy.repo_id=${HF_USER}/libero-test \
--dataset.repo_id=HuggingFaceVLA/libero \
--env.type=libero \
--env.task=libero_10 \
--output_dir=./outputs/ \
--steps=100000 \
--batch_size=4 \
--eval.batch_size=1 \
--eval.n_episodes=1 \
--eval_freq=1000 \
レンダリングに関する注意
LeRobot はシミュレーションに MuJoCo を使用します。学習または評価を行う前に、レンダリングバックエンドを設定する必要があります:
export MUJOCO_GL=egl→ ヘッドレスサーバー向け(例:HPC、クラウド)
Pi0
Pi0 を参照してください
pip install -e ".[pi]"
学習
lerobot-train \
--dataset.repo_id=your_dataset \
--policy.type=pi0 \
--output_dir=./outputs/pi0_training \
--job_name=pi0_training \
--policy.pretrained_path=lerobot/pi0_base \
--policy.repo_id=your_repo_id \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--policy.dtype=bfloat16 \
--policy.freeze_vision_encoder=false \
--policy.train_expert_only=false \
--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=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/pi0_training/checkpoints/last/pretrained_model
Pi0.5
Pi0.5 を参照してください
pip install -e ".[pi]"
学習
lerobot-train \
--dataset.repo_id=seeed/eval_test123 \
--policy.type=pi05 \
--output_dir=./outputs/pi05_training \
--job_name=pi05_training \
--policy.repo_id=your_repo_id \
--policy.pretrained_path=lerobot/pi05_base \
--policy.compile_model=true \
--policy.gradient_checkpointing=true \
--wandb.enable=true \
--policy.dtype=bfloat16 \
--policy.freeze_vision_encoder=false \
--policy.train_expert_only=false \
--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=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/pi05_training/checkpoints/last/pretrained_model
GR00T N1.5
公式ドキュメントを参照してください: GR00T N1.5。
GR00T N1.5 は、より汎用的なロボットの推論とスキル学習のための、NVIDIA によるオープンな基盤モデルです。これはクロスエンボディメントモデルであり、言語や画像などのマルチモーダル入力を受け取り、異なる環境にまたがってマニピュレーションタスクを実行できます。
LeRobot では、重要なのはポリシータイプを --policy.type=groot に設定することです。GR00T N1.5 は環境要件が高い点に注意してください(FlashAttention に依存し、CUDA GPU が必要です)。まず ACT / Pi0 をエンドツーエンドで動作させてから、GR00T を試すことを推奨します。
インストール(重要)
現在の公式ドキュメントによると、GR00T N1.5 には flash-attn が必要であり、CUDA 対応ハードウェアでのみ使用できます。
推奨される手順は次のとおりです:
- まずベース環境(Python、CUDA、ドライバなど)を準備します。この時点では
lerobotをインストールしないでください。 - 使用している CUDA バージョンに対応した PyTorch をインストールします(CUDA バージョンによっては異なる
--index-urlが必要になる場合があります。PyTorch のインストールページに従ってください)。
pip install "torch>=2.2.1,<2.8.0" "torchvision>=0.21.0,<0.23.0"
RTX 50 シリーズ GPU を使用している場合、次の要件を満たす必要があります: Python=3.10, CUDA=12.8, Torch=2.7.1
ダウンロードコマンドは次のとおりです:
pip install torch==2.7.1 torchvision==0.22.1 torchaudio==2.7.1 --index-url https://download.pytorch.org/whl/cu128
flash-attnのビルド依存関係をインストールし、その後flash-attn本体をインストールします。
pip install ninja "packaging>=24.2,<26.0"
pip install "flash-attn>=2.5.9,<3.0.0" --no-build-isolation
python -c "import flash_attn; print(f'Flash Attention {flash_attn.__version__} imported successfully')"
RTX 50 シリーズ GPU を使用している場合、次の要件を満たす必要があります: flash_attn=2.8.0
ダウンロードコマンドは次のとおりです:
pip install flash_attn==2.8.0.post2 torch==2.7.1 --no-build-isolation
grootのオプション依存関係付きで LeRobot をインストールします(lerobot[groot])。
pip install "lerobot[groot]"
もし flash-attn のインストールに失敗する場合、主な原因は通常、(1) PyTorch と CUDA の不整合、(2) ビルド依存関係の不足、または (3) 環境が新しすぎる/古すぎる、のいずれかです。まず公式の GR00T ドキュメントと PyTorch のインストール手順を突き合わせて確認してください。
学習(ファインチューニング)
公式ドキュメントには accelerate launch --multi_gpu ... を用いたマルチ GPU の例が掲載されています。単一 GPU しか持っていない場合でも、まず単一プロセスの実行を動作させるところから始めることができます(正確なサポート内容や引数は公式ドキュメントに依存します)。
accelerate launch \
--multi_gpu \
--num_processes=$NUM_GPUS \
$(which lerobot-train) \
--output_dir=$OUTPUT_DIR \
--save_checkpoint=true \
--batch_size=$BATCH_SIZE \
--steps=$NUM_STEPS \
--save_freq=$SAVE_FREQ \
--log_freq=$LOG_FREQ \
--policy.push_to_hub=true \
--policy.type=groot \
--policy.repo_id=$REPO_ID \
--policy.tune_diffusion_model=false \
--dataset.repo_id=$DATASET_ID \
--wandb.enable=true \
--wandb.disable_artifact=true \
--job_name=$JOB_NAME
ロボット上での検証(評価)
学習後は、他のポリシーと同様に lerobot-record を使って評価とリプレイの記録を行うことができます。公式ドキュメントには両腕ロボットの例が含まれていますが、SO101 の単腕ユーザーは left_arm_port/right_arm_port 形式の引数は不要です。
lerobot-record \
--robot.type=bi_so_follower \
--robot.left_arm_port=/dev/ttyACM1 \
--robot.right_arm_port=/dev/ttyACM0 \
--robot.id=bimanual_follower \
--robot.cameras='{ right: {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}, left: {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30}, top: {"type": "opencv", "index_or_path": 4, "width": 640, "height": 480, "fps": 30} }' \
--display_data=true \
--dataset.repo_id=${HF_USER}/eval_groot_bimanual \
--dataset.num_episodes=10 \
--dataset.single_task="Grab and handover the red cube to the other arm" \
--policy.path=${HF_USER}/groot-bimanual \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=10
ライセンス: Apache 2.0(元の GR00T リポジトリと同じ)。
(オプション) パラメータ効率の良いファインチューニング (PEFT)
PEFT(Parameter-Efficient Fine-Tuning)は、大規模な事前学習済みモデルが新しいタスクに適応する際に、すべてのパラメータを更新せずに済むようにする手法とツールのファミリーです。事前学習済みの LeRobot ポリシー(例: SmolVLA、Pi0)に対しては、多くの場合、小さな「アダプタ」パラメータ群(例: LoRA)のみを学習することで、VRAM 使用量と学習コストを削減しつつ、フルファインチューニングに近い性能を達成できます。
インストール
LeRobot を peft のオプション依存関係付きでインストールした後、学習時に PEFT 関連の引数を使用できます。
pip install -e ".[peft]"
pip install "lerobot[peft]"
より詳しい概念と手法については、🤗 PEFT documentation を参照してください。
例: SmolVLA を LoRA でファインチューニングする(LIBERO libero_spatial サブタスク)
この例では、HuggingFaceVLA/libero データセット上で lerobot/smolvla_base を LoRA によりファインチューニングします。引数名は LeRobot のバージョンに依存するため、lerobot-train --help も併せて確認することを推奨します。
lerobot-train \
--policy.path=lerobot/smolvla_base \
--policy.repo_id=${HF_USER}/my_libero_smolvla_peft \
--dataset.repo_id=HuggingFaceVLA/libero \
--env.type=libero \
--env.task=libero_spatial \
--output_dir=outputs/train/my_libero_smolvla_peft \
--job_name=my_libero_smolvla_peft \
--policy.device=cuda \
--steps=10000 \
--batch_size=32 \
--optimizer.lr=1e-3 \
--peft.method_type=LORA \
--peft.r=64
主要な PEFT 引数
--peft.method_type: 使用する PEFT 手法を選択します。LoRA(Low-Rank Adapter)は最も一般的な選択肢の一つです。--peft.r: LoRA のランク。ランクを高くすると通常は表現能力が増しますが、パラメータ数と VRAM 使用量も増加します。
LoRA を注入するレイヤー/モジュールの選択(オプション)
デフォルトでは、PEFT は通常、最も重要な射影レイヤー(例: attention の q_proj、v_proj)に LoRA を注入し、状態/アクションの射影も対象に含める場合があります。カスタマイズしたい場合は、--peft.target_modules を使用します。
一般的なパターン:
- モジュール名のサフィックスのリストを指定する(例):
--peft.target_modules="['q_proj', 'v_proj']"
- 正規表現を指定する(例。モデル内の実際のモジュール名に合わせて調整してください):
--peft.target_modules='(model\\.vlm_with_expert\\.lm_expert\\..*\\.(down|gate|up)_proj|.*\\.(state_proj|action_in_proj|action_out_proj|action_time_mlp_in|action_time_mlp_out))'
一部のモジュールをフル学習する(オプション)
特定のモジュールを(LoRA の注入だけでなく)フルに学習させたい場合は、--peft.full_training_modules を使用します。例えば、state_proj のみをフル学習するには次のようにします:
--peft.full_training_modules="['state_proj']"
学習率の目安(経験則)
LoRA の学習率は、フルファインチューニングよりもおおよそ 10 倍程度高く設定されることが多いです。例えば、フルファインチューニングで一般的に 1e-4 を用いる場合、LoRA では 1e-3 から始めることができます。学習率スケジューラを使用する場合、最終的な学習率は目安として 1e-4 前後になることが多いです。
(オプション) Accelerate を用いたマルチ GPU 学習
学習手順
方法 1: CLI フラグを使用する。
lerobot環境にaccelerateをインストールします。
pip install accelerate
accelerate launchと--multi_gpuおよび--num_processesフラグを使ってマルチ GPU 学習を起動します。
accelerate launch \
--multi_gpu \
--num_processes=2 \
$(which lerobot-train) \
--dataset.repo_id=${HF_USER}/my_dataset \
--policy.type=act \
--policy.repo_id=${HF_USER}/my_trained_policy \
--output_dir=outputs/train/act_multi_gpu \
--job_name=act_multi_gpu \
--wandb.enable=true
主要な accelerate フラグ:
--multi_gpu: マルチ GPU 学習を有効にします。--num_processes: 使用する GPU の数(通常はマシン上で利用可能な GPU の数と同じです)。--mixed_precision=fp16: fp16 の混合精度を使用します(ハードウェアが対応している場合は bf16 も使用できます)。
注意: bf16 にはハードウェアのサポートが必要であり、すべての GPU で利用できるわけではありません。
| 精度 | ハードウェアサポート |
|---|---|
| fp16 | ほぼすべての NVIDIA GPU でサポート |
| bf16 | 一部の新しい GPU(Ampere 以降)のみサポート |
GPU が bf16 をサポートしていない場合は、Accelerate の設定で fp16 を選択するか、明示的に fp16 を指定してください。
方法 2: accelerate の設定ファイルを使用する(オプション)。
頻繁にマルチ GPU で学習する場合は、設定を保存して同じフラグを毎回入力しなくて済むようにできます。
accelerate config は、ハードウェア構成(GPU の数、混合精度など)を設定ファイルに保存し、後で accelerate launch を実行する際にそれらのオプションを再入力しなくて済むようにします。これは LeRobot の学習ロジック自体を変更するものではなく、CLI 入力の繰り返しを減らすだけです。
マルチ GPU をたまにしか使わない場合(あるいは今回が初めての場合)は、これをスキップしてもまったく問題ありません。
対話的な設定において、一般的な「単一マシン + 複数 GPU」のシナリオでは、典型的な選択肢は次のとおりです:
- Compute environment: This machine
- Number of machines: 1
- Number of processes: 使用したい GPU の数
- GPU ids to use: Enter キーを押す(すべての GPU を使用)
- Mixed precision: fp16 を推奨。GPU が対応していることが分かっている場合のみ bf16 を選択してください。
accelerate config
accelerate launch $(which lerobot-train) \
--dataset.repo_id=${HF_USER}/my_dataset \
--policy.type=act \
--policy.repo_id=${HF_USER}/my_trained_policy \
--output_dir=outputs/train/act_multi_gpu \
--job_name=act_multi_gpu \
--wandb.enable=true
マルチ GPU がハイパーパラメータに与える影響(および調整方法)
LeRobot は、トレーニング動作が暗黙的に変化してしまうことを避けるため、GPU 数に基づいて学習率やトレーニングステップ数を自動調整しません。これは、他のいくつかの分散トレーニングフレームワークとは異なります。
マルチ GPU 用にハイパーパラメータを調整したい場合、一般的なアプローチは次のとおりです:
- ステップ数:有効バッチサイズ(batch_size × num_gpus)が増加するため、
1 / num_gpusにおおよそ比例するようにステップ数を減らすことで、モデルが見るサンプル総数を同程度に保つことができます。
accelerate launch --num_processes=2 $(which lerobot-train) \
--batch_size=8 \
--steps=50000 \
--dataset.repo_id=lerobot/pusht \
--policy=act
- 学習率:各ステップで使用されるサンプル数が増えるため、多くの場合、学習率を GPU 数に対して線形にスケーリングできます: new_lr = single_gpu_lr × num_gpus
accelerate launch --num_processes=2 $(which lerobot-train) \
--optimizer.lr=2e-4 \
--dataset.repo_id=lerobot/pusht \
--policy=act
これらは厳密なルールではなく、一般的な経験則です。よく分からない場合は、トレーニングが安定している限り、学習率やステップ数を変更せずにそのままにしておくこともできます。
高度な設定やトラブルシューティングについては、Accelerate のドキュメントを参照してください:Accelerate。
(オプション)非同期推論
非同期推論が有効になっていない場合、LeRobot の制御フローは従来型の逐次 / 同期推論として理解できます:ポリシーがまず一連のアクションチャンクを予測し、それを実行し、その後になって次の予測を待ちます。
大きなモデルでは、次のアクションチャンクを待っている間にロボットが目に見えて一時停止してしまうことがあります。
非同期推論の目的は、現在のアクションチャンクをロボットに実行させながら、次のチャンクを事前に計算することで、アイドル時間を減らし応答性を向上させることです。
非同期推論は、ACT、OpenVLA、Pi0、SmolVLA などのチャンクベースのアクションポリシーを含む、LeRobot がサポートするポリシーに適用できます。
推論が実際の制御から切り離されるため、非同期推論は、より強力な計算リソースを持つマシンを用いてロボットの推論を行うのにも役立ちます。
非同期推論の詳細については、Hugging Face のブログを参照してください。
まず、いくつかの基本概念を紹介します:
-
クライアント:ロボットアームとカメラに接続し、画像やロボットの姿勢などの観測データを収集してサーバーに送信し、サーバーから返されるアクションチャンクを受信して順番に実行します。
-
サーバー:計算リソースを提供するデバイスです。カメラデータとロボットアームデータを受信し、推論(すなわち計算)を行ってアクションチャンクを生成し、それをクライアントに送り返します。これはロボットアームとカメラに接続された同じデバイスでも、同一ローカルネットワーク上の別のコンピュータでも、インターネット上で借りたクラウドサーバーでもかまいません。
-
アクションチャンク:サーバー側でのポリシー推論によって得られる、ロボットアームのアクションコマンド列です。
非同期推論の 3 つのデプロイシナリオ
- 単一マシンでのデプロイ
ロボット、カメラ、クライアント、サーバーがすべて同じデバイス上にあります。
これは最も単純なケースです:サーバーは 127.0.0.1 で待ち受けでき、クライアントも 127.0.0.1:port に接続できます。公式ドキュメントのコマンド例はこのシナリオを想定しています。
- LAN デプロイ
ロボットとカメラは軽量なデバイスに接続され、ポリシーサーバーは同じローカルネットワーク内の別の高性能マシン上で動作します。
この場合、サーバーは他のマシンからアクセス可能なアドレスで待ち受ける必要があり、クライアントは 127.0.0.1 ではなくサーバーの LAN IP に接続しなければなりません。
- ネットワーク越し / クラウドデプロイ
ポリシーサーバーはパブリックにアクセス可能なクラウドホスト上で動作し、クライアントはインターネット経由でそれに接続します。
この方法ではクラウドホストのより強力な GPU を利用できます。ネットワーク状態が良好な場合、往復のネットワーク時間(ネットワークレイテンシ)は推論時間と比べて相対的に小さい場合もありますが、これは実際のネットワーク環境に依存します。
セキュリティに関する注意:LeRobot の非同期推論パイプラインには、認証されていない gRPC + pickle デシリアライズに関連するリスクがあります。サーバー上に重要な情報や重要なサービスがある場合、パブリックなデプロイでサービスをインターネットに直接公開することは推奨されません。より安全な方法は、VPN や SSH トンネリングを使用するか、少なくともセキュリティグループで許可する送信元 IP を自分のクライアントのパブリック IP にできるだけ制限することです。
非同期推論デプロイの始め方
ステップ 1:環境構築
まず、非同期推論に必要な追加依存関係を pip でインストールします。クライアントとサーバーの両方で、追加依存関係付きの lerobot をインストールする必要があります:
pip install -e ".[async]"
ステップ 2:ネットワーク設定と確認
- プロキシの問題
現在使用しているターミナルでプロキシが設定されており、接続の挙動がおかしい場合は、プロキシ用の環境変数を一時的に解除できます:
unset http_proxy https_proxy ftp_proxy all_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY ALL_PROXY
注意:上記のコマンドは現在のターミナルセッションにのみ影響します。別のターミナルウィンドウを開いた場合は、再度実行する必要があります。
- ファイアウォール / セキュリティグループでポートを開く
単一マシンデプロイ:通常はこの手順を省略できます。
LAN デプロイ:サーバー側で待ち受けポートを開く必要があります。
LAN 構成で待ち受けポートを開く例(サーバー側で実行):
sudo ufw allow 8080/tcp
クラウドデプロイ:クラウドサーバーのセキュリティグループでこのポートを開く必要があり、可能な限り送信元 IP を制限することを推奨します。
クラウドサーバー上で実行している場合:
サーバー管理コンソールのセキュリティグループでポート 8080 を開くか、すでに開いている別のポートを使用します。クラウドサービスプラットフォームごとに操作方法が異なるため、利用しているクラウドプロバイダのドキュメントを参照してください。
- IP アドレスの確認
単一マシンデプロイの場合、この手順は省略できます(単一マシンの IP アドレスは常に 127.0.0.1 です)。
LAN デプロイの場合:
サーバー側の LAN IP アドレスを確認して覚えておく必要があります。クライアントが接続する際に指定すべきなのは、policy_server を実行しているマシンの LAN IP であり、クライアント自身の IP ではありません。
Linux / Jetson / Raspberry Pi:
hostname -I
複数のアドレスが表示される場合は、一般的に現在接続している LAN のネットワークインターフェースに対応するもの(例:192.168.x.x)を選びます。
次のコマンドを使うこともできます:
ip addr
を実行して、現在接続しているネットワークインターフェースの inet フィールドを確認します。
Windows:
ipconfig
IPv4 Address . . . . . . . . . . . : 192.168.14.140 のようなフィールドを探します。これがそのマシンの LAN IP アドレスです。
macOS:
ifconfig
現在接続しているネットワークインターフェースに対応する inet フィールドを探します。これが LAN IP アドレスです。
サーバー側の LAN IP アドレスを覚えておく必要があります。ここではそれを <LAN IP address> と表記します。
クラウドサーバーデプロイの場合:
サーバーのコントロールパネルでパブリック IP を探します。通常、次のいずれかの名称になっています:
Public IPv4
External IP
Public IP address
EIP
Public IP
パブリック IP アドレスを覚えておく必要があります。ここではそれを <server public IP> と表記します。
- 接続テスト
単一マシンデプロイ:この手順は省略できます
LAN / クラウドデプロイ:クライアント側からサーバーポートに到達できるかテストすることを推奨します。テスト例は次のとおりです:
LAN 例:クライアント側で実行
nc -vz <LAN IP address> 8080
クラウド例:クライアント側で実行
nc -vz <server public IP> 8080
ステップ 3:サービスを起動する
シナリオ A:単一マシンデプロイ
1 つのターミナルでローカルサービスを起動します:
python -m lerobot.async_inference.policy_server \
--host=127.0.0.1 \
--port=8080
正常に起動したら、このターミナルは開いたままにしておく必要があります。別のコマンドを実行するには、新しいターミナルを開いてください。
シナリオ B:LAN デプロイ
サーバー側で実行:
python -m lerobot.async_inference.policy_server \
--host=0.0.0.0 \
--port=8080
この場合、クライアントが接続する際の --server_address には、<LAN IP address>:8080 のようにサーバー側の LAN IP アドレスを指定する必要があります。
シナリオ C:クラウドサーバーデプロイ
サーバー側で実行:
python -m lerobot.async_inference.policy_server \
--host=0.0.0.0 \
--port=8080
この場合、クライアントが接続する際の --server_address には、<server public IP>:8080 のようにサーバーのパブリック IP アドレスを指定する必要があります。
ステップ 4:推論パラメータを選択する
クライアント側で実行:
python -m lerobot.async_inference.robot_client \
--server_address=<ip address>:8080 \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=follower_so100 \
--robot.cameras="{ laptop: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}, phone: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--task="dummy" \
--policy_type=your_policy_type \
--pretrained_name_or_path=user/model \
--policy_device=cuda \
--actions_per_chunk=50 \
--chunk_size_threshold=0.5 \
--aggregate_fn_name=weighted_average \
--debug_visualize_queue_size=True
パラメータの説明:
--server_address
ポリシーサーバーのアドレスとポートを指定します。<ip address> は 127.0.0.1(ローカルマシン)、<LAN IP address>(LAN)、または <server public IP>(クラウドサーバー)に置き換えてください。
--robot.type, --robot.port, --robot.id, --robot.cameras
ハードウェアデバイスのパラメータです。これらはデータセット収集時に使用したパラメータと一致させる必要があります。
--task
タスクの説明です。SmolVLA のようなビジョン・ランゲージポリシーは、このタスクテキストに基づいて行動のターゲットを決定できます。
--policy_type
ここを特定のポリシー名に置き換えます。例えば:
-
smolvla
-
act
-
--pretrained_name_or_path
この値はサーバー側のモデルパス、または Hugging Face 上のモデルパスに置き換えてください。
--policy_device
サーバー側で使用する推論デバイスを指定します。
cuda、mps、または cpu を指定できます。
--actions_per_chunk=50
1 回の推論で出力されるアクション数を指定します。
この値が大きいほど:
利点:アクションバッファに十分な余裕ができ、枯渇しにくくなる 欠点:予測ホライズンが長くなるため、制御誤差がより顕著に蓄積する可能性がある
--chunk_size_threshold=0.5
次のアクションチャンクをサーバーに要求するタイミングを指定します。
これはしきい値で、通常 0〜1 の範囲です。
次のように理解できます:現在のアクションキューの残りの割合がこのしきい値を下回ったとき、クライアントは事前に新しい観測を送信し、次のアクションチャンクを要求します。
ここで 0.5 に設定するということは:
現在のアクションチャンクが約半分消費されたときに
クライアントが次のアクションチャンクの要求を開始することを意味します
この値が大きいほど、リクエスト送信の頻度が高くなり、システムの応答性は向上しますが、サーバーへの負荷も増加します。
この値が小さいほど、挙動は同期推論に近づきます。
--aggregate_fn_name=weighted_average
重なり合うアクション区間を集約する方法を指定します。
非同期推論では、古いアクションチャンクがまだ完全に実行されていないうちに、新しいアクションチャンクがすでに到着している場合があります。
その場合、2 つのチャンクは時間区間の一部で重なり合うため、それらを最終的に実行されるアクションに統合するための集約関数が必要になります。
weighted_average の意味は:
重み付き平均を用いて重なり部分を融合する、ということです。
これにより、通常はアクションの切り替えがよりスムーズになり、急激な変化が減少します。
--debug_visualize_queue_size=True
実行時にアクションキューのサイズを可視化するかどうかを指定します。
有効にすると、キューが頻繁に底をついていないかをより直接的に確認でき、actions_per_chunk と chunk_size_threshold のチューニングに役立ちます。
ステップ 5: ロボットの挙動に基づいてパラメータを調整する
非同期推論では、同期推論には存在しない、調整が必要な追加パラメータが 2 つあります:
パラメータ 推奨初期値 説明
actions_per_chunk 50 ポリシーが一度に出力するアクション数。典型的な値:10〜50。
chunk_size_threshold 0.5 アクションキューの残りの割合が chunk_size_threshold 以下になったとき、クライアントが新しいアクションチャンクを要求します。値の範囲は [0, 1] です。
--debug_visualize_queue_size=True の場合、実行時にアクションキューサイズの変化がプロットされます。
非同期推論でバランスを取るべきなのは、サーバーがアクションチャンクを生成する速度が、クライアントがアクションチャンクを消費する速度以上であることです。そうでない場合、アクションキューが空になり、ロボットは再びカクつき始めます(これは、キューの可視化において曲線が下限に張り付く形で確認できます)。
サーバーがアクションチャンクを生成する速度は、モデルサイズ、デバイスタイプ、VRAM / メモリ、GPU の計算能力などの要因に影響されます。
クライアントがアクションチャンクを消費する速度は、設定された実行 fps の影響を受けます。
キューが頻繁に空になる場合は、actions_per_chunk を増やす、chunk_size_threshold を増やす、または fps を下げる必要があります。
キューの曲線が頻繁に変動していても、キュー内の残りアクションが常に十分である場合は、chunk_size_threshold を適切に下げることができます。
一般的には:
actions_per_chunk の経験的な範囲は 10〜50
chunk_size_threshold の経験的な範囲は 0.5〜0.7 であり、チューニング時は 0.5 から始めて徐々に増やしていくことを推奨します
次のエラーが発生した場合:
TypeError: stack(): argument 'tensors' (position 1) must be tuple of Tensors, not Column
次のコマンドを実行して解決を試してください:
pip install datasets==2.19
学習には数時間かかります。outputs/train/act_so100_test/checkpoints にチェックポイントが保存されます。
チェックポイントから学習を再開するには、以下は act_so101_test ポリシーの last チェックポイントから再開するためのコマンド例です:
lerobot-train \
--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
中間チェックポイントをアップロードすることもできます:
CKPT=010000
huggingface-cli upload ${HF_USER}/act_so101_test${CKPT} \
outputs/train/act_so101_test/checkpoints/${CKPT}/pretrained_model
FAQ
FAQ
ポート、サーボ ID、ffmpeg、カメラ、データセット、評価、学習に関するトラブルシューティングを一元的にまとめています。
どの LeRobot リポジトリを使うべきですか?
この wiki で推奨されているリポジトリを使用してください:
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
このバージョンは SO-ARM10x で検証済みです。上流の LeRobot リポジトリは更新が速いため、コマンド引数、データセット形式、依存関係がこのチュートリアルと異なる場合があります。
サーボ ID 設定中に Motor 'gripper' was not found と表示される
次のようなエラーが表示された場合:
Motor 'gripper' was not found, Make sure it is connected
通信ケーブルが正しく接続されているか、サーボバスに正しい電圧が供給されているかを確認してください。
Could not connect on port "/dev/ttyACM0"
/dev/ttyACM0 が存在するにもかかわらず LeRobot が接続できない場合、通常はシリアルポートの権限が不足しています。次を実行してください:
sudo chmod 666 /dev/ttyACM*
また、リーダーアームとフォロワーアームが想定どおりのポートにマッピングされているかも再確認してください。
No valid stream found in input file
次のように表示される場合:
No valid stream found in input file. Is -1 of the desired media type?
ffmpeg 7.1.1 をインストールしてください:
conda install ffmpeg=7.1.1 -c conda-forge

Present_Position の同期読み取りに失敗した
次のように表示される場合:
ConnectionError: Failed to sync read 'Present_Position' on ids=[1,2,3,4,5,6] after 1 tries. [TxRxResult] There is no status packet!
該当するアームの電源が入っているか、バスサーボのデータケーブルが緩んでいたり外れていたりしないかを確認してください。サーボの LED が消灯している場合、そのサーボより前のケーブルが緩んでいる可能性があります。
キャリブレーション中に Magnitude 30841 exceeds 2047 と表示される
次のように表示される場合:
Magnitude 30841 exceeds 2047 (max for sign_bit_index=11)
一度アームの電源を切って再起動し、再度キャリブレーションを行ってください。問題が解決しない場合は、Seeed Studio SoARM クイックキャリブレーションツールを使用して中立位置のキャリブレーションとサーボ ID の確認を行い、その後にアーム全体のキャリブレーションをやり直してください。
修理や部品交換後はどのように再キャリブレーションすればよいですか?
古いキャリブレーションファイルを削除してから、再度キャリブレーションを行ってください:
rm -rf ~/.cache/huggingface/lerobot/calibration/robots
rm -rf ~/.cache/huggingface/lerobot/calibration/teleoperators
キャリブレーション情報は、これらのディレクトリ内の JSON ファイルとして保存されています。ハードウェアが変更されたにもかかわらず古いキャリブレーションファイルが残っていると、LeRobot が古いオフセットを再利用してしまう可能性があります。
録画中にキーボードショートカットが動作しない
データセット録画中に右矢印キー、左矢印キー、または ESC キーが反応しない場合、まず $DISPLAY 環境変数が設定されているか確認してください。また、pynput をダウングレードしてみることもできます:
pip install pynput==1.6.8
録画中に失敗したエピソードはどのように扱えばよいですか?
物体が落下した、グリッパーが掴み損ねた、エピソードの品質が低いなどの場合は、アームを安全な待機姿勢に戻し、左矢印キーを押してそのエピソードを破棄して再録画してください。タスクが早く完了し、ロボットがすでに待機姿勢に戻っている場合は、右矢印キーを押すことで、残り時間をすべて待たずに次のエピソードへ進むことができます。
データセット収集時に注意すべき点は何ですか?
カメラの位置、カメラの角度、および周囲の照明を安定させてください。カメラビュー内に不安定な背景や歩行者が入らないようにします。記録時とデプロイ時の環境に大きな差異があると、ポリシーがうまく動作しない可能性があります。
開始前に --dataset.num_episodes を十分大きな値に設定してください。必要な場合を除き、記録の途中で手動で停止しないでください。平均値や分散などのデータセット統計量は収集完了後に計算され、学習に必要となるためです。
記録したデータセットを削除または変更するには?
記録済みデータセットの削除や編集については、データセットツールのチュートリアルを参照してください:
USB カメラの画像データが読み取れない
USB カメラを USB ハブ経由で接続するのは避けてください。デバイスに直接接続し、可能であれば USB 3.0 ポートを使用して、十分な画像伝送帯域幅を確保してください。
Orbbec カメラのタイムアウトまたはシリアル番号の不一致
フレーム待機中にタイムアウトが発生した場合は、カメラを一度抜き差ししてください。次のようなメッセージが表示される場合:
No Orbbec camera found for 'XXXX'
カメラ検出コマンドを実行し、実際のシリアル番号で serial_number_or_name を更新してください:
lerobot-find-cameras orbbec
評価中に File exists と表示される
評価時に eval_ ディレクトリがすでに存在すると報告された場合は、既存の評価フォルダを削除してから、もう一度プログラムを実行してください。
File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/seeed/eval_xxxx'
評価中に mean is infinity と表示される
次のようなメッセージが表示される場合:
mean is infinity. You should either initialize with stats as an argument or use a pretrained model
front や side など、--robot.cameras のカメラキーが、データセット記録時に使用したキーと完全に一致していることを確認してください。
TypeError: stack(): argument 'tensors' must be tuple of Tensors
次のようなメッセージが表示される場合:
TypeError: stack(): argument 'tensors' (position 1) must be tuple of Tensors, not Column
互換性のある datasets バージョンのインストールを試してください:
pip install datasets==2.19
rerun に scalar 属性がない
次のようなメッセージが表示される場合:
AttributeError: module 'rerun' has no attribute 'scalar'. Did you mean: 'scalars'?
rerun SDK をダウングレードしてください:
pip3 install rerun-sdk==0.23
ACT の学習には通常どのくらい時間がかかりますか?
おおよその目安として、50 エピソードで ACT を学習する場合、ノート PC の RTX 3060 8GB では約 6 時間、RTX 4090 や A100 では約 2〜3 時間かかります。実際の時間は、データセットサイズ、画像解像度、バッチサイズ、ハードウェアによって異なります。
この FAQ を確認しても解決しないソフトウェアや依存関係の問題が発生した場合は、LeRobot GitHub リポジトリ または LeRobot Discord チャンネル に報告してください。
引用
引用
関連するドキュメント、プロジェクト、論文、および外部リソース。
TheRobotStudio プロジェクト: SO-ARM10x
Huggingface プロジェクト: Lerobot
Dnsty: Jetson Containers
技術サポート & 製品ディスカッション
技術サポート & 製品ディスカッション
製品に関する質問について、Seeed Studio に連絡し、コミュニティディスカッションに参加しましょう。
弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じて選べる複数のコミュニケーションチャネルをご用意しています。
















































