メインコンテンツまでスキップ

LeRobot における SO-ARM100 および SO-ARM101 ロボットアーム入門

SO-ARM10x × LeRobot

組み立てとキャリブレーションからデータセット収集、学習、実機デプロイまで

このWikiでは、LeRobot における SO-ARM100 / SO-ARM101 の一連のワークフローを順を追って解説します。 ハードウェアセットアップ、サーボ設定、アームキャリブレーション、テレオペレーション、カメラ連携、 データセット記録、可視化、リプレイ、ポリシー学習、評価、およびデプロイのコツを扱います。

推奨リーディングパス初めてのユーザー:仕様、電源ルール、サーボ設定から始めてください。完成品アームユーザー:アーム全体のキャリブレーションとテレオペレーションに進んでください。既存の LeRobot ユーザー:カメラ、データセット記録、学習、FAQ へ直接進んでください。
⚠️
安全上の警告:モーションプログラムを実行する前にロボットアームの作業空間を必ず片付けてください

ロボットアームを動かす可能性のあるプログラムを実行する前に、作業空間の半径1メートル以内から、 貴重品、壊れやすい物、工具、ケーブル、および無関係な物体を取り除いてください。デバッグや動作中は、 人がアームの動作範囲に近づかないようにしてください。

  • アームの電源が入っている状態では、関節、モーター、リンク、グリッパー、エンドツールには触れないでください。
  • サーボ設定、キャリブレーション、テレオペレーション、データセット記録、リプレイ、ポリシー評価の前に、アームがしっかり固定されていることを確認してください。
  • 少なくとも1メートルの安全距離を保ち、周囲の人にアームが突然動く可能性があることを理解してもらってください。
  • 異常な動き、異音、振動、ケーブルの緩み、電源接触不良、通信断などが発生した場合は、直ちにプログラムを停止し、電源を切ってから点検してください。
  • サーボケーブル、USB ケーブル、電源コネクタ、モーター制御ボードのケーブルを抜き差しする前には、必ず電源を切ってください。

推奨学習パス

ステップ概要

実際のデバッグワークフローに沿ってステップごとに進める

SO-ARM10x を初めてセットアップする場合は、テレオペレーション、カメラ、データセット、学習、評価に進む前に、ハードウェア準備、環境構築、キャリブレーションを完了してください。

1
キットを理解する

SO-ARM100 / SO-ARM101 のバージョン、モータータイプ、電圧、BOM を確認します。

準備
2
LeRobot をインストール

Miniforge、検証済みの Seeed LeRobot リポジトリ、ffmpeg、PyTorch、カメラ依存パッケージをセットアップします。

環境
3
モーターを設定して組み立てる

サーボ ID とボーレートを設定し、リーダーアームとフォロワーアームを組み立てます。

ハードウェア
4
キャリブレーションとテレオペ

両方のアームをキャリブレーションし、リーダーからフォロワーへの制御チェーンが安定していることを確認します。

制御
5
カメラを追加してデータを記録

OpenCV、RealSense、Orbbec などのカメラを接続し、クリーンで再現性のあるエピソードを記録します。

データ
6
ポリシーを学習・評価

まず ACT から始め、その後 SmolVLA、Pi0、Pi0.5、GR00T、PEFT、非同期推論を試してみてください。

AI

概要

概要

プロジェクト紹介

SO-ARM10x は、オープンソースで低コストなロボットアームと LeRobot エコシステムを組み合わせ、データ収集、模倣学習、実機デプロイを実現します。

ヒント

このチュートリアルは最新の LeRobot に合わせて更新されています。以前のバージョンを表示するには、こちらをクリックしてください。

SO-10xARM は、TheRobotStudio によって立ち上げられた、完全オープンソースのロボットアームプロジェクトです。フォロワーアームとリーダーアームの両方を含み、詳細な3Dプリント用ファイルと操作ガイドが提供されています。LeRobot は、実世界ロボティクス向けの PyTorch モデル、データセット、ツールを提供し、模倣学習とポリシーデプロイの参入障壁を下げます。

SO-ARM10x と reComputer Jetson AI ロボティクスキットは、高精度なロボットアーム制御と AI コンピューティングプラットフォームを組み合わせたものです。Jetson Orin または AGX Orin と LeRobot フレームワークを組み合わせることで、教育、研究、産業オートメーション実験に利用できます。

SO-ARM10x kit
注意

