# Manipulation avancée avec AICA - déploiement Cloud

### Prérequis

On déploie les TP avec une architecture client-serveur.

Avantages :

- Fonctionne sur postes Windows même peu puissants
- Pas besoin d'installer Docker, WSL, VirtualBox ou d'avoir de droits admin
- Déploiement d'autant d'environnements AICA qu'on veut sur une VM en un script

#### Côté serveur

- Une VM (machine virtuelle ou serveur physique) Linux 
    - Avec un accès SSH pour un utilisateur dans le groupe `sudo`
    - De préférence avec GPU NVidia, les drivers propriétaires et `nvidia-container-toolkit` installés
    - Avec `docker.io` installé

#### Côté client

- Un PC avec une connexion rapide à la VM 
    - Chrome/Chromium installé avec support de WebGL
    - VSCode/Codium installé avec l'extension `ms-vscode-remote.remote-ssh` (sur Codium tester `jeanp413.open-remote-ssh`)

<p class="callout info">Si notre client est un PC Linux on peut avoir une expérience AICA complète en affichant RViz et AICA Launcher sur le PC : [https://docs.aica.tech/docs/reference/manual-installation-launch#display-sharing](https://docs.aica.tech/docs/reference/manual-installation-launch#display-sharing)</p>

### Installation de AICA sur le serveur via ssh

[https://docs.aica.tech/docs/reference/manual-installation-launch](https://docs.aica.tech/docs/reference/manual-installation-launch)

- Ouvrir VSCode
- Se connecter à la VM via SSH
- Ouvrir un Terminal dans VSCode
- Copier le dossier `docker` dans votre espace utilisateur `/home/user/`
- Copier la licence `aica-license-1.toml` dans `docker/aica/`
- Connecter la VM au dépôt Docker de AICA  
    `cat /home/user/docker/aica/aica-license.toml | sudo docker login registry.licensing.aica.tech -u USERNAME --password-stdin`
- Build le ou les environnements docker nécessaires pour le TP depuis le fichier `launcher.toml` en leur donnant un nom, par ex. `aica-yolo-web` :  
    ```bash
    cd docker/aica
    sudo docker build -f /home/user/docker/aica/aica-launcher-yolo-web.toml -t aica-yolo-web .
    ```

### TP3 - Vision par IA avec Yolo

Pour déploiement sur un serveur avec GPU NVidia et `nvidia-container-toolkit` :

```TOML
#syntax=ghcr.io/aica-technology/app-builder:v2

[core]
"image" = "v5.1.0"

[packages]
# add components
#"@aica/components/rl-policy-components" = "v2.0.0"
"@aica/components/advanced-perception" = "v1.0.0" # contains YoloExecutor
"@aica/components/core-vision" = "v1.1.2" # contains CameraStreamer
"@aica/foss/toolkits/ml" = "v1.0.0-cpu24.04" # prerequisite for YoloExecutor

# other extensions

# add hardware collections
```

Pour déploiement sur un serveur sans GPU :

```TOML
#syntax=ghcr.io/aica-technology/app-builder:v2

[core]
"image" = "v5.1.0"

[packages]
# add components
#"@aica/components/rl-policy-components" = "v2.0.0"
"@aica/components/advanced-perception" = "v1.0.0" # contains YoloExecutor
"@aica/components/core-vision" = "v1.1.2" # contains CameraStreamer
"@aica/foss/toolkits/ml" = "v1.0.0-cpu24.04" # prerequisite for YoloExecutor

# other extensions
"@aica/foss/web-video-server" = "v0.1.0" # enables web streaming of video topics

# add hardware collections
```

Si elles ne sont pas déjà dispo dans `docker/` télécharger et compiler les composants dépendants, par ex. :

```
"my-local-package" = "docker-image://my-custom-component-package"
```

Démarrer une instance du conteneur `aica-yolo-web` nommée `aica` en lui passant le dossier persistant `aica-yolo-web/persistent/` qui sera disponible dans un dossier `persistent/` :

```bash
sudo docker run -it --rm --privileged --net=host -v /home/user/docker/aica/aica-license.toml:/license:ro -v /home/user/docker/aica/aica-yolo-web/persistent/:/persistent:rw -e AICA_SUPER_ADMIN_PASSWORD=12345678 --name aica aica-yolo-web
```

- L'argument `-e AICA_SUPER_ADMIN_PASSWORD=12345678` n'est nécessaire qu'au premier démarrage pour pouvoir créer un compte Admin.

Il peut y avoir des Warnings qui ne sont à ignorer et apparaissent si Cloud Storage n'est pas configuré ou si la vérification de license prend plus que quelques secondes :

```
[2024-11-18 13:38:16 +0000] [135] [INFO] Starting sync of cloud applications
[2024-11-18 13:38:16 +0000] [135] [WARNING] Sync failed
[2024-11-18 13:08:42 +0000] [151] [INFO] Waiting for licensing status... 5
[WARN] [1731935323.407252919] [EventEngine.ServiceHandler]: (404): Could not determine any license status
```

- Dans l'onglet `Ports` de VSCode, ajouter le port `8080`
- Dans le navigateur Chrome Ouvrir [localhost:8080](localhost:8080)
- Se connecter avec les identifiants `super-admin`, `12345678`
- Créer un compte Admin (Profile &gt; change password) et bien noter les identifiants.
- La configuration de cette instance AICA sera sauvegardée dans `aica.sqlite`, `aica.sqlite-shm` et `aica.sqlite-wal`
- Pour garder et dupliquer la config, on peut copier les fichiers `.sqlite` dans le dossier `persistent/`

Attacher un Terminal à l'intérieur l'instance `aica` de `aica-yolo-web` :

```bash
sudo docker container exec -it -u ros2 aica /bin/bash
ros2 node list
```

On voit bien que le contenu du dossier de la VM `aica-yolo-web/persistent/` est dispo dans le conteneur dans le dossier `persistent/` :

```bash
ls persistent
aica.sqlite aica.sqlite-shm aica.sqlite-wal
```

Détacher le Terminal du conteneur avec `CTRL+D` ou en tapant `exit`.

Stopper le conteneur : `docker container ps` puis `docker container stop <container_name>`.

#### Déroulé du TP3

Define a workcell setup  
AICA studio -&gt; Hardware -&gt; modify URDF of e.g. UR5e

Build a custom package for Workcell or moveit python API script  
https://github.com/aica-technology/community/blob/main/extensions/topic\_based\_ros2\_control/aica-package.toml  
source = "git://github.com/hellantos/ur5e\_cell#start-of-training:ur5e\_cell\_description"