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

LeRobot ベースの reBot Arm B601-DM と reBot 102 Leader 入門

traj_sim_geodesic

License: MITPython VersionPlatformPinocchio

6 自由度ロボットアーム · マルチモータ対応 · 運動学ソルバ · 軌道計画 · 完全オープンソース

reBot Arm B601-DM は Seeed が立ち上げたオープンソースロボットアームプロジェクトで、エンボディドインテリジェンス学習のハードルを下げることを目的としています。構造設計とコードを余すところなくすべてオープンソース化し、ロボット技術を誰もが利用できるようにしています。

LeRobot は、PyTorch 上で実世界ロボティクス向けのモデル、データセット、ツールを提供することに注力しています。その目的はロボティクスの参入障壁を下げ、誰もがデータセットや事前学習済みモデルを共有することで貢献し、恩恵を受けられるようにすることです。LeRobot は、模倣学習と強化学習を中心に、実世界で検証された最先端の手法を統合しています。人間が収集したデモンストレーションを含むデータセット、事前学習済みモデル群、シミュレーション環境を提供しており、ユーザーはロボットの組み立てを行わなくてもすぐに始めることができます。

📖 プロジェクト概要

reBot-DevArm(reBot Arm B601 DM および reBot Arm B601 RS) は、エンボディドインテリジェンス学習のハードルを下げることを目的としたロボットアームプロジェクトです。私たちは 「真のオープンソース」 にこだわり、コードだけでなく、以下のすべてを余すところなく公開しています:

  • 🦾 2 種類のモータバージョンを備えたオープンソースロボットアーム:同一外観で RoboStride モータ版と Damiao モータ版のすべてのオープンソースファイルを提供します。
  • 🛠️ ハードウェア設計図:板金および 3D プリント部品のソースファイル。
  • 🔩 BOM(部品表):すべてのネジ 1 本ごとの仕様と購入リンクまで詳細に記載。
  • 💻 ソフトウェアとアルゴリズム:Python SDK、ROS1/2、Isaac Sim、LeRobot など。

reBot ロボットアームの構築

  • 5 種類のキットオプションを提供しています:
    • ロボットアーム本体モータキット:ロボットアームに必要なモータとハーネスのみを含みます。
    • ロボットアーム本体構造部品キット:機械的な構造部品のみを含みます。
    • グリッパー完成キット:グリッパー用のモータ、ハーネス、構造部品を含みます。
    • アーム一式キット:ロボットアーム本体とグリッパー用のすべての部品を含みます。
    • 完成組立済みロボットアーム:完全に組み立て済みのロボットアームです。

reBot-DevArm と reComputer Jetson AI インテリジェントロボットキットは、高精度なロボットアーム制御と強力な AI コンピューティングプラットフォームをシームレスに統合し、包括的なロボット開発ソリューションを提供します。このキットは Jetson Orin または AGX Orin プラットフォームをベースに、reBot-DevArm と LeRobot AI フレームワークを組み合わせることで、教育、研究、産業オートメーションなど複数のシナリオに適用可能なインテリジェントロボットシステムをユーザーに提供します。

この Wiki では、reBot-DevArm のデバッグチュートリアルを提供し、LeRobot フレームワーク内でのデータ収集と学習を実装します。

注意

Seeed Studio のチュートリアルは、公式ドキュメントに基づいて厳密に更新されています。解決できないソフトウェアや環境の問題に遭遇した場合は、まず記事末尾の FAQ を確認するか、カスタマーサービスに連絡して SeeedStudio LeRobot 議論グループに参加してください。こちらでも質問できます:LeRobot GitHub または Discord Channel