Seeed Studio はキットのハードウェア品質に責任を負います。ソフトウェアチュートリアルは、可能な限り公式の LeRobot ドキュメントに沿っています。解決できないソフトウェアや依存関係の問題が発生した場合は、このページ末尾の FAQ を確認し、LeRobot GitHub リポジトリ または LeRobot Discord チャンネル に問題を報告してください。

主な特長

特長

主な特長

SO-ARM10x は、オープンソース学習、低コストロボティクス、LeRobot 連携、NVIDIA へのデプロイに重点を置いています。

オープンソースかつ低コストTheRobotStudio の SO-ARM プロジェクトに基づくオープンソースのロボットアームソリューションです。
LeRobot 連携LeRobot におけるテレオペレーション、データセット記録、学習、実機評価のために設計されています。
豊富な学習リソース組み立て、キャリブレーション、テスト、データセット、学習、デプロイに関するガイドを含みます。
NVIDIA 対応reComputer Mini J4012 Orin NX 16GB などのプラットフォームと組み合わせてデプロイできます。
マルチシナリオ応用教育、研究、自動化デモ、ロボティクス学習に適しています。

新着情報

更新情報

SO-ARM101 の新機能

SO-ARM101 では、配線、リーダーアームのギア比、リアルタイム追従動作が改善されています。

配線の最適化SO-ARM100 と比較して、SO-ARM101 では配線が改善され、ジョイント3の断線問題を回避しています。新しい配線ルートは、関節の動作範囲を制限しません。
リーダーのギア比アップデートリーダーアームには最適化されたギア比のモーターが採用されており、性能が向上し、外部ギアボックスが不要になりました。
リアルタイム追従リーダーアームはフォロワーアームをリアルタイムで追従でき、人間が介入してロボットの動作を修正できる将来のポリシーワークフローに役立ちます。

仕様

仕様

仕様

SO-ARM100 および SO-ARM101 のモーター、電源、通信、制御仕様を確認します。

SO-ARM10x の仕様を表示
タイプSO-ARM100SO-ARM101
Arm KitArm Kit ProArm KitArm Kit Pro
リーダーアームすべての関節に 1:345 のギア比を持つ 12 個の ST-3215- C001 (7.4V) モーターすべての関節に 1:345 のギア比を持つ 12 個の ST-3215-C018/ST-3215-C047 (12V) モーター

関節 2 のみに 1:345 のギア比を持つ 1 個の ST-3215- C001 (7.4V) モーター
関節 1 と 3 に 1:191 のギア比を持つ 2 個の ST-3215-C044 (7.4V) モーター
関節 4、5、およびグリッパー(関節 6)に 1:147 のギア比を持つ 3 個の ST-3215-C046 (7.4V) モーター

フォロワーアームSO-ARM100 と同じ
電源5.5 mm × 2.1 mm DC 5 V 4 A5.5 mm × 2.1 mm DC 12 V 2 A5.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(リーダーアーム)

角度センサー12 ビット磁気エンコーダ
推奨動作温度0 °C ~ 40 °C
通信UART
制御方法PC
危険

Arm Kit バージョンを購入した場合、両方の電源は 5V です。Arm Kit Pro バージョンを購入した場合は、リーダーロボットアームのキャリブレーションおよびすべてのステップには 5V 電源を使用し、フォロワーロボットアームのキャリブレーションおよびすべてのステップには 12V 電源を使用してください。

部品表 (BOM)

BOM

部品表 (BOM)

キットに含まれるサーボ、モーター制御ボード、ケーブル、電源、クランプ、およびオプションの 3D プリント部品を確認します。

部品表を表示
部品数量同梱
サーボモーター12
モーター制御ボード2
USB-C ケーブル 2 本1
電源 22
テーブルクランプ4
アームの 3D プリント部品1オプション

3D プリントガイド

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 プリントできるよう 1 つのファイルにまとめられており、サポートを最小限に抑えるために z 方向が上になるよう正しく向きを揃えています。

  • Ender など、プリントベッドサイズが 220mm×220mm の場合は、次のファイルを印刷します:

  • Prusa/Up など、プリントベッドサイズが 205mm × 250mm の場合:

ステップ 4:ソフトグリッパーの印刷(オプション)

ロボットアームで柔らかい物、壊れやすい物、不規則な形の物をつかみたい場合は、デフォルトの剛性グリッパーの代わりにソフトグリッパーを印刷できます。印刷ファイルは soarm_soft_gripper リポジトリから入手できます。

