Skip to main content

LeRobotを使用したSO-ARM100およびSO-ARM101ロボットアームの開始

tip

このチュートリアルのメンテナンスは最新バージョンのlerobotに更新されています。以前のバージョンのチュートリアルを参照したい場合は、こちらをクリックしてください。

はじめに

SO-10xARMは、TheRobotStudioによって開始された完全にオープンソースのロボットアームプロジェクトです。フォロワーアームとリーダーロボットアームが含まれており、詳細な3Dプリントファイルと操作ガイドも提供されています。LeRobotは、PyTorchで実世界のロボティクス用のモデル、データセット、ツールを提供することに取り組んでいます。その目的は、ロボティクスの参入障壁を下げ、誰もがデータセットと事前訓練されたモデルの共有に貢献し、恩恵を受けることができるようにすることです。LeRobotは、実世界での応用に検証された最先端の方法論を統合し、模倣学習を中心としています。人間が収集したデモンストレーションを特徴とする事前訓練されたモデル、データセット、シミュレーション環境のスイートを提供し、ユーザーがロボットの組み立ての必要なしに開始できるようにしています。今後数週間で、現在利用可能な最も費用対効果が高く有能なロボットでの実世界のロボティクスのサポートを拡張する予定です。

プロジェクト紹介

SO-ARM10xとreComputer Jetson AIインテリジェントロボットキットは、高精度ロボットアーム制御と強力なAIコンピューティングプラットフォームをシームレスに組み合わせ、包括的なロボット開発ソリューションを提供します。このキットは、Jetson OrinまたはAGX Orinプラットフォームをベースとし、SO-ARM10xロボットアームとLeRobot AIフレームワークを組み合わせて、教育、研究、産業自動化などの複数のシナリオに適用可能なインテリジェントロボットシステムをユーザーに提供します。 このwikiは、SO ARM10xの組み立てとデバッグのチュートリアルを提供し、Lerobotフレームワーク内でのデータ収集とトレーニングを実現します。

主な特徴

  1. オープンソースで低コストTheRobotStudioからのオープンソース、低コストのロボットアームソリューションです
  2. LeRobotとの統合LeRobotプラットフォームとの統合のために設計されています
  3. 豊富な学習リソース:組み立てとキャリブレーションガイド、テスト、データ収集、トレーニング、デプロイメントのチュートリアルなど、包括的なオープンソース学習リソースを提供し、ユーザーが迅速に開始してロボットアプリケーションを開発できるよう支援します。
  4. Nvidiaとの互換性:このアームキットをreComputer Mini J4012 Orin NX 16 GBでデプロイします。
  5. マルチシーンアプリケーション:教育、科学研究、自動化生産、ロボティクスなどの分野に適用可能で、ユーザーがさまざまな複雑なタスクで効率的で精密なロボット操作を実現できるよう支援します。

新機能:

  • 配線の最適化:SO-ARM100と比較して、SO-ARM101は改良された配線を特徴とし、以前にジョイント3で見られた切断問題を防ぎます。新しい配線設計により、ジョイントの可動範囲も制限されなくなりました。
  • リーダーアームの異なるギア比:リーダーアームは最適化されたギア比のモーターを使用し、性能を向上させ、外部ギアボックスの必要性を排除しました。
  • 新機能サポート:リーダーアームがフォロワーアームをリアルタイムで追従できるようになりました。これは、人間がロボットの動作に介入して修正できる今後の学習ポリシーにとって重要です。
caution

Seeed Studioは、ハードウェア自体の品質についてのみ責任を負います。チュートリアルは公式ドキュメントに厳密に従って更新されています。解決できないソフトウェアの問題や環境依存の問題に遭遇した場合は、このチュートリアルの最後にあるFAQセクションを確認することに加えて、LeRobotプラットフォームまたはLeRobot Discordチャンネルに問題を速やかに報告してください。

仕様

