# LeKiwi

<img
  src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/lerobot/1740517739083.jpeg"
  alt="LeKiwi"
  width="70%"
/>

Dans les étapes ci-dessous, nous expliquons comment assembler le robot mobile LeKiwi.

## Sourcer les pièces

Suivez ce [README](https://github.com/SIGRobotics-UIUC/LeKiwi). Il contient la liste des pièces, avec un lien pour les commander, ainsi que les instructions pour les imprimer en 3D. Il inclut également des conseils si c'est votre première impression ou si vous ne possédez pas d'imprimante 3D.

### Version filaire

Si vous disposez de la version **wired** de LeKiwi, vous pouvez passer l’installation du Raspberry Pi et la configuration de SSH. Vous pouvez également exécuter directement sur votre PC toutes les commandes, tant pour les scripts LeKiwi que pour les scripts du bras leader utilisés pour la téléopération.

## Installer le logiciel sur le Pi

Nous devons maintenant configurer le PC distant qui sera exécuté sur le robot LeKiwi. Il s’agit normalement d’un Raspberry Pi, mais cela peut être n’importe quel PC fonctionnant sous 5 V et disposant de suffisamment de ports usb (2 ou plus) pour les caméras et la carte de contrôle des moteurs.

### Installer le système d'exploitation

Pour la configuration du Raspberry Pi et de sa carte SD, voir : [Setup PI](https://www.raspberrypi.com/documentation/computers/getting-started.html). Voici comment télécharger le [Imager](https://www.raspberrypi.com/software/) pour installer Raspberry Pi OS ou Ubuntu.

### Configuration de SSH

Après avoir configuré votre Pi, vous devez activer et configurer [SSH](https://www.raspberrypi.com/news/coding-on-raspberry-pi-remotely-with-visual-studio-code/) (Secure Shell Protocol) afin de pouvoir vous connecter au Pi depuis votre ordinateur portable sans avoir besoin d'un écran, d'un clavier et d'une souris sur le Pi. Un excellent tutoriel expliquant comment procéder est disponible [ici](https://www.raspberrypi.com/documentation/computers/remote-access.html#ssh). La connexion à votre Pi peut se faire via votre invite de commandes (cmd) ou, si vous utilisez VSCode, vous pouvez utiliser cette extension [ci](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh).

### Installer LeRobot sur Pi 🤗

Sur votre Raspberry Pi, installez LeRobot en suivant notre [Guide d'installation](./installation)

En plus de ces instructions, vous devez installer le support des moteurs Feetech & ZeroMQ sur votre Pi :

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

## Installer LeRobot localement

Si vous avez déjà installé LeRobot sur votre ordinateur portable ou de bureau, vous pouvez passer cette étape ; sinon, suivez les mêmes étapes que celles que nous avons effectuées sur le Pi.

Suivez notre [Guide d'installation](./installation)

En plus de ces instructions, vous devez installer le support des moteurs Feetech & ZeroMQ sur votre ordinateur portable/PC :

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

Parfait 🤗 ! L’installation de LeRobot est terminée, et nous pouvons commencer à assembler les bras SO100/SO101 et la base mobile 🤖. Chaque fois que vous souhaitez utiliser LeRobot, rendez-vous dans le dossier `~/lerobot` où LeRobot a été installé et exécutez l’une des commandes.

# Instructions d'assemblage étape par étape

Premièrement, nous allons assembler les deux bras SO100/SO101. L'un sera fixé à la base mobile et l'autre sera utilisé pour la téléopération. Ensuite, nous assemblerons la base mobile. Les instructions d'assemblage se trouvent sur ces deux pages :

- [Assembler le SO101](./so101#step-by-step-assembly-instructions)
- [Assembler LeKiwi](https://github.com/SIGRobotics-UIUC/LeKiwi/blob/main/Assembly.md)

### Trouver les ports USB associés à la carte moteur

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']
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'endroit où le port trouvé est : `/dev/tty.usbmodem575E0032081` correspondant à votre carte.

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']
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/ttyACM0
Reconnect the USB cable.
```

L'endroit où le port a été trouvé est : `/dev/ttyACM0`, correspondant à votre carte.

### Configurer les moteurs

Les instructions pour configurer les moteurs se trouvent dans la [documentation](./so101#configure-the-motors) du SO101. En plus des identifiants des moteurs du bras, il est nécessaire de définir les identifiants des moteurs de la base mobile. Ces derniers doivent être dans un ordre spécifique pour fonctionner. Ci-dessous, une image des identifiants des moteurs et des positions de montage des moteurs pour la base mobile. Notez que nous n'utilisons qu'une seule carte de contrôle des moteurs sur LeKiwi. Cela signifie que les identifiants des moteurs des roues sont 7, 8 et 9.

Vous pouvez exécuter cette commande pour configurer les moteurs de LeKiwi. Elle configure d'abord les moteurs du bras (id 6..1), puis les moteurs des roues (9,8,7).

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

### Dépanner la communication

Si vous rencontrez des difficultés pour vous connecter à LeKiwi, suivez ces étapes pour diagnostiquer et résoudre le problème.

#### 1. Vérifier la configuration de l'adresse IP

Assurez-vous que l'IP correcte du Pi est utilisée dans les commandes ou dans votre code. Pour vérifier l'adresse IP du Raspberry Pi, exécutez (sur la ligne de commande du Pi) :

```bash
hostname -I
```

#### 2. Vérifier si le Pi est accessible depuis le portable/PC

Essayez de faire un ping à la Raspberry Pi depuis votre ordinateur portable :

```bash
ping <your_pi_ip_address>
```

Si le ping échoue :

- Assurez-vous que le Pi est allumé et connecté au même réseau.
- Vérifiez si SSH est activé sur le Pi.

#### 3. Essayer la connexion SSH

Si vous ne pouvez pas vous connecter au Pi via SSH, il est peut-être mal connecté. Utilisez :

```bash
ssh <your_pi_user_name>@<your_pi_ip_address>
```

En cas d'erreur de connexion :

- Assurez-vous que SSH est activé sur le Pi en exécutant :
  ```bash
  sudo raspi-config
  ```
  Puis accédez à : **Interfacing Options -> SSH** et activez-le.

### Calibration

Nous devons maintenant calibrer le bras leader et le bras suiveur. Les moteurs des roues n'ont pas besoin d'être calibrés. 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.

### Calibrer le bras suiveur (sur base mobile)

Vérifiez que le bras est connecté au Raspberry Pi, puis exécutez ce script ou cet exemple d’API (sur le Raspberry Pi via SSH) pour lancer la calibration du bras suiveur :

```bash
lerobot-calibrate \
    --robot.type=lekiwi \
    --robot.id=my_awesome_kiwi # <- Give the robot a unique name
```

Nous avons unifié la méthode de calibration pour la plupart des robots ; les étapes de calibration du bras LeKiwi sont donc identiques à celles des Koch et SO101. D'abord, il faut placer le robot à la position où chaque articulation se trouve au milieu de sa plage de mouvement, puis appuyer sur `Enter`. Ensuite, nous faisons parcourir à toutes les articulations leur amplitude de mouvement complète. Une vidéo de ce même processus pour le SO101, à titre de référence, est disponible [ici](https://huggingface.co/docs/lerobot/en/so101#calibration-video).

### Version filaire

Si vous disposez de la version **wired** de LeKiwi, veuillez exécuter toutes les commandes sur votre ordinateur portable.

### Calibrer le bras principal

Ensuite, pour calibrer le bras leader (qui est fixé à l'ordinateur portable/PC). Exécutez la commande suivante de l'exemple d'API sur votre ordinateur portable :

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

## Télépiloter LeKiwi

> [!TIP]
> Si vous utilisez un Mac, vous devrez peut-être accorder à Terminal l'autorisation d'accéder à votre clavier pour la téléopération. Allez dans Préférences Système > Sécurité et confidentialité > Surveillance des entrées et cochez la case Terminal.

Pour télépiloter, connectez-vous à votre Raspberry Pi via SSH, puis exécutez `conda activate lerobot` et cette commande :

```bash
python -m lerobot.robots.lekiwi.lekiwi_host --robot.id=my_awesome_kiwi
```

L'hôte s'arrête après `--host.connection_time_s` secondes (30 par défaut). Pour des sessions plus longues, comme l'enregistrement d'un jeu de données, augmentez cette valeur, par exemple `--host.connection_time_s=600`.

Then on your laptop, also run `conda activate lerobot` and run the API example, make sure you set the correct `remote_ip` and `port` in `examples/lekiwi/teleoperate.py`.

```bash
python examples/lekiwi/teleoperate.py
```

Vous pouvez maintenant déplacer le bras leader et utiliser le clavier (w,a,s,d) pour avancer, aller à gauche, reculer et aller à droite. Utilisez (z,x) pour tourner à gauche ou à droite. Vous pouvez utiliser (r,f) pour augmenter et diminuer la vitesse du robot mobile. Il existe trois modes de vitesse, voir le tableau ci-dessous :

| Mode Vitesse | Vitesse linéaire (m/s) | Vitesse de rotation (deg/s) |
| ---------- | ------------------ | ---------------------- |
| Rapide       | 0.3                | 90                     |
| Moyen     | 0.2                | 60                     |
| Lent       | 0.1                | 30                     |

| Clé | Action         |
| --- | -------------- |
| W   | Avancer   |
| A   | Déplacer vers la gauche      |
| S   | Reculer  |
| D   | Déplacer vers la droite     |
| Z   | Tournez à gauche      |
| X   | Tournez à droite     |
| R   | Augmenter la vitesse |
| F   | Réduire la vitesse |

> [!TIP]
> Si vous utilisez un clavier différent, vous pouvez modifier les touches de chaque commande dans [`LeKiwiClientConfig`](https://github.com/huggingface/lerobot/blob/main/src/lerobot/robots/lekiwi/config_lekiwi.py).

### Version filaire

Si vous disposez de la version **wired** de LeKiwi, veuillez exécuter toutes les commandes sur votre ordinateur portable.

## Enregistrer un jeu de données

Une fois que vous êtes à l'aise avec la téléopération, vous pouvez enregistrer votre premier jeu de données.

Nous utilisons les fonctionnalités du hub Hugging Face pour téléverser votre jeu de données. Si vous n'avez pas encore utilisé le Hub, assurez-vous de pouvoir vous connecter via le cli à l'aide d'un jeton d'accès en écriture, ce jeton pouvant être généré depuis les [paramètres Hugging Face](https://huggingface.co/settings/tokens).

Ajoutez votre jeton à l’interface en ligne de commande en exécutant cette commande :

```bash
hf auth login --token ${HUGGINGFACE_TOKEN} --add-to-git-credential
```

Enregistrez ensuite le nom de votre dépôt Hugging Face dans une variable :

```bash
HF_USER=$(hf auth whoami --quiet)
echo $HF_USER
```

Vous pouvez maintenant enregistrer un jeu de données. Pour enregistrer des épisodes et téléverser votre jeu de données sur le hub, exécutez cet exemple d’API adapté à LeKiwi. Assurez-vous d’abord d’adapter `remote_ip`, `HF_REPO_ID`, le `port` du bras leader et `TASK_DESCRIPTION` dans le script. Pour enregistrer plus d’épisodes ou des épisodes plus longs, modifiez `NUM_EPISODES`, `EPISODE_TIME_SEC` et `RESET_TIME_SEC`, et démarrez l’hôte avec un `--host.connection_time_s` qui couvre toute la session.

```bash
python examples/lekiwi/record.py
```

#### Téléversement de jeu de données

Localement, votre jeu de données est stocké dans ce dossier : `~/.cache/huggingface/lerobot/{repo-id}`. À la fin de l'enregistrement des données, votre jeu de données sera téléversé sur votre page Hugging Face sous l'identifiant `HF_REPO_ID` que vous avez défini dans le script (par exemple `https://huggingface.co/datasets/${HF_USER}/lekiwi_test`), que vous pouvez obtenir en exécutant :

```bash
echo https://huggingface.co/datasets/${HF_USER}/lekiwi_test
```

Votre jeu de données sera automatiquement étiqueté avec `LeRobot` pour que la communauté puisse le trouver facilement, et vous pouvez également ajouter des étiquettes personnalisées (par exemple `tutorial` dans ce cas).

Vous pouvez rechercher d'autres jeux de données LeRobot sur le hub en cherchant les [tags](https://huggingface.co/datasets?other=LeRobot) `LeRobot`.

#### Conseils pour collecter des données

Une fois à l’aise avec l’enregistrement des données, vous pouvez créer un jeu de données plus volumineux pour l’entraînement. Une bonne tâche de départ consiste à saisir un objet à différents endroits et à le déposer dans un bac. Nous recommandons d’enregistrer au moins 50 épisodes, soit 10 épisodes par emplacement. Gardez les caméras fixes et maintenez un comportement de saisie cohérent tout au long des enregistrements. Assurez-vous également que l’objet que vous manipulez est visible sur les caméras. Une bonne règle empirique est que vous devriez pouvoir effectuer la tâche vous-même en ne regardant que les images des caméras.

Dans les sections suivantes, vous entraînerez votre réseau de neurones. Une fois que vous obtenez des performances de préhension fiables, vous pouvez commencer à introduire davantage de variations lors de la collecte de données, telles que des emplacements de préhension supplémentaires, des techniques de préhension différentes et des modifications des positions des caméras.

Évitez d'ajouter trop de variation trop rapidement, car cela pourrait nuire à vos résultats.

Si vous souhaitez approfondir ce sujet important, vous pouvez consulter notre [article de blog](https://huggingface.co/blog/lerobot-datasets#what-makes-a-good-dataset) sur ce qui fait un bon jeu de données.

#### Dépannage :

- Sur Linux, les touches de contrôle du flux d’enregistrement (touches fléchées, Échap) fonctionnent sur X11, Wayland et les sessions headless/SSH, à condition d’exécuter l’enregistrement depuis un terminal interactif (en le gardant au premier plan) — aucune configuration de `$DISPLAY` n’est nécessaire ; les équivalents en lettres `n` / `r` / `q` fonctionnent également. Notez que la **téléopération clavier de la base LeKiwi** est différente : elle repose sur un backend de touches global et fonctionne donc uniquement sur une session X11, un bureau Windows ou macOS avec les autorisations d’Accessibilité/Surveillance des saisies accordées — pas sur Wayland ni sur des machines headless. Voir [limitations de pynput](https://pynput.readthedocs.io/en/latest/limitations.html#linux).

## Rejouer un épisode

Pour rejouer un épisode, exécutez l'exemple d'API ci-dessous et assurez-vous de modifier `remote_ip`, `port`, LeRobotDatasetId et l'index de l'épisode.

```bash
python examples/lekiwi/replay.py
```

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

## Évaluer votre politique

Pour évaluer votre politique, exécutez l'exemple d'API `evaluate.py` et assurez-vous de modifier `remote_ip`, `port`, le modèle..

```bash
python examples/lekiwi/evaluate.py
```

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