印刷材料の説明:

  • 2 つのグリッパー指部:TPU 材料で印刷
  • その他の部品:PLA 材料で印刷

初期システム環境

環境

初期システム環境

インストール前に、Ubuntu、Jetson、CUDA、Python、PyTorch、および Torchvision の要件を確認します。

Ubuntu x86 の場合:

  • Ubuntu 22.04
  • CUDA 12 以上
  • Python 3.10
  • Torch 2.6 以上

Jetson Orin の場合:

  • Jetson JetPack 6.0 および 6.1(JetPack 6.2 はまだサポートされていません)
  • Python 3.10
  • Torch 2.3 以上

LeRobot のインストール

ステップ 1

LeRobot のインストール

Miniforge、検証済みの Seeed LeRobot リポジトリ、ffmpeg、PyTorch、およびハードウェア固有の依存関係をインストールします。

pytorch や torchvision などの環境は、使用している CUDA に基づいてインストールする必要があります。

  1. 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
  1. lerobot 用の新しい conda 環境を作成して有効化します
conda create -y -n lerobot python=3.10 && conda activate lerobot
  1. Lerobot をクローンします:
git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot
  1. 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 バイナリを使用していることを確認します。

このようなエラーが発生した場合は、このコマンドも使用できます。

  1. feetech モーター用の依存関係付きで LeRobot をインストールします:
cd ~/lerobot && pip install -e ".[feetech]"
  1. 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 # これは torchvision に一致させる必要があります`}

  1. Pytorch と Torchvision を確認する

pip で lerobot 環境をインストールすると、元の Pytorch と Torchvision がアンインストールされ、CPU 版の Pytorch と Torchvision がインストールされるため、Python で確認を行う必要があります。

python   # ターミナルで Python を起動するコマンド
import torch
print(torch.cuda.is_available())
exit() # Python を終了

出力結果が False の場合、現在の環境は CPU 版の PyTorch を使用しています。Jetson 上で GPU 対応の PyTorch と Torchvision が必要な場合は、このチュートリアル に従ってインストールしてください。GPU での学習や推論が必要な環境では、最終的な確認結果が True である必要があります。

モーターを設定しアームを組み立てる

Step 2

モーターを設定しアームを組み立てる

サーボ ID とボーレートを設定し、配線と電源を確認してから、リーダーアームとフォロワーアームを組み立てます。

⚠️
実行前の安全確認

ロボットアームの作業空間から 1 メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源とケーブルが正しく接続されていることを確認してください。

ヒント

完成品のロボットアームを購入した場合は、キャリブレーションのセクションまでスキップしてください。

キット版の場合は、以下の手順に従ってください

SO-ARM101 のサーボキャリブレーションと初期化の手順は、方法とコードの両方において SO-ARM100 と同じです。ただし、SO-ARM101 のリーダーアームの最初の 3 つの関節のギア比は SO-ARM100 とは異なるため、それらを区別して慎重にキャリブレーションすることが重要です。

モーターを設定するには、1 つのバスサーボアダプタと 6 個のモーターをリーダーアーム用に割り当て、同様にもう 1 つのバスサーボアダプタと 6 個のモーターをフォロワーアーム用に割り当てます。モーターごとに、フォロワー(F)用かリーダー(L)用か、そして ID(1〜6)を書き込んでラベル付けしておくと便利です。F1–F6フォロワーアーム の 1〜6 番目の関節、L1–L6リーダーアーム の 1〜6 番目の関節として表します。対応するサーボモデル、関節の割り当て、およびギア比の詳細は次のとおりです:

サーボモデルギア比対応する関節
ST-3215-C044(7.4V)1:191L1
ST-3215-C001(7.4V)1:345L2
ST-3215-C044(7.4V)1:191L3
ST-3215-C046(7.4V)1:147L4–L6
ST-3215-C001(7.4V) / C018(12V) / C047(12V)1:345F1–F6
危険

ここで、モーターバスに 5V または 12V の電源を接続する必要があります。STS3215 7.4V モーターには 5V、STS3215 12V モーターには 12V を使用します。リーダーアームは常に 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(スレーブ/フォロワーアーム)に割り当てられ、2 番目に接続したデバイスは ttyACM1(マスター/リーダーアーム)に割り当てられます。

モーターを設定する

リーダーサーボのキャリブレーション参照画像