タイプSO-ARM100SO-ARM101
アームキットアームキットProアームキットアームキットPro
リーダーアーム全ジョイント用の1:345ギア比を持つ12x ST-3215-C001(7.4V)モーター全ジョイント用の1:345ギア比を持つ12x ST-3215-C018/ST-3215-C047(12V)モーター

ジョイント2のみ用の1:345ギア比を持つ1x ST-3215-C001(7.4V)モーター
ジョイント1と3用の1:191ギア比を持つ2x ST-3215-C044(7.4V)モーター
ジョイント4、5、グリッパー(ジョイント6)用の1:147ギア比を持つ3x 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
danger

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

部品表(BOM)

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

初期システム環境

Ubuntu x86の場合:

  • Ubuntu 22.04
  • CUDA 12+
  • Python 3.10
  • Torch 2.6+

Jetson Orinの場合:

  • Jetson JetPack 6.0および6.1、6.1はサポートされていません
  • Python 3.10
  • Torch 2.3+

目次

A. 3Dプリントガイド

B. LeRobotのインストール

C. モーターの設定

D. 組み立て

E. キャリブレーション

F. テレオペレーション

G. カメラの追加

H. データセットの記録

I. データセットの可視化

J. エピソードの再生

K. ポリシーのトレーニング

L. ポリシーの評価

3Dプリントガイド

caution

SO101の公式アップデートに従い、SO100はもはやサポートされず、公式によるとソースファイルは削除されますが、ソースファイルは依然として私たちのMakerworldで見つけることができます。ただし、以前にSO100を購入したユーザーについては、チュートリアルとインストール方法は互換性があります。SO101のプリントは、SO100のモーターキットインストールと完全に互換性があります。

ステップ1:プリンターを選択する

提供されるSTLファイルは、多くのFDMプリンターでプリント可能です。以下はテスト済みで推奨される設定ですが、他の設定でも動作する可能性があります。

  • 材料:PLA+
  • ノズル径と精度:0.2mmレイヤー高さでの0.4mmノズル径、または0.4mmレイヤー高さでの0.6mmノズル。
  • 充填密度:15%

ステップ2:プリンターをセットアップする

  • プリンターが校正され、ベッドレベルがプリンター固有の指示に従って正しく設定されていることを確認してください。
  • プリントベッドを清掃し、ほこりや油脂がないことを確認してください。水やその他の液体でベッドを清掃した場合は、ベッドを乾燥させてください。
  • プリンターが推奨する場合は、標準的なグルースティックを使用し、ベッドのプリント領域全体に薄く均一にグルーを塗布してください。塊や不均一な塗布は避けてください。
  • プリンター固有の指示に従ってプリンターフィラメントをロードしてください。
  • プリンター設定が上記で推奨されたものと一致することを確認してください(ほとんどのプリンターには複数の設定があるため、最も近いものを選択してください)。
  • 水平面に対して45度を超える傾斜は無視して、すべての場所にサポートを設定してください。
  • 水平軸を持つネジ穴にはサポートがないようにしてください。

ステップ3:パーツを印刷する

リーダーまたはフォロワーのすべてのパーツは、簡単な3Dプリンティング用に既に単一ファイルに含まれており、サポートを最小限に抑えるためにz軸上向きに正しく配向されています。

  • 220mmx220mmのプリンターベッドサイズ(Enderなど)の場合、これらのファイルを印刷してください:

  • 205mm x 250mmのプリンターベッドサイズ(Prusa/Upなど)の場合:

LeRobotをインストールする

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

  1. Minicondaをインストール: Jetson用:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
chmod +x Miniconda3-latest-Linux-aarch64.sh
./Miniconda3-latest-Linux-aarch64.sh
source ~/.bashrc

または、X86 Ubuntu 22.04用:

mkdir -p ~/miniconda3
cd miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
source ~/miniconda3/bin/activate
conda init --all
  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. minicondaを使用する場合、環境にffmpegをインストール:
conda install ffmpeg -c conda-forge
tip

これは通常、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]"

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
  1. PytorchとTorchvisionを確認

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

import torch
print(torch.cuda.is_available())

印刷された結果がFalseの場合、公式ウェブサイトのチュートリアルに従ってPytorchとTorchvisionを再インストールする必要があります。

Jetsonデバイスを使用している場合は、このチュートリアルに従ってPytorchとTorchvisionをインストールしてください。

モーターを設定する

SO-ARM101のサーボ校正と初期化プロセスは、方法とコードの両方においてSO-ARM100と同じです。ただし、SO-ARM101リーダーアームの最初の3つの関節のギア比はSO-ARM100と異なるため、注意深く区別して校正することが重要です。

モーターを設定するには、リーダーアーム用に1つのバスサーボアダプターと6つのモーターを指定し、同様にフォロワーアーム用にもう1つのバスサーボアダプターと6つのモーターを指定します。それらにラベルを付け、各モーターがフォロワー用(F)かリーダー用(L)か、そして1から6までのIDを書いておくと便利です。フォロワーアームの関節1から6を表すためにF1–F6を使用し、リーダーアームの関節1から6を表すためにL1–L6を使用します。対応するサーボモデル、関節の割り当て、ギア比の詳細は以下の通りです:

サーボモデルギア比対応する関節
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
danger

モーターバスに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.
tip

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

モーターを設定する

danger

リーダーモーター(ST-3215-C046、C044、001)の校正には5V電源を使用してください。

リーダーアーム関節6校正リーダーアーム関節5校正リーダーアーム関節4校正リーダーアーム関節3校正リーダーアーム関節2校正リーダーアーム関節1校正
fig1fig2fig3fig4fig5fig6
danger

アームキット版(ST-3215-C001)を購入した場合は、5V電源を使用してください。アームキットプロ版を購入した場合は、サーボ(ST-3215-C047/ST-3215-C018)の校正に12V電源を使用してください。

フォロワーアーム関節6校正フォロワーアーム関節5校正フォロワーアーム関節4校正フォロワーアーム関節3校正フォロワーアーム関節2校正フォロワーアーム関節1校正
fig1fig2fig3fig4fig5fig6
tip

繰り返しになりますが、サーボジョイント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ピンケーブルを手首ロールモーターに接続し、コントローラーボードに接続してください。前のモーターと同様に、ボードに接続されているモーターがそれだけであることを確認し、モーター自体が他のモーターに接続されていないことを確認してください。

caution

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

tip

Enterを押す前に、各ステップでケーブル接続を確認してください。例えば、ボードを操作している間に電源ケーブルが外れる可能性があります。

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

リーダーアームについても同じ手順を実行してください。

lerobot-setup-motors \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 # <- paste here the port found at previous step

組み立て

tip
  • SO-ARM101のデュアルアーム組み立てプロセスは、SO-ARM100と同じです。唯一の違いは、SO-ARM101にケーブルクリップが追加されていることと、リーダーアームのジョイントサーボのギア比が異なることです。そのため、SO100とSO101の両方とも、以下の内容を参照して設置できます
  • 組み立て前に、モーターモデルと減速比を再度確認してください。SO100を購入した場合は、このステップを無視できます。SO101を購入した場合は、以下の表を確認してF1からF6、L1からL6を区別してください。
サーボモデルギア比対応ジョイント
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
danger

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

リーダーアームの組み立て

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

フォロワーアームの組み立て

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

キャリブレーション

tip

SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。

danger

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

次に、SO-10xロボットに電源とデータケーブルを接続してキャリブレーションを行い、リーダーアームとフォロワーアームが同じ物理的位置にあるときに同じ位置値を持つようにする必要があります。このキャリブレーションは、1つのSO-10xロボットで訓練されたニューラルネットワークが別のロボットで動作できるようにするために不可欠です。ロボットアームを再キャリブレーションする必要がある場合は、~/.cache/huggingface/lerobot/calibration/robotsまたは~/.cache/huggingface/lerobot/calibration/teleoperatorsの下のファイルを削除してロボットアームを再キャリブレーションしてください。そうしないと、エラープロンプトが表示されます。ロボットアームのキャリブレーション情報は、このディレクトリの下のJSONファイルに保存されます。

