IMA5 2019/2020 P17
Sommaire
- 1 Présentation générale
- 2 Préparation du projet
- 3 Réalisation du Projet
- 4 Documents Rendus
Présentation générale
Sujet : Outil d'analyse de mouvements d'interaction
Etudiant : François Brassart
Encadrant : Laurent Grisoni
Description
L'équipe de recherche MINT souhaite réaliser une expérience engageante de l'utilisation de la réalité virtuelle dans la rééducation afin de répondre aux besoins des patients et de leurs thérapeutes. L'objectif est d'optimiser les protocoles de réadaptation, d'accélérer le rétablissement des patients et faciliter leu réintégration dans la vie quotidienne. Cette expérience s'adresse en particulier à la réadaptation des enfants touchés par des maladies chroniques ainsi qu'aux adultes frappés de fatigue et de douleur. Le patient portera un casque de réalité virtuelle et pourra jouer à un jeu, choisi par le médecin via son téléphone. Durant le jeu et à la fin, le thérapeute aura accès à un enregistrements et une analyse des mouvements du joueur sur son téléphone.
Objectifs
Mon projet se concentre sur la partie récupération et transmission des mouvements du joueur.L'objectif est de concevoir un système qui comporte un module d'enregistrement des gestes d'interaction. Une réflexion sera menée sur la manière optimale d'envoyer et de stocker les données utiles à la description des capacités et de la fatigue des participants. En fonction de mon avancement, il sera possible d'élaborer un modèle de fatigue gestuelle en traitant et en analysant les données récoltées. Des réunions avec des médecins peuvent être organisées pour retranscrire une analyse optimale.
Préparation du projet
Cahier des charges
Le médecin doit pouvoir avoir accès, via une interface web, à un enregistrement des mouvements d'interaction du patient qui a joué avec le casque de réalité virtuelle. Les mouvements d'interactions comprennent la position et l'orientation du joueur dans l'espace à minima, et si possible les mouvements des manettes. Il est important de choisir un mode de stockage des enregistrements optimal : il faut que chaque enregistrement soit associé au jeu, niveau de difficulté, date et durée de la session...
Choix techniques : matériel et logiciel
Le matériel a déja été choisi par l'équipe. Il s'agit notamment d'un casque de réalité virtuelle Occulus Quest et d'une RaspberryPi. Le jeu VR a été créé avec le logiciel Unity.
Liste des tâches à effectuer
- Déterminer comment récuperer les mouvements à partir du jeu et du casque de Réalité Virtuelle.
- Envoyer ces données sur la raspberry avec un mode de "stockage" adapté (pistes : XML? JSON?)
- Rendre disponibles ces informations sur un serveur Web pour que le medecin puisse y avoir accès
En fonction de mon avancement :
- Déterminer avec les médecins des analyses de mouvements pertinentes
- automatiser ces analyses
Calendrier prévisionnel
Etant parti en semestre à l'étranger, je dispose de 7 semaines pour réaliser ce projet (du 6 au 23 février 2020).
Feuille d'heures
Tâche - Heures | Prélude | S1 | S2 | S3 | S4 | S5 | S6 | S7 | Total |
---|---|---|---|---|---|---|---|---|---|
Autoformation | 1h | 5h | 6h | ||||||
Documentation | 10h | 10h | |||||||
Réunion avec encadrant | 2h | 2h | |||||||
Remplissage du wiki | 1h | 2h | 3h | ||||||
Rédaction du rapport | |||||||||
Préparation de la soutenance | |||||||||
Total | 2h | 19h | 18h |
Réalisation du Projet
Prélude : 1-5 Janvier
Wiki
Création du Wiki et de son squelette, rédaction de la partie "description" du projet.
Unity
Installation et prise en main du logiciel Unity. Unity est un moteur de jeu très répandu. Il permet de développer des jeux 2D, 3D et RV. Il permet de créer des jeux multi-plateformes en C# (ou en Javascript mais le C# est utilisé lors de ce projet).
Recherche de tutos qui seraient utiles pour l'utilisation de ce logiciel dans le cadre de mon projet.
Liens utiles : Liste tutos Unity Tuto Unity Cours en ligne Unity VR HTC Vive HTC Vive Tuto
Semaine 1 : 6-12 Janvier
En attendant de rencontrer M. Grisoni pour préciser le cahier des charges, je me forme sur le logiciel Unity.
Tuto1 : Roll a ball
Notes sur ce tuto : Le C# est utilisé pour réaliser des scripts permettant le mouvement et l'interaction des objets du jeu avec l'utilisateur.
Tuto2 : VR Unity
Tuto3 : VR Unity : Dans scripts pour détécter mouvement : Input.GetAxis("Horizontal"); ou Input.GetAxis("Vertical");
Rencontre avec M. Grisoni et son équipe
J'ai rencontré M. Grisoni à l'IRCICA pour fixer le cahier des charges de mon projet. Il s'avère que depuis la proposition du sujet et mon retour de l'étranger, l'équipe de recherche a avancé sur le projet. Ainsi, des petites modifications du sujet initial [1] ont été réalisées. L'équipe dispose maintenant d'un prototype de jeu fonctionnel. Il s'agit d'un jeu en 2D (Tetris par exemple) qui se commande via des boutons en 3D. L'objectif est que le patient appuie correctement sur les bons boutons qui sont situés dans l'espace à des endroits difficiles d'accès en fonction de sa pathologie (à droite s'il a des difficultés de motricité du bras droit par exemple).
Le jeu a été créé sur Unity et il est exécuté sur une RaspberryPi. La RaspberryPi est configurée avec plusieurs serveurs. Le premier envoie les images du jeu au casque de réalité virtuelle. Le second reçoit les boutons qui ont été appuyés par l'utilisateur provenant du casque. Il fait également le lien avec une interface web qui permet d'avoir un mode collaboratif (multijoueur) : le 1er joueur joue avec le casque et le second interagit avec lui depuis son smartphone.
Le 3e ???? offre une interface web au medecin qui peut ainsi choisir le jeu, la difficulté... ???????
Dans la version actuelle, le médecin n'a aucun retour sur les performances du patient. On souhaite donc lui donner accès à un enregistrement des mouvements du joueur dans un premier temps. Ainsi, le médecin aura accès à ces enregistrements depuis une interface web. Cela permettra d'avoir une version "bêta" à présenter à des medecins. Si le temps me le permet, je pourrais être en contact avec eux pour comprendre quelles informations et analyses des mouvements ils ont besoin. On enverra donc sur l'interface web non plus un enregistrement des mouvements mais une analyse des performances du patient (nombre de tentatives pour appuyer sur un bouton par exemple).
Je peux me rendre à l'IRCICA pour avoir accès à un casque de réalité virtuelle et travailler avec l'équipe quand je le souhaite. On m'a accordé l'accès au Git du projet, hébergé sur le GitLab de Cristal.
Etude du code
Une fois que j'ai eu accès au Git, j'ai commencé par essayer de comprendre le code déja réalisé et ainsi avoir un aperçu global de ce qui a été réalisé et comment cela a été fait. J'ai également préparé mon "environnement de travail" en installant une machine virtuelle linux sur mon ordinateur, installant Unity sur cette MV et en clonant les dépôts git. Le projet comprends 2 dépots git : Unity-asset et serverpi.
Rappel Git :
Pour éviter les erreurs de git, deux branches "monitoring" ont été créées sur les projets.
Récupération des dossiers git :
git clone ... git checkout monitoring #switcher vers la branche monitoring
Attention à pusher mon travail au bon endroit :
git branch #vérifier la branche actuelle git push origin monitoring #pusher sur la branche monitoring
Documentation sur l'Oculus Quest
L'Oculus Quest est un casque de réalité virtuelle entièrement autonome avec 2 manettes à six degrés de liberté et fonctionne sur un système Qualcomm Snapdragon 835 sur puce. L'OS utilisé est android 7.1.1.
Les applications qui peuvent être installées sur ce casque VR sont au format apk, le même format que les applications Android. Ainsi, je peux travailler sur la partie envoi des données vers le Raspberry sans le casque, en installant un apk sur mon téléphone.
Formation sur C# et framework .NET
Sur unity, les scripts sont rédigés en C#. J'ai donc décidé en ce début de projet d'apprendre les bases du C# et du framewrok .NET. Cela me servira probablement dans mes futures expériences professionnelles. [2]
Projet Unity
La scène créée dans Unity, visible dans le casque de RV consiste en une pièce 3D, un écran sur lequel est affiché le jeu 2D (Tetris par exemple) et une grande manette avec des boutons sur lesquels il faut appuyer pour interagir avec le jeu. Le jeu en 2D est exécuté sur la RaspberryPi. Le flux vidéo est envoyé sur le casque RV. Les boutons appuyés sont envoyés sur la RapsberryPi. J'explore les différents scripts afin de comprendre comment l'appui des boutons est détecté.
Json.Net for Unity ??
Recuperation des mouvements des manettes
Position de la manette
OVRInput.GetLocalControllerPosition(OVRInput.Controller.RTouch)
retourne un vecteur (classe Vector3).
Angle de la manette
OVRInput.GetLocalControllerRotation (OVRInput.Controller.RTouch)
retourne un quaternion.
OVRInput.Controller.RTouch designe la manette droite et OVRInput.Controller.LTouch désigne la manette gauche. Attention, ces positions seraient relatives à la position d'origine. Thread demandant script qui crée un objet a position de la manette
Ces fonctions seront à tester.
Semaine 2 : 13-19 Janvier
Je commence cette 2e semaine de projet en élaborant une première version d'un script qui me permettrait de récuperer les mouvements de l'utilisateur. Ainsi, mon script est une classe qui dérive de la clase de base MonoBehaviour. En effet, d'après la documentation Unity [3], "MonoBehaviour is the base class from which every Unity script derives."
Dans la version du jeu actuelle, la manière de détecter qu'un bouton est appuyé par l'utilisateur grace à une manette fonctionne grâce à un système de collision. En effet, Unity permet de détecter quand 2 objets entrent en collision, dans le cas présent une manette et un bouton. Etant donné que je souhaite mapper tous les mouvemements des manettes, cet aspect de collision ne m'est pas utile, à moins de créer des objets invisibles dans tout l'espace 3D, de détecter la collision avec une manette et envoyer la position de l'objet. Ce n'est pas une solution la plus optimale.
Grace aux fonctions GetLocalControllerPosition et GetLocalControllerRotation, je peux récuperer les positions et rotation des manettes. Je vais d'abord vérifier que ces dernières soient connectées : IsControllerConnected() or GetActiveController().
Récupération de la position du casque
OVRCameraRig.centerEyeAnchor ( ) Always coincides with average of the left and right eye poses.
position = overCameraRig.centerEyeAnchor.position;
a tester, pour voir ce que cela renvoie. Je dois également voir tous l'intervalle de temps entre lequel je récupère la position.
Réunion avec l'équipe
Mardi 14 janvier à 14h, l'équipe organise un "Whiteboard and Cookies" autour du projet. L'idée est d'avoir une discutions libre autour d'un sujet. Le sujet de la semaine sera porté sur les différents scénarios que l'on pourrait mettre en place pour le projet ainsi que des techniques de monitoring qu'on pourrait mettre en place.