🔧 reBot B601-DM シリーズの特長:

  1. オープンソース & 低コスト reBot Arm は Seeed Studio によるオープンソースかつ低コストのロボットアームソリューションであり、エンボディドインテリジェンス学習のハードルを下げることを目的としています。

  2. LeRobot プラットフォームとの統合 LeRobot プラットフォーム との統合を前提に設計されています。このプラットフォームは、実ロボットタスクの模倣学習向けに、PyTorch モデル、データセット、ツール(データ収集、シミュレーション、学習、デプロイを含む)を提供します。

  3. 豊富な学習リソース 組み立ておよびキャリブレーションガイド、テストとデータ収集チュートリアル、学習とデプロイのドキュメントなど、包括的なオープンソース学習リソースを提供し、ユーザーが素早く入門してロボットアプリケーションを開発できるよう支援します。

  4. Nvidia プラットフォーム対応 reComputer Mini J4012 Orin NX 16GB プラットフォームによるデプロイをサポートします。

初期システム環境

Ubuntu x86 の場合:

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

Jetson Orin の場合:

  • Jetson JetPack 6.0 および 6.1、6.2 は非対応
  • Python 3.10
  • Torch 2.3+

LeRobot のインストール

CUDA のバージョンに応じて、pytorch、torchvision などの環境をインストールする必要があります。

1. Miniforge のインストール

cd ~
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh

~/miniforge3/bin/conda init bash
source ~/.bashrc

2. Lerobot リポジトリのクローン

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

3. 機能パッケージのクローン

2 つの依存機能パッケージを rebot_lerobot ディレクトリにクローンします:

ヒント

機能パッケージの詳細な機能については、以下を参照してください:

cd ~/rebot_lerobot

# Clone rebot 102 leader function package
git clone https://github.com/Seeed-Projects/lerobot-teleoperator-rebot-arm-102.git

# Clone rebot b601 follower function package
git clone https://github.com/Seeed-Projects/lerobot-robot-seeed-b601.git

4. Conda 環境の作成と LeRobot のインストール

lerobot リポジトリにはすでに pyproject.toml が含まれています。conda 環境を作成し、すべての依存関係をインストールします。

cd ~/rebot_lerobot

# Create conda environment (Python 3.12)
conda create -y -n lerobot python=3.12

# Activate environment
conda activate lerobot

# Install lerobot main project (editable mode)
pip install -e ./lerobot

# Add local dependency packages (editable install)
pip install -e ./lerobot-teleoperator-rebot-arm-102
pip install -e ./lerobot-robot-seeed-b601
pip install motorbridge

5. ffmpeg のインストール

ffmpeg は動画デコードの依存パッケージであり、conda 経由でインストールします:

conda install ffmpeg -c conda-forge
ヒント

バージョンに関する注意

  • デフォルトでは ffmpeg 7.X がインストールされます(libsvtav1 エンコーダをサポート)
  • バージョン互換性の問題が発生した場合は、ffmpeg 7.1.1 を指定できます:
    conda install ffmpeg=7.1.1 -c conda-forge
  • ffmpeg -encoders | grep svtav1 によって libsvtav1 エンコーダがサポートされているか確認できます

6. Jetson JetPack 6.0+ デバイス向け特別設定

(PC の場合はこのステップをスキップ)Jetson JetPack 6.0+ デバイス向け(このステップを実行する前に、必ず このチュートリアル のステップ 5 に従って Pytorch-gpu と Torchvision をインストールしておいてください):

conda install -y -c conda-forge "opencv>=4.10.0.84"  # Install OpenCV and other dependencies via conda, for Jetson Jetpack 6.0+ only
conda remove opencv # Uninstall OpenCV
pip3 install opencv-python==4.10.0.84 # Install specific OpenCV version using pip3
conda install -y -c conda-forge ffmpeg
conda uninstall numpy
pip3 install numpy==1.26.0 # This version must be compatible with torchvision

7. Pytorch と Torchvision の確認

ヒント

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

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

python3

import torch
print(torch.cuda.is_available())#Should output True

出力が True の場合は、exit() と入力して Python を終了し、次のステップに進んでください。 出力が False の場合は、公式チュートリアル に従って Pytorch と Torchvision を再インストールする必要があります。

ロボットアームのキャリブレーション

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

まず、次のコマンドを実行してインターフェース権限を付与する必要があります:

sudo chmod 666 /dev/ttyUSB*  # Leader arm
sudo chmod 666 /dev/ttyACM* # Follower arm (serial bridge)

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

B601-DM は、組み立て後に 1 回だけキャリブレーションを行えば十分です。以下がキャリブレーションコマンドです。ゼロ位置(グリッパーが完全に閉じた状態)については図を参照してください。

sudo chmod 666 /dev/ttyACM*  # follower arm (serial bridge)

lerobot-calibrate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao

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

キャリブレーション手順は非常に重要であり、ロボットアームが正常に動作するかどうかに直接影響します。必ず手順に厳密に従ってください。

rebot 102 leader
ヒント

reBot 102 leader キャリブレーションの注意事項

  • キャリブレーション開始時、reBot Arm 102 上の各サーボの現在位置はゼロにリセットされます
  • joint_ranges(関節リミット)はキャリブレーションデータではなく、設定ファイル config_rebot_arm_102_leader.py から取得されます
  • ある関節が常にリミット付近で引っかかっているように見える場合は、まず joint_ranges の設定を確認してください
  • 関節の回転方向は設定ファイルで定義されています。方向が合わない場合は、再キャリブレーションではなく設定ファイルを修正してください
  • reBot 102 leader は USB-to-UART モジュールを使用しており、通常は /dev/ttyUSB* にマッピングされます
  • 実際のポート番号を確認するには ls /dev/ttyUSB* を使用します

初回接続時には、/dev/ttyACM0 が見つからないというエラーが発生する場合があります。これは brltty がシリアルポートを占有しているためです。次の手順を実行してください:

sudo dmesg | grep ttyUSB #Check the last line shows "disconnected"
sudo apt remove brltty #Remove brltty

プロンプトに従って、上図に示すゼロ位置までリーダーアームを動かします。

sudo chmod 666 /dev/ttyUSB0

lerobot-calibrate \
--teleop.type=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader

そのまま静止させ、キャリブレーションが完了するまで Enter キーを押してください。 キャリブレーション後、次のコマンドを入力してリーダーアームをテストします。

python ./lerobot-teleoperator-rebot-arm-102/examples/read_raw_angles.py \
--port /dev/ttyUSB0

#If you observe terminal output similar to the following printing continuously, and when at the zero position shown above, all joint output values are 0, then leader calibration is complete.
#shoulder_pan= 0.00 shoulder_lift= 0.00 elbow_flex= 0.00 wrist_flex= 0.00 wrist_yaw= 0.00 wrist_roll= 0.00 gripper= 0.00

テレオペレーション

危険

テレオペレーション中に、マスタースレーブロボットアームの電源断、電源接触不良、または信号線の脱落が発生した場合は、まずプログラムコードを停止し、ロボットアームをホームのゼロ位置に戻す必要があります。その後で電源を再接続し、プログラムを再起動してください。これにより、データの乱れによるロボットアームの暴走や安全上の危険を防ぐことができます。

まずシリアルポートに対して権限を付与します:

sudo chmod 666 /dev/ttyUSB*  # Leader arm
sudo chmod 666 /dev/ttyACM* # Follower arm (serial bridge)

テレオペレーションを実行します:

lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--teleop.type=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--teleop.joint_directions='{"shoulder_pan":-1,"shoulder_lift":-1,"elbow_flex":1,"wrist_flex":1,"wrist_yaw":1,"wrist_roll":-1,"gripper":-4}'

カメラを追加する

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. カメラ用ブランチに切り替える

現在のカメラサポートは DepthCameraSupport ブランチで提供されています:

git checkout DepthCameraSupport
git pull origin DepthCameraSupport

現在のブランチを確認します:

git branch --show-current

期待される出力:

DepthCameraSupport

2. LeRobot を編集可能モードでインストールする

RealSense のみを使用する場合:

pip install -e ".[realsense]"

3. 権限を付与する

