La Division Technique de l'Institut National Des Sciences de l'Univers

Illustration
@insu.hal.science
Le Centre National de Recherche Scientifique (CNRS), fondé en 1939, est le plus
grand
organisme public français de recherche scientifique, mais c'est aussi un acteur majeur
de la
recherche mondiale. Premier producteur de publications au monde, avec ses 4 milliards
d'euros de budget
annuel, 33 000 agents et plus de 1100 laboratoires, le CNRS se positionne comme le leader des
recherches fondamentales au service de la société dans tous les champs de la connaissance.
Le CNRS est organisé en 10 instituts, dont l'Institut
National des Sciences
de l'Univers (INSU),
qui regroupe les disciplines de l'astronomie, de la planétologie, de la géophysique, de la
géochimie, de la géologie, de l'océanographie, de l'atmosphère et de la météorologie.
L'INSU
coordonne les recherches dans ces domaines et gère les moyens d'observation et
d'expérimentation
nécessaires à ces disciplines.
La Direction Technique de l'Institut National des Sciences de l'Univers (DT-INSU)
est une
entité clé de l'INSU, chargée de venir en soutien à l'ensemble des laboratoires des secteurs
scientifiques de ses laboratoires, elle leur fournit les services et les outils technologiques
nécessaires à la réalisation de leurs missions.
Bathybot

Figure 1 : Bathybot dans sa station
@nicolasfromontphoto
Présentation
Au sein du projet de collaboration Européenne EMSO-ERIC, le projet Bathybot représente une avancée significative dans l'exploration sous-marine. Bathybot est un robot benthiqueRelatif au fond des mers ou des océans, où vivent des organismes (comme les poissons et les invertébrés) qui se trouvent sur ou à proximité du fond marin. téléopéré sous-marin, aussi appelé « Crawler ». Unique en son genre, c'est le premier robot de ce type à être déployé dans les eaux profondes de la Méditerranée. Grâce à sa caméra haute résolution et ultra-sensible et à ses nombreux capteurs environnementaux, Bathybot permettra d'étudier les processus biogéochimiquesProcessus qui impliquent l'interaction entre les organismes vivants (bio-), la géologie (gé-) et la chimie (-chimiques) dans un environnement donné, par exemple la manière dont les éléments circulent entre le sol, l'eau, l'air et les organismes. et la biodiversité des grandes profondeurs où la lumière du soleil ne pénètre pas.
La Mission
Afin de permettre aux scientifiques d'accomplir leurs missions de manière efficace et pratique, il était essentiel de disposer d'une interface de contrôle intuitive et performante pour Bathybot. De là est venue l'idée d'une interface homme-machine (IHM) dédiée à la téléopération de la caméra, à l'enregistrement de vidéos et à la programmation de scénarios d'observation.
Le projet devra ainsi être réalisé avec les contraintes technologiques suivantes :
Réalisation
Le développement du projet BathyCam s’est structuré autour de plusieurs étapes clé, combinant différentes technologies pour répondre aux besoins d’une interface homme-machine performante et intuitive.
Le contrôle à distance de Bathybot exigeait une gestion optimale des communications en temps réel :- Socket.io : Pour assurer une communication bidirectionnelle fluide entre le front-end Vue.js et le back-end Flask, j’ai intégré WebSockets via Socket.io. Ce protocole permet la transmission instantanée des données, nécessaire pour le retour vidéo en direct et la réponse aux commandes de téléopération. Par exemple, chaque changement d’état ou de paramètre de Bathybot est immédiatement synchronisé entre l'interface et le serveur.
1. Développement du Tchat en Direct
Afin de faciliter la communication entre les chercheurs et les opérateurs, j'ai intégré un système de
tchat en direct dans l'interface. Ce tchat permet aux utilisateurs de communiquer en temps réel
pendant les missions de recherche, de partager des informations et de coordonner leurs actions.
Le tchat n'ayant qu'une fonction éphémère, j'ai décidé de ne pas stocker les messages dans une
base
de données, mais de les conserver en mémoire vive. Cela simplifie le code et la gestion des
messages.
Ainsi, quand un utilisateur envoie un message, celui-ci est instantanément transmis à tous les
autres utilisateurs connectés, et, quand un nouvel utilisateur se connecte, il reçoit les messages
précédents.
Par mesure de sécurité, l'historique des messages est limité en taille, et par mesure d'ergonomie,
se vide automatiquement après que le dernier utilisateur se soit déconnecté.
2. Développement de l'Enregistrement Vidéo
Si la téléopération de la caméra est essentielle pour les missions de recherche, la récolte des
données vidéos l’est tout autant. J’ai donc intégré une fonctionnalité de capture vidéo en
temps réel, permettant aux utilisateurs d’enregistrer des sessions d’observation pour une analyse
postérieure. Cette fonctionnalité repose sur OpenCV et FFmpeg pour la capture, le traitement,
et l’encodage des vidéos. Les vidéos sont ensuite stockées sur le serveur et peuvent être
téléchargées ou supprimées via l'interface. De plus, un système de limite et de quota a
été implémenté pour éviter la saturation du serveur et faciliter la gestion des fichiers vidéos.
3. La Programmation de Scénarios d’Observation
Préalablement au développement de cette fonctionnalité, mon maître de stage, ingénieur et chef du
service informatique, devait, pour
chaque mission, rédiger un script Python pour programmer les scénarios d'observation de Bathybot.
Cependant, cette approche manuelle était peu pratique et nécessitait son expertise en programmation.
Pour faciliter la programmation des scénarios, j’ai donc eu l'initiative de développer un système de
programmation intégré.
Maintenant, l’interface permet aux chercheurs de programmer des scénarios automatiques pour
Bathybot. Grâce à un
système de sélection et "glisser-déposer" il est facile de créer et de modifier des séquences
d’observation personnalisées.
Mais cela n'a pas été sans difficulté, en effet, je souhaitais que cette fonctionnalité soit la
plus flexible, puissante et graphiquement compacte possible...
Après y avoir bien réfléchi, j'ai décidé d'implémenter un tableau contenant le minimum de champs
nécessaires, à savoir : l'index, l'action et le paramètre.
L'index étant auto-déterminé, et l'action ayant été choisie dans une liste pré-définie, il ne
restait
plus qu'à l'utilisateur de définir le paramètre passé à l'action (e.g. "action : enregistrer |
paramètre
: start").
Si cette approche est simple, elle soulève un problème : comment réaliser des scénarios complexes ?
En effet, si l'utilisateur souhaite exécuter une action conditionnelle ou définir une variable, il
faudrait entre une.g. "aller_gauche 5" un
champ pour la fonction, un pour la variable et quatree.g. "Si A = B alors C sinon D" : un champ pour la variable testée (A), un
pour la condition (=), un pour la variable de comparaison (B), un pour la cible en cas de condition
vraie ("if" : C) et un dernier pour la cible en cas de condition fausse ("else" : D)
champs supplémentaires, possibilité que j'ai tout de suite écarté en raison des contraintes de place
et de simplicité utilisateur que je m'étais imposé.
La solution ? La programmation python ! En effet, en utilisant l'interpréteur de la librairie
Asteval, il est possible à partir d'une entrée utilisateur de définir des variables, de les
modifier,
d'effectuer des calculs et comparaisons, le tout en utilisant la syntaxe python afin de créer des
scénarios
d'observation complexes.
Cette approche combine la simplicité de l'interface utilisateur avec la puissance de la
programmation, tout en garantissant une exécution sécurisée.



