SO-ARM と AmazingHand のための完全トレーニングガイド
このドキュメントでは、SO-ARM101 フォロワーアームと AmazingHand 多指ハンドを組み合わせ、LeRobot を用いてテレオペレーションを行う方法を説明します。

1. ハードウェア接続
- SOARM から AmazingHand へのアダプタ用 STL ファイルは、以下から入手できます:
lerobot/soarm_amazinghand_link_step_stl/step at soarm_amazinghand · xiehuangbao888/lerobot
- 元の SOARM グリッパを取り外します。

- SOARM から AmazingHand へのアダプタをアームに取り付けます。

- AmazingHand 多指ハンドを取り付けます。

- デバイスを次のように配線します:
| デバイス | シリアルポート | 説明 |
|---|---|---|
| SO-101 フォロワーアーム(グリッパサーボ #6 を取り外し) | /dev/ttyACM0 | 関節サーボ 1~5 のみを使用 |
| SO-101 リーダーアーム(グリッパサーボ #6 を使用) | /dev/ttyACM1 | グリッパの開閉を入力信号として使用 |
| AmazingHand 多指ハンド | /dev/ttyACM2 | ID 1~8 の 8 個のサーボ |
シリアルポート名が異なる場合は、以下のコマンド中のポート名を実際のものに置き換えてください。
ロボットは次のように動作します:
/dev/ttyACM0を介してフォロワーアームの 5 つの関節(サーボ 1~5)を制御します。/dev/ttyACM2を介して AmazingHand 多指ハンドを制御します。- リーダーアームの
gripper.posを、多指ハンドの開閉角度に 比例的に マッピングします(0 = 全開、100 = 全閉)。
キャリブレーションファイルは自動的に次の場所に保存されます:
~/.cache/huggingface/lerobot/calibration/robots/so101_amazing_hand/<robot.id>.json
~/.cache/huggingface/lerobot/calibration/teleoperators/so101_leader/<teleop.id>.json
2. 環境と接続
git clone https://github.com/xiehuangbao888/lerobot.git
既存の lerobot 仮想環境に切り替えます。
まず、デバイスの権限を付与します:
sudo chmod 666 /dev/ttyACM*
ステップ 1: リーダーアームのキャリブレーション
cd ~/lerobot
conda activate lerobot
python -m lerobot.scripts.lerobot_calibrate \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader
プロンプトに従って操作します:
- リーダーアームのすべての関節を中間位置に置き、Enter キーを押します。
- 各関節を順番に最大および最小範囲まで動かし、最後に Enter キーを押して終了します。
ステップ 2: フォロワーアームのキャリブレーション
python -m lerobot.scripts.lerobot_calibrate \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2
プロンプトに従って操作します:
- フォロワーアームの 5 つの関節を中間位置に置き、Enter キーを押します。
- 5 つの関節を順番に最大および最小範囲まで動かし、最後に Enter キーを押して終了します。
注: フォロワーアームには 5 つの関節しかなく、グリッパサーボ #6 は取り外されています。
ステップ 3: テレオペレーションの実行
python -m lerobot.scripts.lerobot_teleoperate \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader \
--display_data=true
把持動作はカスタマイズ可能です。関連するファイルは次の場所にあります:
src/lerobot/robots/so_amazing_hand/config_so_amazing_hand.py
3. 多指ハンドでデータセットを収集する
python -m lerobot.scripts.lerobot_record \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--robot.cameras='{
wrist: {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}
}' \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=amazing_hand_leader \
--display_data=true \
--dataset.repo_id=seeed/amazing_soarm \
--dataset.num_episodes=20 \
--dataset.single_task="Pick up the cube with the dexterous hand"
パラメータの説明:
| パラメータ | 説明 |
|---|---|
--robot.cameras | カメラ設定。opencv、realsense などをサポートします。index_or_path はカメラのインデックスまたはビデオストリームのパスです。 |
--dataset.repo_id | Hugging Face 上のデータセット ID。形式は {username}/{dataset_name} です。 |
--dataset.num_episodes | 記録するエピソード数。 |
--dataset.single_task | データセットのメタデータに書き込まれるタスクの説明。 |
--robot.hand_use_proportional_control | 既定値は true で、明示的に設定する必要はありません。false にすると開閉の 2 値動作になります。 |
4. ポリシーの学習
lerobot-train \
--dataset.repo_id=seeed/amazing_soarm \
--policy.type=act \
--output_dir=outputs/train/amazing_soarm \
--job_name=amazing_soarm \
--policy.device=cuda \
--wandb.enable=false \
--policy.push_to_hub=false \
--steps=60000 \
5. 評価とデプロイ
学習済みポリシーを実機ロボットで評価する
python -m lerobot.scripts.lerobot_record \
--robot.type=so101_amazing_hand \
--robot.port=/dev/ttyACM0 \
--robot.id=amazing_hand_follower \
--robot.hand_port=/dev/ttyACM2 \
--robot.cameras='{
wrist: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30},
top: {type: opencv, index_or_path: 4, width: 640, height: 480, fps: 30}
}' \
--policy.path=outputs/train/amazing_soarm/checkpoints/last/pretrained_model \
--dataset.repo_id=seeed_val/amazinghand_pick_cube_eval \
--dataset.num_episodes=10 \
--dataset.single_task="Pick up the cube with the dexterous hand" \
--display_data=true