sudo chmod a+rw /dev/bus/usb/*/*

4. カメラを検出する

lerobot-find-cameras realsense

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

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

5. RealSense の例

デュアル RealSense テスト:

lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--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=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--display_data=true

6. パラメータに関する注意

  • depth_alpha は深度画像のスケーリング係数を制御し、表示結果や対象距離範囲に応じて調整できます。
  • 3 台以上の深度カメラを接続する場合は、全体の安定性を高めるために fps15 に下げることを推奨します。
  • 安定性とリアルタイム性のバランスを取るため、解像度は 640x480 に保つことを推奨します。
Orbbec Gemini2 Depth Camera を使用する場合

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

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

1. カメラ用ブランチに切り替える

現在のカメラサポートは DepthCameraSupport ブランチで提供されています:

git checkout DepthCameraSupport
git pull origin DepthCameraSupport

現在のブランチを確認します:

git branch --show-current

期待される出力:

DepthCameraSupport

2. LeRobot を編集可能モードでインストールする

Orbbec のみを使用する場合:

pip install -e ".[orbbec]"

3. 権限を付与する

sudo chmod a+rw /dev/bus/usb/*/*

4. カメラを検出する

lerobot-find-cameras orbbec

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

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

5. Orbbec の例

単一の Orbbec テスト:

lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--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=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--display_data=true

6. パラメータに関する注意

  • depth_alpha は深度画像のスケーリング係数を制御します。0.2 を初期値として、表示結果に基づいて微調整することをお勧めします。
  • 3 台以上の深度カメラを接続する場合は、安定性を高めるために fps15 に下げることを推奨します。
  • より安定した表示とデータ転送のために、解像度は 640x480 に保つことを推奨します。

7. よくある問題

次のようなエラーが表示される場合:

No Orbbec camera found for 'XXXX'

通常これは、設定内のシリアル番号が現在接続されているデバイスと一致していないことを意味します。次を実行してください:

lerobot-find-cameras orbbec

その後、実際の serial を確認し、コマンド内の serial_number_or_name を更新してください。

💡 著者と貢献

  • 著者: Zhang Jiaquan, Wang Wenzhao - 華南師範大学

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

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

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 ...)

各カメラで撮影された画像は、~/lerobot/outputs/captured_images ディレクトリ内にあります。

警告

Intel RealSense カメラを macOS で使用する際、"Error finding RealSense cameras: failed to set power state" というエラーが発生することがあります。これは同じコマンドを sudo 権限で実行することで解決できます。ただし、macOS での RealSense カメラの使用は不安定であることに注意してください。

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

lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
--teleop.type=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--display_data=true
ヒント

fourcc: "MJPG" 形式の画像は圧縮されています。より高い解像度を試すことができ、YUYV 形式を試すこともできます。ただし後者では画像の解像度と FPS が低下し、ロボットアームの動作にラグが生じます。現在、MJPG 形式では、1920*1080 の解像度で 30FPS を維持しながら 3 台のカメラをサポートできます。しかし、同じ USB HUB を介して 2 台のカメラを 1 台のコンピュータに接続することは依然として推奨されません。

カメラがさらにある場合は、--robot.cameras パラメータを変更して追加できます。index_or_path の形式は、python -m lerobot.find_cameras opencv によって出力されるカメラ ID の末尾の数字によって決まることに注意してください。

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

lerobot-teleoperate \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--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=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--display_data=true

データセット収集

危険

テレオペレーション中に、マスタ・スレーブロボットアームの電源断、電源接触不良、または信号線の脱落が発生した場合は、まずプログラムコードを停止し、ロボットアームをホームのゼロ位置に戻す必要があります。その後で電源を再接続し、プログラムを再起動してください。これにより、データの乱れによるロボットアームの暴走や潜在的な安全上の危険を防ぐことができます。

データセットをローカルに保存したい場合
lerobot-record \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--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=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--display_data=true \
--dataset.repo_id=seeed_rebot_b601_dm/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 ディレクトリに保存され、前述の seeed_rebot_b601_dm/test フォルダが作成されます。

