# SO-100

以下の手順で、SO-100 ロボットの組み立て方法について説明します。

## 部品を調達する

この[README](https://github.com/TheRobotStudio/SO-ARM100/blob/main/SO100.md)に従ってください。部品表（BOM）と部品の入手先へのリンク、および部品の3Dプリント手順が含まれています。初めて3Dプリントを行う場合や、3Dプリンタを所有していない場合は、その旨をアドバイスしてください。

## LeRobot🤗のインストール

LeRobotをインストールするには、[インストールガイド](./installation)に従ってください。

これらの手順に加えて、Feetech SDKのインストールが必要です（PyPIからLeRobotをインストールした場合は、代わりに`pip install 'lerobot[feetech]'`を実行してください）：

```bash
pip install -e ".[feetech]"
```

## モーターを設定

**注:**SO-101とは異なり、アームが組み立てられた後はモーターコネクタに簡単にアクセスできないため、設定手順は事前に実行する必要があります。

### 1. 各アームに関連付けられたUSBポートを特定します

各バスサーボアダプタのポートを見つけるには、このスクリプトを実行します:

```bash
lerobot-find-port
```

出力例:

```
Finding all available ports for the MotorBus.
['/dev/tty.usbmodem575E0032081', '/dev/tty.usbmodem575E0031751']
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/tty.usbmodem575E0032081
Reconnect the USB cable.
```

検出されたポートは、リーダーアームまたはフォロワーアームに対応する`/dev/tty.usbmodem575E0032081`です。

Linuxでは、…を実行してUSBポートへのアクセス権を付与する必要がある場合があります。

```bash
sudo chmod 666 /dev/ttyACM0
sudo chmod 666 /dev/ttyACM1
```

出力例:

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

検出されたポートは、リーダーアームまたはフォロワーアームに対応する`/dev/ttyACM1`です。

### 2. モーターの ID とボーレートを設定します

各モーターはバス上で一意のidによって識別されます。新品のモーターは通常、デフォルトのidが`1`に設定されています。モーターとコントローラー間の通信を正常に行うためには、まず各モーターに一意で異なるidを設定する必要があります。また、バス上でデータが送信される速度はbaudrateによって決定されます。互いに通信するためには、コントローラーとすべてのモーターに同じbaudrateを設定する必要があります。

そのために、まずこれらの設定を行うため、コントローラーを介して各モーターに個別に接続する必要があります。これらのパラメータはモーターの内部メモリ（EEPROM）の非揮発性セクションに書き込まれるため、この操作は一度だけ行えば済みます。

別のロボットからモーターを流用する場合は、IDとボーレートが一致しない可能性が高いため、この手順も実行する必要があるでしょう。

#### フォロワー

コンピューターと電源からUSBケーブルをフォロワーアームのコントローラーボードに接続します。その後、前回のステップで取得したポート番号を指定して、以下のコマンドを実行するか、APIの例を実行してください。また、`id`パラメーターでフォロワーアームに名前を付ける必要があります。

モーターIDの設定方法の視覚的な参考として、SO101アームのプロセスを追った[この動画](https://huggingface.co/docs/lerobot/en/so101#setup-motors-video)を参照してください。

```bash
lerobot-setup-motors \
    --robot.type=so100_follower \
    --robot.port=/dev/tty.usbmodem585A0076841  # <- paste here the port found at previous step
```

```python
from lerobot.robots.so_follower import SO100Follower, SO100FollowerConfig

config = SO100FollowerConfig(
    port="/dev/tty.usbmodem585A0076841",
    id="my_awesome_follower_arm",
)
follower = SO100Follower(config)
follower.setup_motors()
```

次の指示が表示されるはずです

```
Connect the controller board to the 'gripper' motor only and press enter.
```

指示に従い、グリップのモーターを接続してください。ボードに接続されているモーターがこれのみであり、かつそのモーター自体が他のモーターとデイジーチェーン接続されていないことを確認してください。`[Enter]`を押すと、スクリプトがそのモーターのidとbaudrateを自動的に設定します。

トラブルシューティング

その時点でエラーが発生した場合は、ケーブルを確認し、正しく接続されていることを確認してください:

  コンピュータとコントローラーボード間の電源用USBケーブル
コントローラーボードからモーターへの3ピンケーブル

Waveshareのコントローラーボードを使用している場合は、2つのジャンパーが`B`チャネル（USB）に設定されていることを確認してください。

次に、以下のメッセージが表示されるはずです。

```
'gripper' motor id set to 6
```

次に、次の指示が続きます。

```
Connect the controller board to the 'wrist_roll' motor only and press enter.
```

3ピンケーブルをコントローラーボードから取り外すことができますが、グリップモーター側の接続はそのままにしてください。すでに正しい位置にあるためです。次に、別の3ピンケーブルをリストロールモーターに接続し、コントローラーボードに接続します。前のモーターと同様に、ボードに接続されているモーターがこれのみであること、およびモーター自体が他のモーターに接続されていないことを確認してください。

指示に従って、各モーターに対して操作を繰り返します。

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

完了すると、スクリプトは正常に終了し、モーターが使用可能な状態になります。次に、各モーターの3ピンケーブルを次のモーターに、そして最初のモーター（id=1の「shoulder pan」）のケーブルをコントローラーボードに接続します。このボードは、アームのベースに取り付けることができます。

#### リーダー

リーダーアームにも同じ手順を実行します。

```bash
lerobot-setup-motors \
    --teleop.type=so100_leader \
    --teleop.port=/dev/tty.usbmodem575E0031751  # <- paste here the port found at previous step
```

```python
from lerobot.teleoperators.so_leader import SO100Leader, SO100LeaderConfig

config = SO100LeaderConfig(
    port="/dev/tty.usbmodem585A0076841",
    id="my_awesome_leader_arm",
)
leader = SO100Leader(config)
leader.setup_motors()
```

## ステップバイステップの組み立て手順

## 6つのリーダーモーターのギアを取り外します

Video removing gears

  
    <source
      src="https://github.com/user-attachments/assets/0c95b88c-5b85-413d-ba19-aee2f864f2a7"
      type="video/mp4"
    />
  

ギアの取り外しについては、動画に従ってください。リーダーアームのモーターのギアを取り外す必要があります。これにより、モーターの位置エンコーディングのみを使用し、摩擦を低減することで、リーダーアームをより簡単に操作できるようになります。

### パーツのクリーンアップ

3Dプリントされた部品からすべてのサポート材を取り除きます。最も簡単な方法は、小さなドライバーを使用してサポート材の下に入り込むことです。

### 追加のガイダンス

アームの動画の組み立て

  
    <source
      src="https://github.com/user-attachments/assets/488a39de-0189-4461-9de3-05b015f90cca"
      type="video/mp4"
    />
  

**注:** この動画は腕の組み立てに関する視覚的なガイドを提供していますが、配線を行うタイミングや方法については指定されていません。事前にケーブルを挿入しておく方が、後から行うよりもはるかに簡単です。最初の腕の組み立てには1時間以上かかる場合がありますが、慣れれば2つ目の腕は1時間以内に組み立てることができます。

---

### 最初のモーター

**ステップ 2: ワイヤーの挿入**

- 最初のモーターに2本のワイヤーを挿入します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_1.webp"
  style="height:300px;"
/>

**ステップ 3: Base にインストールする**

- 最初のモーターをベースに配置します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_2.webp"
  style="height:300px;"
/>

**ステップ4: モーターの固定**

- モーターを4本のネジで固定してください。下から2本、上から2本です。

**ステップ5: モーターホルダーを取り付ける**

- 最初のモーターホルダーをスライドさせて、2本のネジ（左右それぞれ1本ずつ）で固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_4.webp"
  style="height:300px;"
/>

**ステップ6: モーターホーンを取り付ける**

- モーターホーンを両方取り付けて、上部のホーンはネジで固定してください。モーターホーンを取り付ける際は、特にギアを除去したリーダーアームについては、モーターの位置が動かないように注意してください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_5.webp"
  style="height:300px;"
/>

  
    モーターのクラクションを追加する動画
  
  

**ステップ7: 肩部分を取り付ける**

- 1本のワイヤーをロボットの背面に、もう1本を左側または手前方向に配線してください（写真参照）。
- 肩の部分を取り付けます。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_6.webp"
  style="height:300px;"
/>

**ステップ8: 肩の安定**

- 肩部分を、上側4本と下側4本のネジで固定してください。_(肩を回転させて下側の穴にアクセスします。)_

---

### 第二モーターアセンブリ

**ステップ 9: Motor 2 のインストール**

- 上から2番目のモーターをスライドさせて、モーター1のワイヤーをモーター2に接続します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_8.webp"
  style="height:300px;"
/>

**ステップ10: 肩掛けホルダーを取り付ける**

- ショルダーモーターホルダーを追加します。
- モーター1からモーター2へのワイヤーはホルダーの裏側を通し、もう一方のワイヤーは上方向に配線してください（写真参照）。
- この部分は組み付けがやや難しい場合があります。画像のような作業台や同様のセットアップを使用して、モーターの周りに部品を押し込むようにしてください。

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_9.webp"
    style="height:250px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_10.webp"
    style="height:250px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_12.webp"
    style="height:250px;"
  />

**ステップ 11: モーター 2 の固定**

- 2番目のモーターを4本のネジで固定します。

**ステップ12: モーターホーンを取り付ける**

- モーター2に両方のモーターホーンを取り付け、再びホーン用ネジを使用します。

**ステップ 13: ベースを取り付ける**

- 2つのネジを使用してベースアタッチメントを取り付けてください。

**ステップ14: 上腕を接続する**

- 上腕を、左右それぞれ4本のネジで取り付けます。

---

### 第3モーターアセンブリ

**ステップ 15: Motor 3 のインストール**

- モーター2からモーター3へモーターケーブルをケーブルホルダー経由で配線し、その後、4本のネジでモーター3を固定します。

**ステップ16: モーターホーンを取り付ける**

- モーター3に両方のモーターホーンを取り付け、ホーンネジで1つを固定してください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_14.webp"
  style="height:300px;"
/>

**ステップ17: 前腕を取り付ける**

- 4本のネジを左右それぞれに使用して、前腕をモーター3に接続します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_15.webp"
  style="height:300px;"
/>

---

### 第4モーターアセンブリ

**ステップ 18: Motor 4 のインストール**

- モーター4をスライドインし、モーター3からのケーブルを接続して、ネジでケーブルホルダーに固定します。

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_16.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_19.webp"
    style="height:300px;"
  />

**ステップ19: モーターホルダー4を取り付ける**

- 4番目のモーターホルダーを取り付けてください（きつめです）。1本のワイヤーが上向きに、モーター3からのワイヤーが下向きに配線されていることを確認してください（写真参照）。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_17.webp"
  style="height:300px;"
/>

**ステップ20: モーター4を固定し、ホーンを取り付ける**

- モーター4を4本のネジで固定し、そのモーターホーンを取り付けます。ホーンネジは1本使用してください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_18.webp"
  style="height:300px;"
/>

---

### Wrist Assembly

**ステップ 21: Motor 5 のインストール**

- モーター5をリストホルダーに挿入し、前面のネジ2本で固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_20.webp"
  style="height:300px;"
/>

**ステップ22: 手首をアタッチ**

- モーター4からモーター5へワイヤーを接続してください。また、グリップ用のもう1本のワイヤーも先に挿入しておいてください。
- 4本のネジを左右両側で締めて、手首をモーター4に固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_22.webp"
  style="height:300px;"
/>

**ステップ23: 手首の角を取り付ける**

- モーターホーンは1つだけ手首モーターに取り付け、ホーンネジで固定してください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_23.webp"
  style="height:300px;"
/>

---

### フォロワー設定

**ステップ24: グリッパーを取り付ける**

- モーター5にグリップアタッチメントを取り付けてください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_24.webp"
  style="height:300px;"
/>

**ステップ25: グリッパーモーターの取り付け**

- グリップモーターを挿入し、モーター5からモーター6へのモーター配線を接続し、両側にそれぞれ3本のネジで固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_25.webp"
  style="height:300px;"
/>

**ステップ26: グリッパーホーンとクローを取り付ける**

- モーターホーンを取り付け、再びホーンネジを使用します。
- gripper clawを取り付け、両側に4本のネジで固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_26.webp"
  style="height:300px;"
/>

**ステップ 27: マウントコントローラー**

- モーターコントローラーをロボットの背面に取り付けてください。

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_27.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_28.webp"
    style="height:300px;"
  />

_アセンブリ完了 – Leaderアームのアセンブリに進んでください。_

---

### リーダー設定

リーダー構成では、**ステップ1〜23**を実行してください。モーターからモーターギアを取り外していることを確認してください。

**ステップ24: リーダーホルダーを取り付ける**

- リーダーホルダーを手首に取り付け、ネジで固定します。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_29.webp"
  style="height:300px;"
/>

**ステップ 25: ハンドルの取り付け**

- 4つのネジを使用して、ハンドルをモーター5に取り付けてください。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_30.webp"
  style="height:300px;"
/>

**ステップ26: グリッパーモーターの取り付け**

- グリッパーモーターを挿入し、両側それぞれに3本のネジで固定し、ホーンネジを使用してモーターホーンを取り付け、モーターの配線をつなぎます。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_31.webp"
  style="height:300px;"
/>

**ステップ 27: トリガーの接続**

- フォロートリガーを4本のネジで取り付けます。

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_32.webp"
  style="height:300px;"
/>

**ステップ28: マウントコントローラー**

- モーターコントローラーをロボットの背面に取り付けてください。

  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_27.webp"
    style="height:300px;"
  />
  <img
    src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/so100_assembly_28.webp"
    style="height:300px;"
  />

## キャリブレーション

次に、リーダーアームとフォロワーアームが同じ物理的な位置にあるときに、同じ位置の値を持つようにロボットをキャリブレーションする必要があります。このキャリブレーションプロセスは非常に重要であり、1つのロボットで学習したニューラルネットワークを別のロボットでも動作させることを可能にします。

#### フォロワー

以下のコマンドまたはAPIの例を実行して、フォロワーアームをキャリブレーションします。

```bash
# Use the port of your follower arm, and give the arm a unique name with --robot.id
lerobot-calibrate \
    --robot.type=so100_follower \
    --robot.port=/dev/tty.usbmodem58760431551 \
    --robot.id=my_awesome_follower_arm
```

```python
from lerobot.robots.so_follower import SO100FollowerConfig, SO100Follower

config = SO100FollowerConfig(
    port="/dev/tty.usbmodem585A0076891",
    id="my_awesome_follower_arm",
)

follower = SO100Follower(config)
follower.connect(calibrate=False)
follower.calibrate()
follower.disconnect()
```

ほとんどのロボットについて、キャリブレーション方法を統一しました。そのため、このSO100アームのキャリブレーション手順は、KochおよびSO101の手順と同じです。まず、各関節が可動範囲の中央にある位置にロボットを移動し、`Enter`キーを押します。次に、すべての関節を可動範囲全体にわたって動かします。SO101での同じプロセスの参考動画は、[こちら](https://huggingface.co/docs/lerobot/en/so101#calibration-video)で確認できます。

#### リーダー

リーダーアームのキャリブレーションには、同じ手順を実行し、以下のコマンドまたはAPIの例を実行します。

```bash
# Use the port of your leader arm, and give the arm a unique name with --teleop.id
lerobot-calibrate \
    --teleop.type=so100_leader \
    --teleop.port=/dev/tty.usbmodem58760431551 \
    --teleop.id=my_awesome_leader_arm
```

```python
from lerobot.teleoperators.so_leader import SO100LeaderConfig, SO100Leader

config = SO100LeaderConfig(
    port="/dev/tty.usbmodem58760431551",
    id="my_awesome_leader_arm",
)

leader = SO100Leader(config)
leader.connect(calibrate=False)
leader.calibrate()
leader.disconnect()
```

おめでとうございます🎉。ロボットがタスクを独自に学習する準備が整いました。このチュートリアルに従ってトレーニングを開始してください: [実世界のロボットで始める](./il_robots)

> [!TIP]
> ご質問やご支援が必要な場合は、[Discord](https://discord.com/invite/s3KuuzsPFb)までご連絡ください。

