# Koch v1.1

Dans les étapes ci-dessous, nous expliquons comment assembler le robot Koch v1.1.

## Commander et assembler les pièces

Suivez les instructions de sourcing et d'assemblage fournies dans ce [README](https://github.com/jess-moss/koch-v1-1). Elles vous guideront dans la configuration des bras suiveur et leader, comme illustré sur l'image ci-dessous.

Pour un aperçu visuel du processus d'assemblage, vous pouvez consulter [ce tutoriel vidéo](https://youtu.be/8nQIg9BwwTk).

> [!WARNING]
> Depuis la production de cette vidéo, nous avons simplifié la phase de configuration. En conséquence, deux éléments diffèrent des instructions de cette vidéo :
>
> - Ne branchez pas tous les câbles des moteurs immédiatement et attendez d'être invité à le faire dans [Configure the motors](#configure-the-motors). - Ne vissez pas la carte de contrôle (PCB) sur la base immédiatement et attendez d'être invité à le faire dans [Configure the motors](#configure-the-motors).

## Installer LeRobot 🤗

Pour installer LeRobot, suivez notre [Guide d'installation](./installation)

En plus de ces instructions, vous devez installer le SDK Dynamixel (si vous avez installé LeRobot depuis PyPI, exécutez `pip install 'lerobot[dynamixel]'` à la place) :

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

## Configurer les moteurs

### 1. Trouver les ports USB associés à chaque bras

Pour trouver le port de chaque adaptateur de servomoteur de bus, exécutez ce script :

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

Exemple de sortie :

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

L’emplacement du port trouvé est : `/dev/tty.usbmodem575E0032081`, correspondant à votre bras leader ou suiveur.

Sur Linux, vous devrez peut-être accorder l'accès aux ports USB en exécutant :

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

Exemple de sortie :

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

L’emplacement du port trouvé est : `/dev/ttyACM1`, correspondant à votre bras leader ou suiveur.

### 2. Définir les identifiants des moteurs et les débits

Chaque moteur est identifié par un id unique sur le bus. Neufs, les moteurs sont généralement livrés avec un id par défaut de `1`. Pour que la communication fonctionne correctement entre les moteurs et le contrôleur, il faut d'abord attribuer à chaque moteur un id unique et différent. De plus, la vitesse à laquelle les données sont transmises sur le bus est déterminée par le baudrate. Pour pouvoir communiquer entre eux, le contrôleur et tous les moteurs doivent être configurés avec le même baudrate.

À cette fin, nous devons d'abord nous connecter à chaque moteur individuellement via le contrôleur afin de définir ces paramètres. Comme nous écrivons ces paramètres dans la section non volatile de la mémoire interne des moteurs (EEPROM), nous n'aurons besoin de le faire qu'une seule fois.

Si vous réutilisez des moteurs d'un autre robot, vous devrez probablement également effectuer cette étape, car les identifiants et le taux de bauds ne correspondront probablement pas.

#### Suiveur

Branchez le câble usb de votre ordinateur et l’alimentation 12V sur la carte contrôleur du bras suiveur (le bras leader utilise l’alimentation 5V). Ensuite, exécutez la commande suivante ou l’exemple d’API avec le port obtenu à l’étape précédente. Vous devrez également donner un nom à votre bras suiveur à l’aide du paramètre `id`.

Pour une référence visuelle sur la manière de définir les identifiants des moteurs, veuillez consulter [cette vidéo](https://huggingface.co/docs/lerobot/en/so101#setup-motors-video) où nous suivons le processus pour le bras SO101.

```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()
```

Vous devriez voir l’instruction suivante.

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

Conformément aux instructions, branchez le moteur de la pince. Assurez-vous qu'il s'agit du seul moteur connecté à la carte et que le moteur lui-même n'est pas encore chaîné en série avec un autre moteur. Lorsque vous appuyez sur `[Enter]`, le script définit automatiquement l'identifiant et le taux de bauds de ce moteur.

Dépannage

Si vous obtenez une erreur à ce stade, vérifiez vos câbles et assurez-vous qu'ils sont correctement branchés :

  Câble d'alimentation USB entre votre ordinateur et la carte de contrôle Câble à 3 broches de la carte de contrôle vers le moteur

Si vous utilisez une carte contrôleur Waveshare, assurez-vous que les deux cavaliers sont positionnés sur le canal `B` (USB).

Vous devriez alors voir le message suivant :

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

Suivi de la prochaine instruction :

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

Vous pouvez débrancher le câble à 3 broches de la carte de contrôle, mais vous pouvez le laisser branché sur le moteur de la pince à l'autre extrémité, car il sera déjà à la bonne place. Maintenant, branchez un autre câble à 3 broches sur le moteur de rotation du poignet et connectez-le à la carte de contrôle. Comme pour le moteur précédent, assurez-vous qu'il est le seul moteur connecté à la carte et que le moteur lui-même n'est connecté à aucun autre.

Répétez l'opération pour chaque moteur comme indiqué.

> [!TIP]
> Vérifiez le câblage à chaque étape avant d’appuyer sur Entrée. Par exemple, le câble d’alimentation peut se débrancher lorsque vous manipulez la carte.

Une fois terminé, le script se termine simplement, et les moteurs sont alors prêts à être utilisés. Vous pouvez maintenant brancher le câble à 3 broches de chaque moteur sur le suivant, ainsi que le câble du premier moteur (le « shoulder pan » avec id=1) sur la carte de contrôle, qui peut désormais être fixée à la base du bras.

#### Leader

Effectuez les mêmes étapes pour le bras leader, mais modifiez la commande ou le script en conséquence.

```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()
```

## Calibrer

Ensuite, vous devrez calibrer votre robot afin de vous assurer que les bras leader et suiveur ont les mêmes valeurs de position lorsqu'ils se trouvent dans la même position physique. Le processus de calibration est très important car il permet à un réseau de neurones entraîné sur un robot de fonctionner sur un autre.

#### Suiveur

Exécutez la commande ou l'exemple d'API suivant pour calibrer le bras suiveur :

```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()
```

Nous avons unifié la méthode de calibration pour la plupart des robots. Ainsi, les étapes de calibration pour ce bras Koch sont identiques à celles des SO100 et SO101. D'abord, il faut déplacer le robot à la position où chaque articulation est au milieu de sa plage de mouvement, puis appuyer sur `Enter`. Ensuite, nous déplaçons toutes les articulations sur leur pleine amplitude de mouvement. Une vidéo de ce même processus pour le SO101, à titre de référence, peut être trouvée [ici](https://huggingface.co/docs/lerobot/en/so101#calibration-video).

#### Leader

Effectuez les mêmes étapes pour calibrer le bras leader, exécutez la commande suivante ou l'exemple d'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()
```

Félicitations 🎉, votre robot est prêt à apprendre une tâche de manière autonome. Commencez son entraînement en suivant ce tutoriel : [Démarrer avec des robots réels](./il_robots)

> [!TIP]
> Si vous avez des questions ou besoin d'aide, n'hésitez pas à nous contacter sur [Discord](https://discord.com/invite/s3KuuzsPFb).