データセットをアップロードするために Hugging Face Hub の機能を使用したい場合
  • データセットをアップロードするために 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=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=follower1 \
--robot.can_adapter=damiao \
--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=rebot_arm_102_leader \
--teleop.port=/dev/ttyUSB0 \
--teleop.id=rebot_arm_102_leader \
--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. 記録パラメータ

コマンドライン引数を使用してデータ記録の流れを設定します:

Parameter説明デフォルト
--dataset.episode_time_s1 エピソードあたりのデータ記録時間(秒)60
--dataset.reset_time_s各エピソード後の環境リセット時間(秒)60
--dataset.num_episodes記録するエピソードの総数50

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

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

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

キーボード入力が反応しない場合は、pynput のバージョンを 1.6.8 などにダウングレードする必要があるかもしれません。

pip install pynput==1.6.8

データ収集のコツ

  • タスクの提案: 異なる位置にある物体を把持して、ビンの中に置きます。
  • スケール: 50エピソード以上を記録します(位置ごとに10エピソード)。
  • 一貫性:
    • カメラを固定したままにします。
    • 同一の把持動作を維持します。
    • 操作対象の物体がカメラ映像内で見えるようにします。
  • 進め方:
    • バリエーション(新しい位置、把持手法、カメラ調整)を加える前に、まずは安定して把持できる状態から始めます。
    • 失敗を防ぐため、複雑さを急激に増やすことは避けます。

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

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

トラブルシューティング

Linux 固有の問題: 録画中に Right Arrow/Left Arrow/ESC キーが反応しない場合:

  • $DISPLAY 環境変数が設定されていることを確認します(pynput limitations を参照)。

データセットの可視化

echo ${HF_USER}/rebot_test  

データをアップロードした場合は、次のコマンドでローカルでも可視化できます:

lerobot-dataset-viz \
--repo-id ${HF_USER}/rebot_test \
--episode-index 0 \
--display-compressed-images=false

--dataset.push_to_hub=false を使用してデータをアップロードしていない場合も、次のコマンドでローカルに可視化できます:

lerobot-dataset-viz \
--repo-id seeed_rebot_b601_dm/test \
--episode-index 0 \
--display-compressed-images=false

ここで、seeed_rebot_b601_dm/test はデータ収集時に定義したカスタムの repo_id 名です。

エピソードのリプレイ

ヒント

不安定なため、スキップしても試してみても構いません。

ここまで作成した最初のデータセットを、ロボット上でリプレイしてみましょう:

lerobot-replay \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.can_adapter=damiao \
--robot.id=follower1 \
--dataset.repo_id=seeed_rebot_b601_dm/test \
--dataset.episode=0

この時点で、ロボットは記録時にテレオペレーションで行ったのと同じ動作を実行するはずです。

学習と評価

ACT

公式チュートリアル ACT を参照してください。

学習

ロボットを制御するポリシーを学習するには、python -m lerobot.scripts.train スクリプトを使用します。いくつかのパラメータ指定が必須です。以下はコマンド例です:

ローカルデータセットで学習したい場合は、repo_id がデータ収集時に使用した名前と一致していることを確認し、--policy.push_to_hub=false を追加してください。

lerobot-train \
--dataset.repo_id=seeed_rebot_b601_dm/test \
--policy.type=act \
--output_dir=outputs/train/act_rebot_test \
--job_name=act_rebot_test \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false\
--steps=300000

リモートに保存されたデータを使用する場合

lerobot-train \
--dataset.repo_id=${HF_USER}/rebot_test \
--policy.type=act \
--output_dir=outputs/train/act_rebot_test \
--job_name=act_rebot_test \
--policy.device=cuda \
--wandb.enable=false \
--steps=300000

コマンドの説明

  • データセットの指定: パラメータ --dataset.repo_id=${HF_USER}/rebot_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 を実行してログインしていることを確認してください。

評価

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