リーダーアーム 関節 6 のキャリブレーションリーダーアーム 関節 5 のキャリブレーションリーダーアーム 関節 4 のキャリブレーションリーダーアーム 関節 3 のキャリブレーションリーダーアーム 関節 2 のキャリブレーションリーダーアーム 関節 1 のキャリブレーション
fig1fig2fig3fig4fig5fig6

フォロワーサーボのキャリブレーション参照画像

フォロワーアーム 関節 6 のキャリブレーションフォロワーアーム 関節 5 のキャリブレーションフォロワーアーム 関節 4 のキャリブレーションフォロワーアーム 関節 3 のキャリブレーションフォロワーアーム 関節 2 のキャリブレーションフォロワーアーム 関節 1 のキャリブレーション
fig1fig2fig3fig4fig5fig6
ヒント

繰り返しになりますが、サーボ関節のIDとギア比が、SO-ARM101 のものと厳密に一致していることを必ず確認してください。

フォロワーアームのサーボをキャリブレーションする

コンピュータからフォロワーアームのコントローラボードへ 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.

指示どおり、グリッパーのモーターを接続します。ボードに接続されているモーターがそれだけであり、かつそのモーター自体がまだ他のモーターとデイジーチェーン接続されていないことを確認してください。[Enter] を押すと、スクリプトがそのモーターの ID とボーレートを自動的に設定します。

その後、次のメッセージが表示されます。

'gripper' motor id set to 6

続いて次の指示が表示されます。

Connect the controller board to the 'wrist_roll' motor only and press enter.

コントローラボード側の 3 ピンケーブルは取り外して構いませんが、反対側はすでに正しい位置にあるため、グリッパーモーターには接続したままで問題ありません。次に、別の 3 ピンケーブルを手首ロールモーターに接続し、それをコントローラボードに接続します。前のモーターと同様に、ボードに接続されているモーターがそれだけであり、かつそのモーター自体が他のモーターに接続されていないことを確認してください。

注意

指示に従って、各モーターに対して同じ操作を繰り返してください。

ヒント

Enter を押す前に、毎回配線を確認してください。例えば、ボードを操作している間に電源ケーブルが外れてしまう可能性があります。

すべて完了すると、スクリプトは単に終了し、その時点でモーターは使用可能な状態になります。各モーターから次のモーターへ 3 ピンケーブルを接続し、最初のモーター(id=1 の「ショルダーパン」)からのケーブルをコントローラボードに接続します。コントローラボードはアームのベースに取り付けることができます。

リーダーアームのサーボをキャリブレーションする

リーダーアームについても同じ手順を実行します。

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 ではケーブルクリップが追加されていることと、リーダーアームの関節サーボのギア比が異なることです。そのため、SO100 と SO101 のどちらも、以下の内容を参照して組み立てることができます。
  • 組み立て前に、モーターの型番、ギア比、および電源電圧をもう一度確認してください。SO101 を購入した場合は、上記のサーボ型番と関節マッピング表を参照して、F1〜F6 と L1〜L6 を区別してください。

リーダーアームを組み立てる

ステップ 1ステップ 2ステップ 3ステップ 4ステップ 5ステップ 6
fig1fig2fig3fig4fig5fig6
ステップ 7ステップ 8ステップ 9ステップ 10ステップ 11ステップ 12
fig1fig2fig3fig4fig5fig6
ステップ 13ステップ 14ステップ 15ステップ 16ステップ 17ステップ 18
fig1fig2fig3fig4fig5fig6
ステップ 19ステップ 20
fig1fig2

フォロワーアームを組み立てる

ヒント
  • フォロワーアームの組み立て手順は、基本的にリーダーアームと同じです。唯一の違いは、ステップ 12 以降のエンドエフェクタ(グリッパーとハンドル)の取り付け方法です。
ステップ 1ステップ 2ステップ 3ステップ 4ステップ 5ステップ 6
fig1fig2fig3fig4fig5fig6
ステップ 7ステップ 8ステップ 9ステップ 10ステップ 11ステップ 12
fig1fig2fig3fig4fig5fig6
ステップ 13ステップ 14ステップ 15ステップ 16ステップ 17
fig1fig2fig3fig4fig5

ロボットアームをキャリブレーションする

ステップ 3

ロボットアームをキャリブレーションする

フォロワーアームとリーダーアームをキャリブレーションし、物理的な位置がソフトウェア上の状態と一致するようにします。

⚠️
実行前の安全確認

ロボットアームの作業空間から 1 メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源とケーブルが正しく接続されていることを確認してください。

ヒント

SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。

危険

