← travaux
La modélisation 3D complète du casque en vue filaire grise : la coque, les deux lentilles et leurs molettes, la molette latérale et la sangle réglable.

● parcoursdéc. 2023 — juin 2024

Casque de réalité virtuelle infrarouge

rôle
Ingénieur logiciel et chef de projet (CDD)
entreprise
Data Science Experts, pour Lynred
lieu
Grenoble
outils
  • Python
  • OpenCV
  • Flask
  • Docker
  • Jetson Nano
  • React Native
  • ViroReact

Le contexte

Le laboratoire d'application de Lynred cherche de nouveaux usages, parfois ludiques, de l'infrarouge : faire découvrir la technologie au plus grand nombre et montrer à quel point ses capteurs s'intègrent facilement. Data Science Experts a collaboré avec Lynred sur ce projet à travers l'un de ses ingénieurs : moi, de décembre 2023 à juin 2024.

L'objectif : un casque de réalité virtuelle qui montre le monde en thermique, en temps réel. La contrainte principale est la latence : le moindre décalage entre le mouvement de la tête et l'image provoque nausées et vertiges. L'expérience devait être aussi fluide qu'avec un casque VR du commerce.

L'architecture

Trois pièces : la caméra ATI320 de Lynred (320 × 240 pixels, 7 g sans sa coque, sans obturateur, donc capable de filmer en continu), une carte NVIDIA Jetson Nano pour le calcul, et un smartphone Android placé dans le casque pour l'affichage.

Infographie du fonctionnement général : la caméra ATI320 envoie son flux à la Jetson Nano ; au démarrage, la carte lance un conteneur Docker qui contient l'API Flask et les librairies Python de traitement d'image ; le smartphone Android récupère les images par requêtes GET et envoie ses réglages par requêtes POST.
Le fonctionnement général du module VR, tiré de mon rapport technique.

Dès qu'on l'alimente, la Jetson ouvre une connexion USB tethering avec le téléphone : la carte n'a ni Wi-Fi ni Bluetooth, et ce lien local isolé change d'adresse IP à chaque connexion. Un conteneur Docker démarre alors un serveur Flask multithreadé : l'application récupère les images par requêtes GET et envoie ses réglages par POST. Une première piste, l'Android Debug Bridge (ADB), a été abandonnée : elle ne tenait pas le temps réel.

Le traitement d'image