フォロワーアームの手動キャリブレーション

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キーを押してから、各関節を可動範囲全体で動かす必要があります。

リーダーアームの手動キャリブレーション

リーダーアームをキャリブレーションするために同じ手順を実行し、以下のコマンドまたは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

テレオペレーション

シンプルなテレオペレーション これでロボットをテレオペレーションする準備が整いました!この簡単なスクリプトを実行してください(カメラには接続せず、表示もしません):

ロボットに関連付けられた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

テレオペレーションコマンドは自動的に以下を実行します:

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

カメラの追加

tip

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ディレクトリで確認できます。

warning

macOSでIntel RealSenseカメラを使用する際、このエラーが発生する可能性があります:Error finding RealSense cameras: failed to set power state。これは同じコマンドをsudo権限で実行することで解決できます。なお、macOSでRealSenseカメラを使用することは不安定です。

その後、テレオペレーション中にコンピュータでカメラを表示できるようになります。以下のコードを実行してください。これは最初のデータセットを記録する前にセットアップを準備するのに役立ちます。

lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--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の最後の桁によって決まります。

例えば、サイドカメラを追加したい場合:

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}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_awesome_leader_arm \
--display_data=true
tip

このようなバグが見つかった場合。

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

pip3 install rerun-sdk==0.23

データセットの記録

  • データセットをローカルに保存したい場合は、直接実行できます:
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}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--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設定から生成できる書き込みアクセストークンを使用してログインしていることを確認してください:
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}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--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機能は、ロボット動作中のデータキャプチャと管理のためのツール群を提供します。

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セッションを即座に停止し、動画をエンコードし、データセットをアップロード。

データ収集のヒント

  • タスクの提案:異なる場所でオブジェクトを掴み、ビンに配置する。
  • スケール:≥50エピソードを記録(場所あたり10エピソード)。
  • 一貫性:
    • カメラを固定する。
    • 同一の掴み動作を維持する。
    • 操作されるオブジェクトがカメラフィードで見えることを確認する。
  • 進行:
    • バリエーション(新しい場所、技術、カメラ調整)を追加する前に、信頼性のある掴みから始める。
    • 失敗を防ぐため、急激な複雑さの増加を避ける。

💡 経験則:カメラ画像だけを見てタスクを自分で実行できるようにする必要があります。

この重要なトピックについてより深く学びたい場合は、良いデータセットとは何かについて書いたブログ記事をご確認ください。

トラブルシューティング

Linux固有の問題:
記録中に右矢印/左矢印/ESCキーが反応しない場合:

  • $DISPLAY環境変数が設定されていることを確認してください(pynputの制限事項を参照)。

データセットの可視化

tip

SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。

--control.push_to_hub=trueでデータセットをハブにアップロードした場合、以下のコマンドで取得したrepo 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名です。

エピソードの再生

tip

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=${HF_USER}/record-test \
--dataset.episode=0

ロボットは記録した動作と同様の動きを再現するはずです。

ポリシーの訓練

tip

SO100とSO101のコードは互換性があります。SO100のユーザーは、SO101のパラメータとコードを直接利用して操作できます。

ロボットを制御するポリシーを訓練するには、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

説明しましょう:

  • データセット指定:パラメータ--dataset.repo_id=${HF_USER}/so101_testでデータセットを提供します。
  • 訓練ステップ--steps=300000を使用して訓練ステップ数を変更します。アルゴリズムのデフォルトは800000ステップで、タスクの難易度と訓練中の損失を観察して調整できます。
  • ポリシータイプ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を実行してログインしていることを確認してください。

以下のエラーが発生した場合:

以下のコマンドを実行して解決してください:

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

その他のアルゴリズム

SmolVLA

SmolVLAは、ロボティクス向けのHugging Faceの軽量基盤モデルです。LeRobotデータセットでの簡単なファインチューニング用に設計されており、開発を加速するのに役立ちます!

環境のセットアップ

以下を実行してSmolVLAの依存関係をインストールします:

pip install -e ".[smolvla]"

データでSmolVLAをファインチューニング

事前訓練済みの450Mモデルであるsmolvla_baseを使用し、データでファインチューニングします。20kステップでモデルを訓練するには、単一のA100 GPUで約4時間かかります。パフォーマンスとユースケースに基づいてステップ数を調整する必要があります。

GPUデバイスがない場合は、Google Colabのノートブックを使用して訓練できます。

--dataset.repo_idを使用してデータセットを訓練スクリプトに渡します。インストールをテストしたい場合は、SmolVLA論文用に収集したデータセットの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
tip

小さなバッチサイズから始めて、GPUが許可し、読み込み時間が短い限り、段階的に増やすことができます。

ファインチューニングは芸術です。ファインチューニングのオプションの完全な概要については、以下を実行してください:

lerobot-train --help

ファインチューニングされたモデルの評価とリアルタイム実行

エピソードを記録する場合と同様に、HuggingFace Hubにログインすることをお勧めします。対応する手順に従うことができます:データセットの記録。ログインしたら、以下を実行してセットアップで推論を実行できます:

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}}" \ # <- Use your cameras
--dataset.single_task="Grasp a lego block and put it in the bin." \ # <- Use the same task description you used in your dataset recording
--dataset.repo_id=${HF_USER}/eval_DATASET_NAME_test \ # <- This will be the dataset name on HF Hub
--dataset.episode_time_s=50 \
--dataset.num_episodes=10 \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=so100_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_red_leader_arm \
--policy.path=HF_USER/FINETUNE_MODEL_NAME # <- Use your fine-tuned model

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

LIBERO

LIBEROは、生涯ロボット学習を研究するために設計されたベンチマークです。ロボットは工場で一度だけ事前訓練されるのではなく、時間をかけて人間のユーザーと共に学習し適応し続ける必要があるという考えです。この継続的な適応は意思決定における生涯学習(LLDM)と呼ばれ、真にパーソナライズされたヘルパーとなるロボットの構築に向けた重要なステップです。

LIBEROでの評価

LeRobotでは、LIBEROをフレームワークに移植し、主に軽量Vision-Language-ActionモデルであるSmolVLA評価に使用しました。

LIBEROは現在、マルチ評価対応シミュレーションの一部となっており、単一のタスクスイートまたは複数のスイートを同時にフラグ一つでポリシーをベンチマークできます。

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、クラウド)

ポリシーの評価

tip

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}, side: {type: intelrealsense, serial_number_or_name: 233522074606, width: 640, height: 480, fps: 30}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=${HF_USER}/eval_so100 \
--dataset.single_task="Put lego brick into the transparent box" \
--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}, side: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--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_で始まります。この操作により、評価中に動画とデータが個別に記録され、eval_で始まるフォルダ(例:seeed/eval_test123)に保存されます。

  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などのキーワードが、データセット収集時に使用したものと厳密に一致している必要があることに注意してください。