Côté serveur, l'implémentation est aussi relativement simple : le programme se planifie grâce à
l'utilisation des
librairies
Croniter
Une bibliothèque Python basée sur le format Cron, utilisée pour itérer sur des dates et des horaires en fonction d'expressions cron, comme celles utilisées dans crontab pour planifier des tâches récurrentes ou non.
et APScheduler
Une bibliothèque Python permettant de planifier l'exécution de tâches à des moments précis ou de manière répétée, avec des déclencheurs basés sur des horaires, des intervalles ou des règles cron, similaire à un planificateur de tâches.
. Il s'auto-itère ainsi intelligemment pour exécuter la suite
d'instructions définie par l'utilisateur. Par la
programmation backend, il est également possible de définir de nouvelles fonctionnalités sous forme
de fonctions, puis d'exposer ces fonctions à la programmation utilisateur.
Par exemple : la fonction
"goto(index)" permet d'aller instantanément à l'instruction d'index donné, à la manière de la
fonction "goto" en langage assembleur.
Résultat !

Conteneurisation et Déploiement
Si j'ai commencé à développer le backend et le frontend séparément grâce à mon IDE, la procédure s'est rapidement complexifiée. Aussi, avec la montée en envergure du projet, la montée en difficulté de la maintenance du script Bash de lancement de l'application. La conteneurisation s'est donc rapidement imposée comme une étape cruciale :
- Docker : Chaque service de l’application (front-end Vue.js, back-end Flask, Redis) a été encapsulé dans un conteneur distinct. Grâce à Docker Compose, j’ai pu coordonner l’orchestration des conteneurs et assurer une communication stable entre eux. Cela simplifie non seulement le déploiement en production, mais garantit également une portabilité du projet sur différentes plateformes.
- Portainer : Pour déployer l'application, nous avons sollicité un nom de domaine : https://bathycam.dt.insu.cnrs.fr/Accessible uniquement via VPN privé, sur lequel, après quelques modifications de la configuration du web server Nginx, j'ai pu déployer l'application grâce à Portainer, un outil de gestion de conteneurs Docker. Cela nous a permis de déployer l'application en production de manière sécurisée et de gérer les conteneurs de manière centralisée.
- Gitlab et SonarQube : Pour assurer la qualité du code et la sécurité de l'application, mon maître de stage a intégré SonarQube via la pipeline de déploiement Gitlab. Chaque push sur la branche principale déclenche une analyse du code, dont l'objectif est de vérifier la qualité du code et d'identifier les éventuels bugs, failles de sécurité ou mauvaises pratiques. Cette procédure permet de garantir un code propre et sécurisé tout en minimisant la dette technique.