Les images arrivent en continu par le SDK de Lynred et sont traitées avec OpenCV. La correction s'appuyait d'abord sur une chaîne maison ; pour gagner en vitesse, elle repose désormais sur la correction shutterless intégrée à la caméra. Une palette de couleurs est ensuite appliquée (en niveaux de gris par défaut, modifiable depuis l'application).

Schéma de l'intégration en réalité virtuelle : l'image infrarouge de 320 × 240 est copiée et découpée de 40 pixels pour former un œil gauche et un œil droit de 280 × 240, fusionnés en 560 × 240 et envoyés au smartphone ; la détection d'humains MobileNetV2 s'insère avant, si elle est activée.
De la caméra au téléphone : l'intégration en réalité virtuelle de l'ATI320.

Avec une seule caméra, pas de vraie vision en relief : j'ai mis au point une fausse stéréoscopie. L'image est dupliquée, chaque copie est recadrée de 40 pixels d'un côté opposé, puis les deux vues sont mises côte à côte, ce qui suffit à donner une impression de profondeur dans le casque.

En option, une détection d'humains encadre les personnes dans l'image : un modèle MobileNetV2 entraîné sur des piétons en infrarouge, exécuté par le module DetectNet de jetson-inference, optimisé pour la carte. Pour garder la fluidité, la détection tourne une image sur cinq, et les boîtes sont réutilisées entre deux.

L'application mobile

L'application est écrite en React Native. Après un premier prototype en 2D, elle a été repensée en 3D avec ViroReact : une fois le téléphone dans le casque, l'écran tactile est inaccessible, alors tout se pilote avec la tête, grâce au gyroscope et à un réticule qui survole et sélectionne les éléments.

Capture du smartphone en mode VR : deux vues côte à côte d'un espace 3D quadrillé, avec le logo Lynred, le slogan « Observe the world in infrared » et les boutons Start, Settings et Quit.
L'écran d'accueil de l'application, dans son espace de réalité virtuelle.

Elle retrouve seule la Jetson en scannant le réseau local, accueille l'utilisateur dans un espace 3D avec des vidéos d'applications industrielles de l'infrarouge, affiche le flux en stéréo, et propose des réglages appliqués en direct sur la carte : écart entre les deux images, palette de couleurs, détection d'humains, calibration de la caméra.

Un second écran pour les salons

Pour les démonstrations, une page HTML servie par Flask affiche le flux infrarouge sur un grand écran branché à la Jetson, en même temps que le casque, ou seule si aucun téléphone n'est connecté. Un script détecte l'écran au démarrage puis vérifie régulièrement sa présence.

La page web du second écran : un bandeau « ATI320, 320 × 240, 12 µm », la photo de la caméra, un texte de présentation et le flux infrarouge en stéréo d'une personne assise à son bureau.
Le flux infrarouge sur la page du second écran.

Le casque, avec trois étudiants

En parallèle, j'ai été chef de projet de trois étudiants de l'ENSE3 (Grenoble INP), Louis-Stéphane Assi, Jocelyn Ribes et Louis Métay-Peault, chargés de la conception mécanique. Le cahier des charges : résister à une chute, protéger la caméra, tenir environ quatre heures sur une batterie interchangeable, et s'adapter à chaque visage.

Diapositive « Cahier des charges » : un modèle 3D du casque et trois exigences numérotées, résistance aux chutes, ergonomie et adaptabilité, autonomie de quatre heures.
Le cahier des charges, tiré de la revue de projet des étudiants.

Partis d'un casque open source adapté sous SolidWorks, ils ont dessiné une coque ventilée pour la caméra, fixée par des équerres, et un support pour la batterie et la carte.

Modèles 3D de la coque de la caméra, un cube percé et ventilé, et de son équerre de fixation.
La coque ventilée de la caméra et son équerre.
Modèle 3D du support de la batterie et de la carte, un boîtier ajouré.
Le support de la batterie et de la Jetson.

Les composants pesant 702 g, quand un casque complet du commerce en pèse environ 600, des essais portés ont départagé trois emplacements pour le bloc batterie et carte (447 g) : dessus, côté ou arrière. Le dessus l'a emporté, pour la répartition du poids et des câbles.

Diapositive « Organisation des composants » : le modèle du support et un tableau des avantages et inconvénients des positions dessus, côté et arrière, concluant à la validation du dessus du casque.
Les tests de position du bloc batterie et carte.
Le casque de profil : la façade rouge qui reçoit le téléphone, la coque blanche et le masque vert, avec une molette blanche de réglage.
Le prototype imprimé en 3D, de profil.
La façade rouge vue de l'intérieur : le logement du téléphone, avec ses vis et ses clips de maintien.
La façade qui reçoit le téléphone.

Les pièces ont été imprimées en ABS et en HIPS sur des imprimantes Zortrax. L'impression a été la grande difficulté du projet : manque de précision, décollement du plateau, pièces cassées et réimprimées jusqu'à trois fois, puis limées et percées à la main.

Diapositive « Difficultés liées à l'impression » : manque de précision, décollement du plateau, contact chaud-froid, avec un aperçu de pièces jaunes en cours de tranchage.
Les difficultés d'impression.

Côté autonomie, un script Python relevait la puissance et la température de la carte en direct : la batterie de 10 000 mAh a tenu 3 h 47, à puissance constante, à 55 °C en moyenne et 60 °C au plus, sous les 80 °C de fléchissement des matériaux.

Courbe de la puissance consommée en milliwatts sur toute la durée de l'essai : stable autour de 5 500 mW.
La puissance, stable sur toute la décharge.
Courbe de la température de la carte en degrés : elle monte vers 52 °C puis se stabilise vers 60 °C.
La température de la carte.

Le résultat

Un logiciel fonctionnel, qui affiche l'infrarouge dans le casque en temps réel avec une latence minimale, et un premier prototype mécanique complet. Le rapport technique remis en juin 2024 trace la suite : remplacer le téléphone par un écran dédié, passer à une vraie stéréoscopie avec deux caméras, ajouter des mini-jeux qui jouent avec la vision thermique, rendre le casque totalement autonome et mener des tests utilisateurs.