SO101 Arm Kit Standard Edition を購入した場合、すべての電源は 5V です。SO101 Arm Kit Pro Edition を購入した場合、リーダーアームは各ステップで 5V 電源を使用してキャリブレーションおよび動作させる必要があり、フォロワーアームは各ステップで 12V 電源を使用してキャリブレーションおよび動作させる必要があります。

次に、SO-10x ロボットに電源とデータケーブルを接続してキャリブレーションを行い、同じ物理位置にあるときにリーダーアームとフォロワーアームの位置値が同じになるようにする必要があります。このキャリブレーションは、ある 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 に移動してキャリブレーション結果を検証

次の順番で実行します(コマンドは対話的にポートの選択を求めます):

  1. (オプション)トルクを無効化して、関節を手動で調整します:
python -m src.tools.servo_disable
  1. 中立位置キャリブレーションを実行します(現在位置を 2048 に設定):
python -m src.tools.servo_middle_calibration
  1. 検証:サーボを 2048 に移動し、期待される中立位置に戻るか確認します:
python -m src.tools.servo_center_test

中立位置キャリブレーションが完了したら、上記の lerobot-calibrate の手順に戻り、アーム全体のキャリブレーションをやり直してください。

上記のようなエラーが発生した場合は、ステアリングギアデバッグツールを使用してデバッグできます。これは Windows、Ubuntu、Mac をサポートしています。

テレオペレーション

Step 4

Teleoperation

カメラを追加したりデータを収集したりする前に、リーダーからフォロワーへのテレオペレーションテストを実行します。

⚠️
実行前の安全確認

ロボットアームの作業空間から 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 コマンドは自動的に以下を行います:

  1. 不足しているキャリブレーションを検出し、キャリブレーション手順を開始します。
  2. ロボットとテレオペデバイスに接続し、テレオペレーションを開始します。

カメラを追加

Step 5

Add Cameras

OpenCV、RealSense、または Orbbec カメラを追加し、データセットを記録する前に画像ストリームを確認します。

If using RealSense D435i/D405

RealSense 深度カメラは LeRobot に RGB-D 認識機能を提供でき、物体認識、点群再構成、テーブルトップマニピュレーションなどのタスクに適しています。ここで推奨するモデルは RealSense D405RealSense D435i です。

RealSense D405

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

RealSense D435i

RealSense D435i は深度センシング、RGB 画像、および IMU を組み合わせており、3D 再構成、SLAM、ロボットによる環境認識などの中距離から近距離のアプリケーションに適しています。

1. Camera ブランチに切り替える

現在のカメラサポートは 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 テスト:

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 台以上の深度カメラを接続する場合は、全体の安定性を高めるために fps15 に下げることを推奨します。
  • 安定性とリアルタイム性のバランスを取るため、解像度は 640x480 に保つことを推奨します。
Orbbec Gemini2/Gemini336 カメラを使用する場合

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

Gemini 336 は Gemini 330 シリーズの新しいメンバーです。Gemini 335 の優れた深度性能を受け継ぎつつ、反射の多い屋内エリア、高ダイナミックシーンの暗部、明るい屋外環境における深度画像品質をさらに向上させています。ロボットアプリケーションにおいては、認識、自己位置推定、マニピュレーションなどのタスクに対して、より安定した高品質な深度データを提供できます。

1. Camera ブランチに切り替える

現在のカメラサポートは 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

このステップでは次の情報が出力されます:

  • カメラモデル(名前)
  • シリアル番号(Serial number)
  • USB 情報
  • デフォルトのストリーム設定

取得した Serial Number を、以下に示すカメラコマンドの serial_number_or_name パラメータに入力します。

6. Orbbec の例

単一 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
}
}' \
--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 台以上の深度カメラを接続する場合は、より高い安定性のために fps15 に下げることを推奨します。
  • より安定した表示とデータ転送のため、解像度は 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 statesudomacOS。これは同じコマンドを権限付きで実行することで解決できます。ただし、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 HUB を介して 2 台のカメラをコンピュータに接続することは推奨されません。

ヒント

このようなバグが発生した場合。

rerun のバージョンをダウングレードすることで問題を解決できます。

pip3 install rerun-sdk==0.23

データセットの記録

Step 6

データセットの記録

ローカルにデータセットを記録するか、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各データエピソードの長さ(秒)60
--dataset.reset_time_s各エピソード後の環境リセット時間(秒)60
--dataset.num_episodes記録するエピソードの総数50

