🧪 新しいチュートリアルを公開中 — ロボットアームからセンサーまで
コンテンツへスキップ

SO-ARM101 ロボットアーム 7軸 チュートリアル ​

SO-ARM101 7-DOF · 実行前の準備 ​

本説明は、SO-ARM101 を 6 サーボから 7 サーボに改造した後、LeRobot で完全な流れ(キャリブレーション → 録画 → 訓練 → デプロイ)を実行するユーザー向けです。 対応するコード:本リポジトリ(lerobot-7dof)。公式 lerobot の fork であり、SO 関連のモーター設定のみを変更しています。


0. まずお使いのロボットアームを確認する ​

7 サーボ(すべて STS3215)。サーボ ID と関節の対応関係は次のとおりです:

サーボ ID関節名説明
1shoulder_pan肩部の水平回転
2shoulder_lift肩部の持ち上げ
3elbow_flex肘の屈曲
4wrist_flex手首のピッチ(上下の屈曲)
5wrist_yaw手首のヨー(左右回転約 90°)· 今回追加するサーボ(元の 4 番と 5 番の間に挿入)
6wrist_roll手首のロール · 元の 5 番のロールモーター、ID 5→6、3D プリント部品は変更なし、名前も不変
7gripperグリッパー · 元の ID=6、改造後は繰り上がって 7

関節データの順序(録画後の Parquet における action / observation.state の関節次元の順序): shoulder_pan → shoulder_lift → elbow_flex → wrist_flex → wrist_yaw → wrist_roll → gripper。

⚠️ 注意:6 サーボ版のデータ、キャリブレーションファイル、訓練済みモデルは本リポジトリとは互換性がありません。以下に従ってすべてやり直す必要があります。


1. 公式コードリポジトリからクローンした場合、置き換え/変更が必要なファイル ​

方法 A:本リポジトリのコードをそのまま使用(推奨) ​

lerobot-7dof.zip

方法 B:公式 lerobot を git clone して手動で置き換え ​

本リポジトリから公式クローンの3 つのファイルを上書きします:

本リポジトリのファイル(コピー元)上書き先(コピー先)
src/lerobot/robots/so_follower/so_follower.py公式クローンの同名ファイル
src/lerobot/teleoperators/so_leader/so_leader.py公式クローンの同名ファイル
src/lerobot/robots/so_follower/robot_kinematic_processor.py公式クローンの同名ファイル(コメント修正のみで機能に影響なし、置き換え不要)
Bash
cp src/lerobot/robots/so_follower/so_follower.py          <公式クローン>/src/lerobot/robots/so_follower/so_follower.py
cp src/lerobot/teleoperators/so_leader/so_leader.py       <公式クローン>/src/lerobot/teleoperators/so_leader/so_leader.py

前提:お使いの公式クローンが本リポジトリのベースライン(lerobot 2026-08 版)と構造が一致していること。バージョンの差が大きい場合は、ファイル全体を上書きせず、以下の「手動変更」の 2 か所のみ変更してください。

バージョン不一致時の手動変更(2 か所のみ) ​

① モーター辞書(so_follower.py と so_leader.py に各 1 か所、内容は同じ)——元のコード:

Python
"wrist_flex": Motor(4, "sts3215", norm_mode_body),
"wrist_roll": Motor(5, "sts3215", norm_mode_body),
"gripper": Motor(6, "sts3215", MotorNormMode.RANGE_0_100),

を次のように変更します

Python
"wrist_flex": Motor(4, "sts3215", norm_mode_body),
"wrist_yaw": Motor(5, "sts3215", norm_mode_body),   # サーボを追加、左右回転
"wrist_roll": Motor(6, "sts3215", norm_mode_body),  # 元の 5 番のロールモーター、ID 5→6
"gripper": Motor(7, "sts3215", MotorNormMode.RANGE_0_100),

② キャリブレーションロジック(両ファイルそれぞれの calibrate())——「全周回転関節」の特例判定を削除します。元のコード:

Python
full_turn_motor = "wrist_roll"
unknown_range_motors = [motor for motor in self.bus.motors if motor != full_turn_motor]
range_mins, range_maxes = self.bus.record_ranges_of_motion(unknown_range_motors)
range_mins[full_turn_motor] = 0
range_maxes[full_turn_motor] = 4095

これを 1 行に置き換え、すべての関節の実際の可動範囲を記録するようにします:

Python
range_mins, range_maxes = self.bus.record_ranges_of_motion()

理由:オリジナルのコードは wrist_roll(前腕軸まわりのロール)を全周回転(0~4095)できる関節として全範囲をハードコードしていました。7-DOF 改造後は 5/6 番の手首関節(yaw / roll)はいずれも機械的リミットがあり、全周回転はできません。全周回転をハードコードすると、コードが機械的に到達できない角度へ関節指令を送ってしまい、破損のリスクがあります。現在はキャリブレーション時に、各モーターの実際の min/max を手動で記録します。

デュアルフォロワーについて ​

bi_so_follower / bi_so_leader(src/lerobot/robots/bi_so_follower/、src/lerobot/teleoperators/bi_so_leader/)は、シングルアームを left_/right_ プレフィックス付きでラップするだけで、モーター定義は含みません。上記のシングルアームのファイルさえ正しく変更すれば、デュアルアームのコマンド(--robot.type=bi_so_follower)は自動的に 7-DOF になります。

1. LeRobot環境のインストール ​

2. ファイルの置き換え(7DOF 対応) ​

3. シリアルポート番号の確認 ​

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

5. テレオペレーション ​

6. カメラ付きテレオペレーション ​

7. データセット収集(実機) ​

8. モデルの訓練 ​

9. モデルのデプロイ ​