IMA5 2019/2020 P17

De Wiki de Projets IMA
Révision datée du 13 janvier 2020 à 14:27 par Fbrassar (discussion | contributions) (Feuille d'heures)


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.

OculusQuest.jpg


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é.

ScreenUnityfbrassar.png


Json.Net for Unity ??


Recuperation des mouvements des manettes

https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/#oculus-touch-tracking

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 GetLocalPosition et GetLocalRotation, 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().

Semaine 3 : 20-26 Janvier

Semaine 4: 27 Janvier - 2 Février

Semaine 5 : 3-9 Février

Semaine 6 : 10-16 Février

Semaine 7 : 17-23 Février (Soutenance)

Documents Rendus