4. 記録中のキーボード操作

キーボードショートカットを使ってデータ記録の流れを制御します:

キー動作
→(右矢印)現在のエピソードを早期終了/リセットし、次へ進む。
←(左矢印)現在のエピソードをキャンセルし、再記録する。
ESCセッションを即座に停止し、動画をエンコードしてデータセットをアップロードする。
ヒント

キーボードが動作しない場合は、別バージョンの pynput をインストールする必要があるかもしれません。

pip install pynput==1.6.8

データ収集のコツ

  • タスクの提案:さまざまな位置にある物体を把持し、ビンに入れます。
  • 規模:50 エピソード以上を記録します(位置ごとに 10 エピソード)。
  • 一貫性:
    • カメラを固定したままにする。
    • 同じ把持動作を維持する。
    • 操作対象の物体がカメラ映像内で見えるようにする。
  • 段階的な発展:
    • 新しい位置、手法、カメラ調整などのバリエーションを加える前に、まずは安定した把持を実現する。
    • 失敗を防ぐため、複雑さを急激に増やさない。

💡 経験則:カメラ画像だけを見て、自分自身でタスクを実行できる状態であるべきです。

この重要なトピックをさらに深く知りたい場合は、良いデータセットとは何かについて執筆した blog post を参照してください。

記録中のキーボードショートカットに関する問題については、このページの最後にある FAQ セクションを参照してください。

データセットの可視化

Dataset

データセットの可視化

学習前に、記録された画像、アクション、エピソードを確認します。

ヒント

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 名です。

データセットのリプレイ

Dataset

データセットのリプレイ

記録済みエピソードを実機アーム上で再生し、アクションの一貫性を確認します。

⚠️
実行前の安全確認

ロボットアームの作業空間から 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 はデータ収集時に定義したカスタム名です。

学習と評価

Step 7

学習と評価

ACT、SmolVLA、Pi0、Pi0.5、GR00T、PEFT、非同期推論などのポリシーを学習および評価します。

⚠️
実行前の安全確認

ロボットアームの作業空間から 1 メートル以内の貴重品や無関係な人を退避させてください。 このセクションを実行する前に、アームがしっかりと固定されていること、電源とケーブルが正しく接続されていることを確認してください。

ACT

ACT を参照してください

ロボットを制御するポリシーを学習するには、lerobot-train スクリプトを使用します。

学習

lerobot-train \
--dataset.repo_id=${HF_USER}/so101_test \
--policy.type=act \
--output_dir=outputs/train/act_so101_test \
--job_name=act_so101_test \
--policy.device=cuda \
--wandb.enable=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 から設定が読み込まれます。重要な点として、このポリシーは、データセット内にすでに保存されている情報に基づき、ロボット(例:laptopphone)のモータ状態、モータアクション、カメラ数に自動的に適応します。
  • デバイスの選択:Nvidia GPU 上で学習しているため policy.device=cuda を指定していますが、Apple Silicon で学習する場合は policy.device=mps を使用できます。
  • 可視化ツール:学習チャートを Weights and Biases で可視化するために wandb.enable=true を指定します。これは任意ですが、使用する場合は wandb login を実行してログインしていることを確認してください。

評価

ヒント

SO100 と SO101 のコードは互換性があります。SO100 のユーザーは、SO101 のパラメータとコードをそのまま利用して動作させることができます。

ポリシーのチェックポイントを入力として、lerobot/record.pyrecord 関数を使用できます。例えば、次のコマンドを実行して 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
  1. --policy.path パラメータは、ポリシー学習結果の重みファイルへのパスを示します(例:outputs/train/act_so101_test/checkpoints/last/pretrained_model)。モデル学習結果の重みファイルを Hub にアップロードした場合は、モデルリポジトリ(例:\${HF_USER}/act_so100_test)を使用することもできます。

  2. データセット名 dataset.repo_ideval_ で始まります。この操作により、評価中の動画とデータが別々に記録され、seeed/eval_test123 のような eval_ で始まるフォルダに保存されます。

  3. 評価段階で File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/seeed/eval_xxxx' に遭遇した場合は、まず eval_ で始まるフォルダを削除してから、プログラムを再実行してください。

  4. 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-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \ # <- Use your port