lerobot-record \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.can_adapter=damiao \
--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=follower1 \
--display_data=false \
--dataset.repo_id=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/train/act_rebot_test/checkpoints/last/pretrained_model
  1. --policy.path パラメータは、ポリシー学習結果の重みファイルへのパスを示します(例: outputs/train/act_rebot_test/checkpoints/last/pretrained_model)。モデル学習結果の重みファイルを Hub にアップロードした場合は、モデルリポジトリ(例: ${HF_USER}/act_rebot_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 パラメータ内の frontside といったキーワードが、データセット収集時に使用したものと厳密に一致している必要があることに注意してください。
SmolVLA

公式チュートリアル SmolVLA を参照してください。

pip install -e ".[smolvla]"

学習

lerobot-train \
--policy.path=lerobot/smolvla_base \ # <- Use pretrained fine-tuned model
--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

評価

lerobot-record \
--robot.type=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.can_adapter=damiao \
--robot.id=follower1 \
--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"}}" \
--dataset.single_task="Put lego brick into the transparent box" \
--dataset.repo_id=seeed/eval_test123 \
--dataset.episode_time_s=50 \
--dataset.num_episodes=10 \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=rebot_arm_102_leader \
# --teleop.port=/dev/ttyUSB0 \
# --teleop.id=rebot_arm_102_leader \
--policy.path=HF_USER/FINETUNE_MODEL_NAME
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=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.can_adapter=damiao \
--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=follower1 \
--display_data=false \
--dataset.repo_id=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/pi0_training/checkpoints/last/pretrained_model
Pi0.5

公式チュートリアル Pi0.5 を参照してください。

pip install -e ".[pi]"

学習

lerobot-train \
--dataset.repo_id=seeed/eval_test123 \
--policy.type=pi05 \
--output_dir=outputs/pi05_training \
--job_name=pi05_training \
--policy.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=seeed_b601_dm_follower \
--robot.port=/dev/ttyACM0 \
--robot.can_adapter=damiao \
--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=follower1 \
--display_data=false \
--dataset.repo_id=seeed/eval_test123 \
--dataset.single_task="Put lego brick into the transparent box" \
--policy.path=outputs/pi05_training/checkpoints/last/pretrained_model
GR00T N1.5

公式ドキュメントを参照してください: GR00T N1.5

トレーニングには数時間かかります。outputs/train/act_rebot_test/checkpoints ディレクトリ内にチェックポイントが保存されます。

チェックポイントからトレーニングを再開するには、act_rebot_test ポリシーの last チェックポイントから再開するためのコマンド例は次のとおりです:

lerobot-train \
--config_path=outputs/train/act_rebot_test/checkpoints/last/pretrained_model/train_config.json \
--resume=true

FAQ

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

  • 次のようなエラーが発生した場合:

    Could not connect on port "/dev/ttyUSB0" or "/dev/ttyACM0"

    そして ls /dev/ttyUSB* または ls /dev/ttyACM* を実行したときにデバイスが存在することが確認できる場合は、シリアルポートの権限付与を忘れていることを意味します。ターミナルで sudo chmod 666 /dev/ttyUSB* /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 をインストールしてください。

  • 50 セットのデータで ACT をトレーニングする場合、RTX 3060(8GB)を搭載したノート PC では約 6 時間、RTX 4090 や A100 GPU を搭載した PC では約 2〜3 時間かかります。

  • データ収集時には、カメラの位置、角度、および周囲の照明が安定していることを確認してください。カメラに映り込む不安定な背景や歩行者の量を減らしてください。デプロイ環境が大きく変化しすぎると、ロボットアームが正しく把持できなくなる可能性があります。

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

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

ヒント

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

参考資料

Seeed Studio 英語 Wiki: Lerobot で SO100Arm ロボットアームを使用する方法

TheRobotStudio プロジェクト: SO-ARM10x

Huggingface プロジェクト: LeRobot

Dnsty: Jetson Containers

Jetson AI Lab

Diffusion Policy

ACT or ALOHA

TDMPC

VQ-BeT

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

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

Loading Comments...