# Koch v1.1

以下の手順で、Koch v1.1 ロボットの組み立て方法を説明します。

## パーツを注文して組み立てる

この[README](https://github.com/jess-moss/koch-v1-1)に記載されている調達および組み立ての手順に従ってください。これにより、以下の画像に示されているように、followerアームとleaderアームのセットアップが案内されます。

アセンブリプロセスのビジュアルな解説については、[この動画チュートリアル](https://youtu.be/8nQIg9BwwTk)を参照してください。

> [!WARNING]
> この動画の制作以降、設定フェーズが簡素化されました。そのため、以下の2点について、動画内の手順と異なります。
>
> - モーターケーブルをすべて接続せず、[モーターの構成](#configure-the-motors)で指示があるまでお待ちください。 - コントローラーボード（PCB）をベースに固定せず、[モーターの構成](#configure-the-motors)で指示があるまでお待ちください。

## LeRobot🤗のインストール

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

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

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

## モーターを設定

### 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とボーレートが一致しない可能性が高いため、この手順も実行する必要があるでしょう。

#### フォロワー

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

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

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

```python
from lerobot.robots.koch_follower import KochFollower, KochFollowerConfig

config = KochFollowerConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_follower_arm",
)
follower = KochFollower(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=koch_leader \
    --teleop.port=/dev/tty.usbmodem575E0031751
```

```python
from lerobot.teleoperators.koch_leader import KochLeader, KochLeaderConfig

config = KochLeaderConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_leader_arm",
)
leader = KochLeader(config)
leader.setup_motors()
```

## キャリブレーション

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

#### フォロワー

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

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

```python
from lerobot.robots.koch_follower import KochFollowerConfig, KochFollower

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

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

ほとんどのロボットについて、キャリブレーション方法を統一しました。そのため、このKochアームのキャリブレーション手順は、SO100および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=koch_leader \
    --teleop.port=/dev/tty.usbmodem58760431551 \
    --teleop.id=my_awesome_leader_arm
```

```python
from lerobot.teleoperators.koch_leader import KochLeaderConfig, KochLeader

config = KochLeaderConfig(
    port="/dev/tty.usbmodem575E0031751",
    id="my_awesome_leader_arm",
)

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

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

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