--robot.id=my_blue_follower_arm \ # <- Use your robot id
--robot.cameras="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \ # <- Use your cameras
--dataset.single_task="レゴブロックをつかんで、ビンの中に入れる。" \ # <- データセット記録時に使用したものと同じタスク説明を使用してください
--dataset.repo_id=${HF_USER}/eval_DATASET_NAME_test \ # <- これは HF Hub 上でのデータセット名になります
--dataset.episode_time_s=50 \
--dataset.num_episodes=10 \
# <- エピソード間でテレオペレーションを行いたい場合は teleop オプションを使用します \
# --teleop.type=so100_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_red_leader_arm \
--policy.path=HF_USER/FINETUNE_MODEL_NAME # <- ファインチューニングしたモデルを使用します

評価セットアップに応じて、評価スイート用に記録するエピソードの時間と本数を設定できます。

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_objectlibero_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 \
--policy.type=pi0 \
--dataset.repo_id=seeed/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=seeed/eval_test123 \
--dataset.single_task="レゴブロックを透明な箱の中に入れる" \
--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.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=seeed/eval_test123 \
--dataset.single_task="レゴブロックを透明な箱の中に入れる" \
--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 対応ハードウェアでのみ使用できます。

推奨される手順:

  1. まずベース環境(Python、CUDA、ドライバなど)を準備します。この時点では lerobot をインストールしないでください。
  2. 使用している 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
  1. 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
  1. 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="赤いキューブをつかんで、もう一方のアームに受け渡す" \
--policy.path=${HF_USER}/groot-bimanual \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=10

ライセンス: Apache 2.0(元の GR00T リポジトリと同じ)。

(オプション)Parameter-Efficient Fine-Tuning(PEFT)

PEFT(Parameter-Efficient Fine-Tuning)は、大規模な事前学習済みモデルが新しいタスクに適応する際に、すべてのパラメータを更新せずに済むようにする手法とツールの総称です。事前学習済みの LeRobot ポリシー(例:SmolVLA、Pi0)では、多くの場合、VRAM 使用量と学習コストを削減しつつ、フルファインチューニングに近い性能を維持するために、LoRA などの少数の「アダプタ」パラメータだけを学習すれば十分です。

インストール

オプションの peft 依存関係付きで LeRobot をインストールした後は、学習時に 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)は最も一般的な選択肢の 1 つです。
  • --peft.r: LoRA のランク。ランクを高くすると通常は表現能力が向上しますが、パラメータ数と VRAM 使用量も増加します。

LoRA を注入するレイヤー/モジュールの選択(オプション)

デフォルトでは、PEFT は通常、最も重要な射影レイヤー(例:attention の q_projv_proj)に LoRA を注入し、状態/アクションの射影もカバーする場合があります。カスタマイズしたい場合は、--peft.target_modules を使用します。

よく使われるパターン:

  1. モジュール名のサフィックスのリストを指定する(例):
--peft.target_modules="['q_proj', 'v_proj']"
  1. 正規表現を指定する(例。モデル内の実際のモジュール名に合わせて調整してください):
--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 フラグを使用する。

  1. lerobot 環境に accelerate をインストールします。
