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つのモーターを指定し、同様にフォロワーアーム用に他のバスサーボアダプターと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回実行します:

python -m 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ケーブルと電源をフォロワーアームのコントローラーボードに接続します。その後、以下のコマンドを実行してください。

python -m 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

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

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

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

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

python -m 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*

次にフォロワーアームをキャリブレーションします

python -m lerobot.calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm

以下の動画はキャリブレーションの実行方法を示しています。まず、すべての関節がその可動範囲の中央にある位置にロボットを移動させる必要があります。その後、Enterキーを押してから、各関節をその全可動範囲で動かす必要があります。

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

リーダーアームをキャリブレーションするために同じ手順を実行し、以下のコマンドまたはAPIの例を実行してください:

python -m lerobot.calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=my_awesome_leader_arm

テレオペレーション

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

ロボットに関連付けられたIDは、キャリブレーションファイルを保存するために使用されることに注意してください。同じセットアップを使用する際は、テレオペレーション、記録、評価時に同じIDを使用することが重要です。

sudo chmod 666 /dev/ttyACM*
python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=my_awesome_follower_arm \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM0 \
--teleop.id=my_awesome_leader_arm

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

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

カメラの追加

tip

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

カメラをインスタンス化するには、カメラ識別子が必要です。この識別子は、コンピュータを再起動したり、カメラを再接続したりすると変更される可能性があり、この動作は主にオペレーティングシステムに依存します。

システムに接続されているカメラのカメラインデックスを見つけるには、以下のスクリプトを実行してください:

python -m 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カメラを使用することは不安定です。

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

python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--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/ttyACM0 \
--teleop.id=my_awesome_leader_arm \
--display_data=true

より多くのカメラがある場合は、--robot.camerasを変更してカメラを追加できます。index_or_pathの形式に注意してください。これはpython -m lerobot.find_cameras opencvで出力されるカメラIDの最後の桁によって決まります。

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

python -m lerobot.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--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/ttyACM0 \
--teleop.id=my_awesome_leader_arm \
--display_data=true
tip

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

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

pip3 install rerun-sdk==0.23

データセットの記録

  • データセットをローカルに保存したい場合は、直接実行できます:
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--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/ttyACM0 \
--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にアップロードします:

python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--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/ttyACM0 \
--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)

パラメータの説明

  • episode-time-s:各回のデータ収集時間を表します。
  • reset-time-s:各データ収集間の準備時間です。
  • num-episodes:収集予定のデータグループ数を示します。
  • push-to-hub:データをHuggingFace Hubにアップロードするかどうかを決定します。
tip
  • データをローカルに保存したい場合(--dataset.push_to_hub=false)、--dataset.repo_id=${HF_USER}/so101_test--dataset.repo_id=seeed_123/so101_testのようなカスタムローカルフォルダ名に置き換えてください。その後、システムのホームディレクトリの~/.cache/huggingface/lerobotに保存されます。

  • --dataset.push_to_hub=trueでデータセットをhubにアップロードした場合、repo idをコピー&ペーストしてデータセットをオンラインで視覚化できます:

  • エピソード記録中はいつでも右矢印→を押すと早期停止してリセットに移行できます。リセット中も同様に、早期停止して次のエピソード記録に移行できます。

  • エピソード記録中またはリセット中はいつでも左矢印←を押すと早期停止し、現在のエピソードをキャンセルして再記録できます。

  • エピソード記録中はいつでもESCキーを押すとセッションを早期終了し、直接ビデオエンコーディングとデータセットアップロードに移行できます。

  • 注意:記録中にチェックポイントが自動的に作成されます。問題が発生した場合は、--resume=trueを付けて同じコマンドを再実行することで再開できます。最初から記録を開始するには、データセットディレクトリを手動で削除してください。

  • データ記録に慣れたら、トレーニング用のより大きなデータセットを作成できます。良い開始タスクは、異なる場所でオブジェクトを掴み、ビンに置くことです。少なくとも50エピソードを記録し、場所ごとに10エピソードを記録することをお勧めします。カメラを固定し、記録全体を通して一貫した掴み動作を維持してください。また、操作しているオブジェクトがカメラに見えることを確認してください。良い経験則として、カメラ画像だけを見てタスクを自分で実行できるようにする必要があります。

  • 以下のセクションでは、ニューラルネットワークをトレーニングします。信頼性の高い掴み性能を達成した後、データ収集中により多くのバリエーションを導入し始めることができます。例えば、追加の掴み場所、異なる掴み技術、カメラ位置の変更などです。

  • 結果に悪影響を与える可能性があるため、あまりにも早く多くのバリエーションを追加することは避けてください。

  • Linuxでは、データ記録中に左右の矢印キーとエスケープキーが効果がない場合、$DISPLAY環境変数を設定していることを確認してください。pynput limitationsを参照してください。

データセットの可視化

tip

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

echo ${HF_USER}/so101_test  

--dataset.push_to_hub=falseでアップロードしなかった場合、以下でローカルで可視化することもできます:

python -m lerobot.scripts.visualize_dataset_html \
--repo-id ${HF_USER}/so101_test \

--dataset.push_to_hub=falseでアップロードした場合、以下でローカルで可視化することもできます:

python -m lerobot.scripts.visualize_dataset_html \
--repo-id seeed_123/so101_test \

ここで、seeed_123はデータ収集時に定義されたカスタムrepo_id名です。

エピソードの再生

tip

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

ロボットで最初のエピソードを再生してみてください:

python -m lerobot.replay \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--robot.id=my_awesome_follower_arm \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.episode=0

ポリシーのトレーニング

tip

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

ロボットを制御するポリシーをトレーニングするには、python -m lerobot.scripts.trainスクリプトを使用します。いくつかの引数が必要です。以下はコマンドの例です:

python -m lerobot.scripts.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を追加してください。

python -m lerobot.scripts.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ポリシーの最後のチェックポイントから再開するコマンドの例です:

python -m lerobot.scripts.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

ポリシーの評価

tip

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

lerobot/record.pyrecord関数を使用できますが、ポリシーチェックポイントを入力として使用します。例えば、10個の評価エピソードを記録するには、このコマンドを実行します:

python -m lerobot.record  \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM1 \
--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

例えば:

python -m lerobot.record  \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM1 \
--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...