Académique | Compétences travaillées
Dans le cadre de ma formation BUT, nous avons plusieurs objectifs d'apprentissage. Appelées « Compétences », elles sont au nombre de 6 et sont acquises progressivement durant les 3 années de notre formation. Celles-ci sont définies en tête de mon portfolio, mais je souhaite ici plus particulièrement en mettre deux en avant.
Compétence 1 : Réaliser un développement d'application
Développer des applications informatiques simples
- AC2 - Elaborer des conceptions simples : Si au final, le projet BathyCam est complexe, il est néanmoins basé sur un nombre de fonctionnalités simples, tel que le tchat en direct, ou l'envoi des commandes.
- AC3 - Faire des essais et évaluer leurs résultats en regard des spécifications : Lors de la phase de conception, j'ai commencé par réaliser des maquettes de l'interface, puis des prototypes fonctionnels. Ces prototypes m'ont permis de valider le projet d'un point de vue esthétique et technique.
- AC4 - Développer des interfaces utilisateur : L'interface utilisateur étant le cœur du projet, il est évident que j'y ai consacré une grande partie de mon temps. J'ai veillé à ce que l'interface soit intuitive, ergonomique et esthétique.
Partir des exigences et aller jusqu'à une application complète
- AC1 - Elaborer et implémenter les spécifications fonctionnelles et non-fonctionnelles : Si le cahier des charges était déjà établi, il était toutefois relativement sommaire. Pour répondre pleinement aux besoins des chercheurs, j'ai donc dû définir des spécifications fonctionnelles complémentaires, comme l'enregistrement et le stockage des vidéos, mais aussi des spécifications non-fonctionnelles, tel que la fluidité et la rapidité du flux vidéo. A 10 images par seconde par exemple, nous n'avons que 100ms pour traiter l'image, la compresser, l'envoyer au client, l'enregistrer et potentiellement l'analyser, ce qui représente un vrai défi technique.
-
AC2 - Adopter de bonnes pratiques d'accessibilité et d'ergonomie : L'ergonomie
n'est pas forcément l'objectif premier de mon travail, mais elle est néanmoins un point
important. J'ai donc veillé à ce que l'interface soit intuitive, et équipée de fonctionnalitées
en facilitant son utilisation.
En voici trois exemples : a. le tchat en direct défile automatiquement sous certaines conditionsSi le tchat est plus grand que la fenêtre, et si l'utilisateur est déjà "scrollé" en bas, avec pour objectif de ne pas perturber la lecture des messages précédents, b. après avoir choisi un nom d'utilisateur, le "focus" passe directement au champ de message, c. il est possible de changer de pseudo, etc. En plus de cela, j'ai veillé à ce chaque action soit accompagnée d'un retour visuel, par exemple, lors du téléchargement de fichiers, un cercle de chargement indique la prise en compte de la requête. - AC3 - Adopter de bonnes pratiques de conception et de programmation : J'ai veillé à ce que le code soit propre, bien structuré et commenté quand nécessaire. J'ai également utilisé des outils de versionning, comme Git, pour suivre l'évolution du code et permettre un suivi avec SonarQube, qui se charge de me notifier de tout éventuel manquement aux bonnes pratiques de la programmation.
Compétence 6 : Collaborer au sein d'une équipe informatique
Identifier ses aptitudes pour travailler dans une équipe
- AC1 - Appréhender l'écosystème numérique : Travailler au sein de la DT-INSU m'a permis de découvrir un nouvel écosystème numérique, avec ses propres outils, tel que Gitlab, Mattermost, HumHub mais aussi Portainer, Docker, SonarQube, etc.
- AC4 - Acquérir les compétences interpersonnelles : Ayant principalement travaillé en solo sur le projet BathyCam, j'ai tout de même eu l'occasion de collaborer avec mon maître de stage sur le déploiement de l'application. Ce qui m'a permis de découvrir l'univers de la conteneurisation, du déploiement en production, et des pipelines de déploiement.
Situer son rôle et ses missions au sein d'une équipe informatique
- AC4 - Rendre compte de son activité professionnelle : Chaque semaine avec mon maître de stage, nous avions pour habitude de discuter de l'avancement du projet, des difficultés rencontrées et des solutions envisagées. Ces échanges m'ont également permis de prendre du recul sur mon travail, de le remettre en question et de l'améliorer. Ces échanges m'ont également permis de suggérer des améliorations, des nouvelles fonctionnalités, ou des modifications de l'interface.