pip install accelerate
  1. 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 をサポートしていると分かっている場合のみ 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 用にハイパーパラメータを調整したい場合、一般的なアプローチは次のとおりです:

  • Steps: 有効バッチサイズ(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
  • Learning rate: 各ステップで使用されるサンプル数が増えるため、多くの場合、学習率を 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 つのデプロイシナリオ

  1. 単一マシンでのデプロイ

ロボット、カメラ、クライアント、サーバーがすべて同じデバイス上にあります。

これは最も単純なケースであり、サーバーは 127.0.0.1 で待ち受け、クライアントも 127.0.0.1:port に接続できます。公式ドキュメントのコマンド例はこのシナリオを想定しています。

  1. LAN 内でのデプロイ

ロボットとカメラは軽量なデバイスに接続され、ポリシーサーバーは同じローカルネットワーク内の別の高性能マシン上で動作します。

この場合、サーバーは他のマシンからアクセス可能なアドレスで待ち受ける必要があり、クライアントも 127.0.0.1 ではなくサーバーの LAN IP に接続しなければなりません。

  1. ネットワーク越し/クラウドでのデプロイ

ポリシーサーバーはパブリックにアクセス可能なクラウドホスト上で動作し、クライアントはインターネット経由でそれに接続します。

この方法では、クラウドホスト側のより強力なGPUを利用できます。ネットワーク環境が良好な場合、往復のネットワーク時間(ネットワークレイテンシ)は推論時間と比べて相対的に小さくなることもありますが、これは実際のネットワーク環境に依存します。

セキュリティに関する注意:LeRobot の非同期推論パイプラインには、認証されていない gRPC と pickle デシリアライズに関連するリスクがあります。サーバー上に重要な情報や重要なサービスがある場合、パブリックなデプロイでサービスをインターネットに直接公開することは推奨されません。より安全な方法は、VPN や SSH トンネリングを利用するか、少なくともセキュリティグループで許可する送信元 IP を自分のクライアントのパブリック IP に制限することです。

非同期推論デプロイの始め方

ステップ 1: 環境構築

まず、非同期推論に必要な追加依存関係を pip でインストールします。クライアントとサーバーの両方に、追加依存関係付きで lerobot をインストールする必要があります:

pip install -e ".[async]"

ステップ 2: ネットワーク設定と確認

  1. プロキシの問題

現在使用しているターミナルでプロキシが設定されており、接続の挙動がおかしい場合は、一時的にプロキシ関連の環境変数を解除できます:

unset http_proxy https_proxy ftp_proxy all_proxy HTTP_PROXY HTTPS_PROXY FTP_PROXY ALL_PROXY

注意:上記のコマンドは現在のターミナルセッションにのみ影響します。別のターミナルウィンドウを開いた場合は、再度実行する必要があります。

  1. ファイアウォール / セキュリティグループでポートを開放する

単一マシンデプロイ:通常はこの手順を省略できます。

LAN デプロイ:サーバー側で待ち受けポートを開放する必要があります。

LAN 構成で待ち受けポートを開放する例(サーバー側で実行):

sudo ufw allow 8080/tcp

クラウドデプロイ:クラウドサーバーのセキュリティグループでこのポートを開放する必要があり、可能な限り送信元 IP を制限することを推奨します。

クラウドサーバー上で実行している場合:

サーバー管理コンソールのセキュリティグループでポート 8080 を開放するか、すでに開放されている別のポートを使用します。クラウドサービスプラットフォームごとに操作方法が異なるため、利用しているクラウドプロバイダのドキュメントを参照してください。

  1. IP アドレスの確認

単一マシンデプロイの場合、この手順は省略できます(単一マシンの IP アドレスは常に 127.0.0.1 です)。

LAN デプロイの場合:

サーバー側の LAN IP アドレスを確認して覚えておく必要があります。クライアントが接続する際に指定すべきなのは、クライアント自身の IP ではなく、policy_server を実行しているマシンの LAN 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> と表記します。

  1. 接続テスト

単一マシンデプロイ:この手順は省略できます。

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

policy サーバーのアドレスとポートを指定します。<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

FAQ

ポート、サーボ ID、ffmpeg、カメラ、データセット、評価、学習に関するトラブルシューティングを一元的にまとめています。

どの LeRobot リポジトリを使うべきですか?

この wiki で推奨されているリポジトリを使用してください:

git clone https://github.com/Seeed-Projects/lerobot.git ~/lerobot

このバージョンは SO-ARM10x で検証済みです。上流の LeRobot リポジトリは更新が速いため、コマンド引数、データセット形式、依存関係がこのチュートリアルと異なる場合があります。

Motor 'gripper' was not found がサーボ ID 設定中に表示される

次のエラーが表示された場合:

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
No valid stream error
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 を十分大きな値に設定してください。必要な場合を除き、録画を途中で手動停止しないでください。平均値や分散などのデータセット統計量は収集完了後に計算され、学習に必要となるためです。

録画済みデータセットを削除または編集するには?

録画済みデータセットの削除や編集については、データセットツールのチュートリアルを参照してください:

Dataset Tool

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

frontside など、--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
rerunscalar 属性がない

次のメッセージが表示された場合:

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 チャンネル に報告してください。

引用

参考文献

引用

関連するドキュメント、プロジェクト、論文、および外部リソース。

Chinese Document

TheRobotStudio プロジェクト: SO-ARM10x

Huggingface プロジェクト: Lerobot

Dnsty: Jetson Containers

Jetson AI Lab

Diffusion Policy

ACT or ALOHA

TDMPC

VQ-BeT

技術サポート & 製品ディスカッション

サポート

技術サポート & 製品ディスカッション

製品に関するご質問について、Seeed Studio へ連絡し、コミュニティディスカッションに参加しましょう。

弊社製品をお選びいただきありがとうございます。お客様が弊社製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートをご用意しています。お好みやニーズに応じてお選びいただける複数のコミュニケーションチャネルを提供しています。

Loading Comments...