FAQ

  • このドキュメント/チュートリアルに従っている場合は、推奨されるGitHubリポジトリhttps://github.com/Seeed-Projects/lerobot.gitをgit cloneしてください。このドキュメントで推奨されるリポジトリは検証済みの安定版です。公式Lerobotリポジトリは最新版に継続的に更新されており、異なるデータセットバージョン、異なるコマンドなどの予期しない問題を引き起こす可能性があります。

  • サーボIDキャリブレーション時に以下のエラーが発生した場合:

    `Motor ‘gripper’ was not found, Make sure it is connected`

    通信ケーブルがサーボに正しく接続されているか、電源が正しい電圧を供給しているかを慎重に確認してください。

  • 以下のエラーが発生した場合:

    Could not connect on port "/dev/ttyACM0"

    ls /dev/ttyACM*を実行してACM0が存在することが確認できる場合、シリアルポートの権限付与を忘れています。ターミナルでsudo chmod 666 /dev/ttyACM*を入力して修正してください。

  • 以下のエラーが発生した場合:

    No valid stream found in input file. Is -1 of the desired media type?

    conda install ffmpeg=7.1.1 -c conda-forgeを使用してffmpeg 7.1.1をインストールしてください。

  • 以下のエラーが発生した場合:

    ConnectionError: Failed to sync read 'Present_Position' on ids=[1,2,3,4,5,6] after 1 tries. [TxRxResult] There is no status packet!

    対応するポートのロボットアームが電源オンになっているか、バスサーボのデータケーブルが緩んでいるか切断されていないかを確認する必要があります。サーボのライトが点灯していない場合は、前のサーボのケーブルが緩んでいることを意味します。

  • ロボットアームのキャリブレーション時に以下のエラーが発生した場合:

    Magnitude 30841 exceeds 2047 (max for sign_bit_index=11)

    ロボットアームの電源を切って再起動し、再度キャリブレーションを試してください。この方法は、キャリブレーション中にMAX角度が数万の値に達した場合にも使用できます。これで解決しない場合は、中央値キャリブレーションやID書き込みを含む対応するサーボの再キャリブレーションが必要です。

  • 評価フェーズで以下のエラーが発生した場合:

    File exists: 'home/xxxx/.cache/huggingface/lerobot/xxxxx/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」などのキーワードが、データセット収集時に使用したものと厳密に一致している必要があることに注意してください。

  • ロボットアームの部品を修理または交換した場合は、~/.cache/huggingface/lerobot/calibration/robotsまたは~/.cache/huggingface/lerobot/calibration/teleoperators下のファイルを完全に削除し、ロボットアームを再キャリブレーションしてください。そうしないと、これらのディレクトリのJSONファイルにキャリブレーション情報が保存されているため、エラーメッセージが表示される可能性があります。

  • 50セットのデータでACTをトレーニングするには、RTX 3060(8GB)搭載のラップトップで約6時間、RTX 4090またはA100 GPUを搭載したコンピュータで約2-3時間かかります。

  • データ収集中は、カメラの位置、角度、周囲の照明を安定させてください。カメラに映る不安定な背景や歩行者の量を減らしてください。展開環境の変化が過度になると、ロボットアームが適切に把握できなくなる可能性があります。

  • データ収集コマンドでは、num-episodesパラメータが十分なデータを収集するように設定されていることを確認してください。途中で手動で一時停止しないでください。データの平均と分散はデータ収集完了後にのみ計算され、これらはトレーニングに必要です。

  • プログラムがUSBカメラから画像データを読み取れないと表示される場合は、USBカメラがハブ経由で接続されていないことを確認してください。USBカメラは高速な画像転送速度を確保するため、デバイスに直接接続する必要があります。

  • AttributeError: module 'rerun' has no attribute 'scalar'. Did you mean: 'scalars'?のようなバグが見つかった場合は、rerunのバージョンをダウングレードして問題を解決できます。

pip3 install rerun-sdk==0.23
tip

解決できないソフトウェアの問題や環境依存の問題が発生した場合は、このチュートリアルの最後にあるFAQセクションを確認することに加えて、LeRobotプラットフォームまたはLeRobot Discordチャンネルに速やかに問題を報告してください。

引用

中文文档

TheRobotStudio Project: SO-ARM10x

Huggingface Project: Lerobot

Dnsty: Jetson Containers

Jetson AI Lab

Diffusion Policy

ACT or ALOHA

TDMPC

VQ-BeT

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

弊社製品をお選びいただきありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。

Loading Comments...