Rapport de projet

Transcription

Rapport de projet
Rapport Final - Intéractions 2D/3D à base de
gestes en utilisant la Wiimote
Enes de Carvalho Miguel
Al Hossri Laurent
Augereau Julien
Lahaye Fabien
7 avril 2009
Chargé de TD : Marchand Sylvain
Clients : Levet Florian & Schlick Christophe
Université Bordeaux 1
Projet de Programmation 2008-2009
1
Table des matières
Introduction au domaine
5
1 Les débuts de la Motion Capture
5
2 L’arrivée de la console Wii
6
3 Démocratisation de la Wiimote
8
Descriptif du projet
10
Inventaire de l’existant
11
1 Les bibliothèques et scripts existants
11
2 Les
2.1
2.2
2.3
logiciels fournis par
Logiciel 2D . . . . .
Logiciel 3D . . . . .
Bibliothèque Wiigee
les clients
12
. . . . . . . . . . . . . . . . . . . . . . . 12
. . . . . . . . . . . . . . . . . . . . . . . 13
. . . . . . . . . . . . . . . . . . . . . . . 14
Etude des besoins
16
1 Besoins Fonctionnels
1.1 Fonctionnalités du logiciel 2D . . . . . . . . . . . . . . . . . .
1.2 Fonctionnalités du logiciel 3D . . . . . . . . . . . . . . . . . .
1.3 Fonctionnalités communes . . . . . . . . . . . . . . . . . . . .
16
16
16
18
2 Besoins Non Fonctionnels
19
Architecture du projet
21
1 Communications Bluetooth
21
2 Controleurs
21
2.1 Souris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Wiimote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2
3 Listeners et Events
3.1 Interface matérielle . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Reconnaissance de gestes . . . . . . . . . . . . . . . . . . . . .
3.3 Programme final . . . . . . . . . . . . . . . . . . . . . . . . .
23
23
24
24
Travail Réalisé et Problèmes Rencontrés
25
1 Travail préliminaire
25
2 Interfaçage et Utilisation des Controlleurs
26
3 Mise en place du module de Reconnaissance de Gestes
27
4 Modification du logiciel Wii2D
28
4.1 ControllerListener et gestureListener . . . . . . . . . . . . . . 28
4.2 Graphisme et fonctionnalités . . . . . . . . . . . . . . . . . . . 29
5 Modification du logiciel Wii3D
29
5.1 ControllerListener et gestureListener . . . . . . . . . . . . . . 29
5.2 Graphisme et fonctionnalités . . . . . . . . . . . . . . . . . . . 30
Installation et Fonctionnement
31
1 Installation et Matériel
31
1.1 Matériel et drivers . . . . . . . . . . . . . . . . . . . . . . . . 31
1.2 Interface graphique . . . . . . . . . . . . . . . . . . . . . . . . 31
2 Utilisation du logiciel
32
2.1 Interface de Wii2D/Wii3D . . . . . . . . . . . . . . . . . . . . 32
2.2 Utilisation des périphériques . . . . . . . . . . . . . . . . . . . 32
2.3 Interface d’apprentissage . . . . . . . . . . . . . . . . . . . . . 33
Définition et Réalisation des tests
34
1 Test de la fonction Curseur
et du déplacement
34
Test de la fonction Curseur . . . . . . . . . . . . . . . . . . . . . . 34
2 Test des logiciels
35
Test de la fonction Curseur . . . . . . . . . . . . . . . . . . . . . . 35
3
Améliorations et réutilisations possibles
38
Améliorations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Réutilisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Conclusion
40
Bibliographie
41
Annexes
43
4
Introduction au domaine
L’étude des interfaces proposées à l’homme dans le domaine informatique
a toujours donné lieu à de nombreuses expérimentations. Les utilisateurs
d’ordinateurs sont aujourd’hui habitués à l’utilisation du “classique” couple
clavier/souris, et ce dans tous les domaines impliquant l’informatique, alors
même que de nombreux autres périphériques de contrôle, plus adaptés à des
utilisations spécifiques, existent.
Beaucoup d’innovations dans le domaine de l’interfaçage homme/machine
ont été découvertes et développées dans le cadre d’expérimentations liées à la
réalité virtuelle. En effet, ce domaine requiert une interaction forte, immersive
et instinctive avec l’utilisateur, caractéristiques recherchées également dans le
contrôle de toute application informatique. Lors de l’apparition de la notion
de réalité virtuelle furent créés plusieurs périphériques, comme par exemple
l’Ultimate Display, tout premier casque capable de reproduire, dans une simulation informatique, les mouvements de la tête du porteur. Mais ce qui fut
un véritable moteur pour ces développements est sans doute l’utilisation par
la NASA dans son programme VIVED du concept de réalité virtuelle et le
développement d’un casque affichant, en fonction des mouvements du porteur, un environnement virtuel pour l’entraı̂nement aux missions spatiales.
1
Les débuts de la Motion Capture
La motion capture fit son apparition au début des années 80, révolutionnant la reconnaissance de mouvements. Cette technique, se résumant dans
un premier temps à la fixation de potentiomètres sur le corps du sujet afin
de mesurer les angles de flexion des articulations, va ensuite évoluer pour
faire intervenir un système de diodes réflexives dont la position est triangulée par une série de caméras permettant ainsi un rendu en 3D sur ordinateur des mouvements de l’individu. Par la suite, d’autres techniques seront
développées comme par exemple des gants permettant la capture des mouvements des doigts pour permettre de jouer virtuellement de la musique.
De nos jours, ces périphériques ont évolué et la capture de mouvement
est plus précise, les outils moins invasifs et surtout leur coût a été réduit. On
trouve principalement deux types d’outils : ceux impliquant une acquisition
d’ordre visuel (techniques optiques) et ceux impliquant des capteurs sur l’individu (techniques mécaniques).
5
Les techniques optiques sont caractérisées par la présence d’une ou plusieurs caméras ou capteurs qui vont permettre de reconnaitre la position
de marqueurs sur le sujet. Ces derniers peuvent être passifs, réfléchissant la
lumière rouge ou infrarouge émise par des caméras sensibles à ce seul type
de rayonnement, ou actifs, émettant eux même un rayonnement capté par les
caméras ou cellules photosensibles, cette téchnique permettant d’éviter tout
problème de parallaxe lié à l’utilisation d’une lentille. Dans les deux cas, les
données des différentes caméras/cellules (au moins 2), sont combinées afin
de déterminer les coordonnées dans l’espace de chacun des marqueurs qui
seront exploitées par l’utilisateur dans la procédure de reconnaissance de
mouvements.
Les techniques mécaniques fonctionnent, quant à elles, grâce à une série
de capteurs. Dans le cadre de captures mécaniques, l’individu dispose d’un
exosquelette sur lequel se trouve, à chaque articulation, un capteur angulaire
dont les données sont ensuite exploitées par un ordinateur. Pour des captures
magnétiques, un champ est émis en un point fixe et des capteurs sont placés
aux points stratégiques du corps du sujet sous forme de bobines de fil qui,
créant des perturbations dans ce champ, peuvent être localisées par une série
de calculs. Il s’agit cette fois-ci, plutôt d’une capture de mouvement que de
position, les outils ne permettant pas la récupération de données précises
quand à la position dans l’espace des capteurs.
La plupart des techniques énoncées ci-dessus ont trouvé des applications
dans de nombreux domaines : de la création de films ou de jeux vidéos dans
laquelle on capture les mouvements d’un acteur afin de générer des personnages en 3D aux gestes réalistes, à l’archéologie, où la reconstitution virtuelle
de vestiges est facilitée par la simplicité de manipulation des outils. Ces techniques ont toutes pour principal avantage la retranscription en temps réel du
mouvement et ce, de manière extrêmement réaliste, mais leur intégration dans
un projet nécessite un financement conséquent de par le coût du matériel et
des logiciels, empêchant jusqu’ici leur démocratisation et leur utilisation dans
des travaux de petite envergure.
2
L’arrivée de la console Wii
La miniaturisation des composants et la production en chaı̂ne de ceux-ci
a cependant, aujourd’hui, changé la donne. En effet, depuis 2006 est apparue
6
la console Wii de Nintendo et sa manette de jeux particulière : la Wiimote.
Ce périphérique a été conçu de manière à procurer au joueur une sensation
d’immersion dans le jeu en offrant une expérience de mimétisme gestuel par
des mécanismes de reconnaissance de mouvements et de détection dans l’espace. De la simulation de bowling, au jeu de tir, la Wiimote et la Wii ont
conquis les joueurs et la console est aujourd’hui installée dans de nombreux
foyers. Etonnament, bien que propriétaire, la wiimote est utilisatrice de standards informatiques et matériels et exempte de tout cryptage ou protection :
technologie Bluetooth pour la transmission des données à la console, caméra
infrarouge pour la détection dans l’espace et accéléromètre standard pour la
détection de mouvements, permettant d’envisager une alternative accessible
et bon marché aux solutions industrielles existantes.
La wiimote comporte un accéléromètre, sensible sur 3 axes (Voir Figure
1), qui va être au coeur de la reconnaissance de mouvements. Son fonctionnement est simple : une masse flottante va se déplacer et exercer une pression
plus ou moins forte sur les parois de l’accéléromètre qui sont équipées de capteurs de pression : si la pression est forte vers le bas, la Wiimote a effectué un
mouvement vers le haut par exemple. Ces données vont permettre d’obtenir
des valeurs d’accélération dans les trois dimensions en fonction du temps, qui
seront ensuite exploitées pour reconnaitre un mouvement.
La caméra infrarouge de la wiimote permet, quant à elle, la reconnaissance de la position de la wiimote par rapport à l’écran (équipé alors d’une
sensor bar, dispositif électronique émettant deux points distants en lumière
infrarouge). La caméra, si elle est orientée vers l’écran, capte deux points de
lumière qui vont lui permettre de déterminer l’éloignement de la manette en
fonction de la taille des points (plus la manette est proche, plus les points
seront grands), l’inclinaison de la manette avec l’alignement des deux points
(si les deux points forment une ligne horizontale, la Wiimote est à plat, si la
ligne est verticale, elle est sur le côté) et l’endroit visé par l’utilisateur sur
l’écran avec la position de ces points, cette dernière information permettant
principalement la projection d’un curseur sur l’écran et l’interaction avec les
éléments de l’application comme on le ferait avec une souris.
L’ensemble de ces données, ajoutées à celles de périphériques supplémentaires pouvant être connecté en dessous de la wiimote (nunchuck, instrument
de musique, manette classique, ...), est ensuite transmis en Bluetooth à la
console qui les interprète en temps réel. La technologie Bluetooth, principalement utilisée par les téléphones mobiles, permet la transmission radio de
données sans fil avec un débit d’environ 1Mbit/s et fonctionne par connexion
7
Fig. 1 – Caractéristiques de la Wiimote
ponctuelle pour l’envoi de données (envoi d’images entre téléphones par exemple) ou via une connexion constante, nommée apairage, pouvant être ou
non sécurisée (la Wiimote utilise un apairage non sécurisé).
3
Démocratisation de la Wiimote
L’ensemble de ces technologies rend l’utilisation détournée de la Wiimote
des plus simples, et il n’a pas fallu longtemps pour que des amateurs décident
de s’intéresser à l’utilisation de cette manette sur des ordinateurs. De nombreuses expériences ont été effectuées et aujourd’hui, des bibliothèques sont
trouvables dans de nombreux langages de programmation pour permettre
d’utiliser la wiimote comme contrôleur principal d’applications diverses. Le
faible coût du périphérique, induit par une production à grande échelle, et sa
capacité à se substituer efficacement à tout autre contrôleur (souris, tablette
graphique, ...) permet d’envisager un nombre impressionnant d’applications.
Des individus tel Johny Chung Lee, docteur en informatique dans le domaine
des interactions Homme/Machine, a réalisé de nombreuses expériences utilisant les composants bon marché de la wiimote : du contrôle d’une interface
“du bout des doigts” grâce à la caméra infrarouge, à la sensor bar et à
8
des marqueurs réfléchissants sur ses doigts, à la réalisation d’une application
prenant en compte les mouvements de l’individu en temps réel pour générer,
sur un écran normal, un environnement perçu comme holographique par le
sujet.
9
Descriptif du projet
Comme on a pu le voir, le périphérique Wiimote est bien plus qu’une
manette de jeu et s’avère particulièrement adapté à une utilisation dans le
domaine du traitement d’images. Nos clients souhaitent pouvoir, à l’aide de
la Wiimote, effectuer des opérations au sein de deux logiciels, l’un dédié au
traitement de multiples vignettes 2D, l’autre à la manipulation d’objets 3D.
Ces logiciels sont déstinés à la manipulation d’images médicales.
Le projet sera ainsi divisé en deux parties ayant pour noyau commun
l’implémentation d’un dispositif d’apprentissage des mouvements et de reconnaissance de ceux-ci. Les clients nous fournissent deux exemplaires simplifiés
de ses logiciels codés en Java. Nous devrons modifier ceux-ci afin de rendre
visuellement compte des opérations commandées par les mouvements et proposer une interface graphique adaptée au périphérique (sélection aisée, menus
déroulants, ...). La Wiimote sera donc à la fois utilisée en remplacement de
la souris grâce aux données de sa caméra infrarouge et en périphérique de
reconnaissance de mouvements grâce à son accéléromètre.
Le logiciel 2D présente un espace de travail où sont disposées des vignettes
d’images. La Wiimote sera utilisée pour interagir avec ces vignettes, permettant de réaliser des glisser/déposer, des sélections, et des opérations sur les
images sélectionnées via des gestes (la capture de ceux-ci étant conditionnée
par l’appui sur l’un des boutons de la manette).
Le logiciel 3D présente une sphère avec laquelle il sera nécessaire d’intéragir
au moyen de la Wiimote. Nous pensons mettre en place un déplacement de la
caméra selon les mouvements de la Wiimote ou, si nous en avons le temps, via
un nunchuk relié à la Wiimote. Les interactions proposées par les clients (extrusion, coupe) impliquent la prise en compte du capteur infrarouge uniquement.
Les clients demandent que notre projet permette l’interfaçage, avant la
phase de reconnaissance de mouvements, d’un autre type de périphérique que
la Wiimote, par exemple une tablette graphique, via l’implémentation d’une
classe héritée.
10
Inventaire de l’existant
Dans le cadre de notre projet, l’existant est particulièrement important.
En effet, la Wiimote étant propriétaire et Nintendo ne fournissant, en dehors
des développeurs de jeux, aucune documentation ou information sur l’utilisation et le fonctionnement de la manette, notre seule source d’information
pour le développement se situe dans les documents réalisés par les communautés existantes autours du sujet, en particulier sur le web. Nous aurons
également à analyser en détails les logiciels fournis par les clients, la modification et l’interaction avec ceux-ci constituant la majeure partie de notre
projet.
1
Les bibliothèques et scripts existants
De nombreuses bibliothèques, logiciels et scripts ont été développés par
des amateurs en se basant sur la lecture des trames reçues de la Wiimote
une fois celle-ci connectée au PC. Le plus utilisé de ces logiciels est sans
doute GlovePie, permettant de controler n’importe quel logiciel à partir de
périphériques divers : joystick, souris, périphérique MIDI ou Wiimote. Il propose un langage de script spécifique permettant beaucoup d’utilisations divertissantes mais ne permettant pas d’implémenter aisement la reconnaissance
de mouvements, et encore moins de l’intégrer sous forme de plugin à un programme existant.
Il existe également un certain nombre de bibliothèques dans des langages
variés mais, le logiciel des clients étant en Java, nous nous contenterons de
celles qui sont compatibles. La bibliothèque MoteJ nous propose de nombreuses classes et méthodes visant à simplifier la communication avec la
Wiimote (données infrarouge, gestion des vibrations et leds, données de
l’accéléromètre, ...). La bibliothèque WiiGee nous propose les mêmes fonctions de contrôle de la wiimote auxquelles s’ajoute un module d’apprentissage/reconnaissance de gestes. Notre choix se portera donc sur cette dernière
afin de nous simplifier la tâche.
11
2
Les logiciels fournis par les clients
2.1
Logiciel 2D
Les clients nous fournissent un logiciel 2D qui va nous servir de support de
travail. Celui-ci, simple partie du logiciel final des clients présente une fenêtre
contenant un certain nombre de carrés de couleur symbolisant des vignettes
d’images. Le but de notre projet sera de modifier ce logiciel afin d’y inclure
un plugin permettant la connexion à la Wiimote ou tout autre périphérique
dédié à la reconnaissance de gestes et d’implémenter une interface intuitive
adaptée. Le logiciel est un projet Java, dont les trois classes principales :
WiiMote2D, ImageIcon et GLRectangleEntity ont les rôles suivants :
– WiiMote2D : Il s’agit de la classe principale qui contient dans son
constructeur, les instructions relatives à la création de l’environnement
de travail (fênetre, composant GLCanvas pour gérer le dessin et utiliser
OpenGL). Un listener de type Renderer est également créé permettant
l’interraction avec les éléments OpenGL. La classe Renderer présente les
fonctions liées à la souris : MouseDragged, MousePressed ainsi qu’une
fonction d’interraction avec le clavier : KeyPressed et les methodes init,
display, reshape, drawScene nécessaires à OpenGL. L’appel au “main”
se termine ensuite par la création des vignettes représentées par des
objets ImageIcon.
– ImageIcon : Cette classe permet la création et la gestion des vignettes d’images sur lesquelles nous effectuerons les actions induites
par notre projet et la reconnaissance de gestes. L’objet comprend deux
champs, l’un correspondant au nom et l’autre, “rec”, contenant la forme
représentant la vignette.
– GLRectangleEntity : Il s’agit de la classe définissant la forme prise
par les vignettes. Les formes définies dans cette classe sont en 3D et
non en 2D de manière à gérer efficacement la profondeur des vignettes
sur le plan de travail.
12
Fig. 2 – Diagramme du logiciel client WiiMote2D
2.2
Logiciel 3D
Le logiciel 3D fournit par les clients présente un espace de travail OpenGL
dans lequel se situe une sphère. Un trackball logiciel nous permet de faire pivoter celle-ci autours de son centre de gravité. Comme pour le logiciel 2D, il
s’agit d’un projet Java qui présente, pour sa part, les classes principales :
WiiMote3D, Vec3d et Quaternion dont les rôles sont les suivants :
– WiiMote3D : Comme pour le logiciel 2D, il sagit de la classe principale qui a pour but de mettre en place l’environnement de travail.
– Quaternion : Cette classe contient les interactions possibles avec l’objet 3D en particulier l’implémentation de la méthode trackball.
– Vec3d : Cette classe gère la création et la manipulation de vecteurs
3D au sein de l’environnement OpenGL.
13
Fig. 3 – Diagramme du logiciel client WiiMote3D
2.3
Bibliothèque Wiigee
La bibliothèque WiiGee nous a semblé la plus adaptée à notre projet
par son intégration de mécanismes d’apprentissage/reconnaissance de gestes
nous offrant ainsi la possibilité de ne pas recoder ces fonctions mathématiques
complexes et nous permettant ainsi de nous concentrer sur les fonctionnalités
du logiciel. Cette bibliothèque se décompose en quatre packages qui sont :
– Device : sert de passerelle entre l’ordinateur et la Wiimote. En effet, on
trouve au sein de celui-ci deux classes : Wiimote et WiimoteStreamer.
– Wiimote : cette classe représente les fonctions basiques de la Wiimote. Son constructeur permet d’ajouter une nouvelle Wiimote au
sein de l’application en se basant sur l’adresse mac de celle-ci. On
trouve également toutes les fonctions nécessaires à l’interactions avec
la wiimote via la création d’un listener, addWiimoteListener, qui permet de détecter les mouvements simples et les actions de l’utilisateur
(pressions de boutons). S’ajoute à ce dernier un second listener, addGestureListener qui lui se charge de la reconnaissance de gestes
préalablement acquis. Pour finir, on trouve des fonctions permettant
de faire vibrer la Wiimote, d’allumer les leds de celle-ci ou encore des
accès plus techniques permettant de lire l’EPROM (Erasable Pro-
14
grammable Read Only Memory : rom de petite capacité effaçable et
programmable) de la console.
– WiimoteStreamer : Cette classe sert d’interprêteur aux commandes
émises par la Wiimote. En effet, après réception et traitement des
données les actions correspondantes sont effectuées : pour exemple,
lorsque le bouton A est pressé sur la Wiimote, celle-ci emet un signal capté par WiimoteStreamer qui l’interprete et lance la routine
associée. On retouve donc, en plus des actions pour les bouton (A,
B, home...), des actions suite à une nouvelle accélération détecté par
la Wiimote.
– Control : gère la recherche, la connexion et le controle des Wiimotes.
Pour ce faire, le package utilise deux classes : DeviceDiscovery et Wiigee.
– DeviceDiscovery : cette classe permet de découvrir les Wiimotes environnante au lancement de l’application. Une fois la découverte
achevée, l’association entre la Wiimote et l’ordinateur est effectuée.
Cette étape est soumise à de nombreux paramètres comme la version
du driver gérant le dongle Bluetooth ou encore la version de la pile
utilisée pour la communication entre le dongle et les applications.
– Wiigee : cette classe est la base de la bibliothèque. En effet, c’est elle
qui gère les différentes Wiimotes trouvées lors du balayage et définit
les listeners ou encore les bouton par défaut.
– Event : regroupe les classes correspondant aux évenements potentiel
de la Wiimote : l’appui sur un bouton, le relâchement d’un bouton, ou
encore la détection d’une nouvelle accélération.
– Logic : regroupe les classes liées aux opérations mathématiques de la
reconnaissance de mouvements.
– AccelerationStreamAnalyzer : cette classe analyse les évènements de
type WiimoteAccelerationEvent (classe du package Event gérant les
accélérations de la Wiimote) puis gère la création et le traitement
des modèles résultant du geste enregistré.
– Gesture : cette classe représente un geste et stocke les valeurs d’accélération correspondant à celui-ci en fonction du temps.
– HMM : Cette classe est une implémentation du Modèle caché de
Markov qui fournit les algorithmes utilisés pour l’entraı̂nement et la
reconnaissance de gestes.
15
Etude des besoins
Nous allons présenter dans ce rapport les besoins fonctionnels communiqués par nos clients ainsi que ceux, non-fonctionnels, résultant des obligations techniques induites par l’utilisation prévue des logiciels.
Les besoins fonctionnels se divisent en trois catégories : ceux spécifiques
au logiciel 2D, ceux du logiciel 3D et enfin, les besoins communs aux deux.
Par la suite, nous tenterons d’analyser les besoins non fonctionnels inhérents
au projet.
1
Besoins Fonctionnels
1.1
Fonctionnalités du logiciel 2D
Les besoins du logiciel 2D sont uniquement de l’ordre de la reconnaissance et de l’interprétation de gestes, le traitement des images devant être
géré ultérieurement par le logiciel des clients. Le rendu visuel des différentes
fonctionnalités devra être clair et ergonomique. Les actions gérées par notre
projet seront :
– Sélection/Déplacement d’images : possibilité de sélectionner / désélectionner / déplacer une ou plusieurs images à la fois grâce au curseur
de la Wiimote (Voir Figure 4). La sélection pourra être effectuée en
mode cadre ou de manière successive (maintiens de la touche SHIFT).
– Actions sur une image : il doit être possible via des actions du
contrôleur d’effectuer un traitement (négation par exemple) ou de supprimer une image sélectionnée.
– Actions sur plusieurs images : on doit pouvoir, pour plusieurs images sélectionnées, réaliser des actions groupées (suppression, traitements individuels) mais également des actions entre les images : addition, soustraction, multiplication, ... d’images (Voir Figure 5).
1.2
Fonctionnalités du logiciel 3D
Le logiciel 3D ne nous présentant qu’un unique objet, les actions possibles
sont beaucoup moins nombreuses qu’avec le logiciel 2D. Comme précédemment
le traitement de l’objet sera géré ultérieurement par le logiciel des clients.
Seul un rendu visuel représentatif de l’opération à effectuer sera mise en
16
Fig. 4 – Déplacement d’une image au sein du logiciel 2D
Fig. 5 – Exemples de mouvements reconnaissables par le logiciel 2D
place. Plus précisément, les actions gérées par notre projet seront :
17
– Déplacement de l’objet : le déplacement de l’objet sera normalement
gérée par les clients grâce à un trackball logiciel. Nous allons interfacer
celui-ci à la Wiimote. (Voir Figure 6).
Fig. 6 – Déplacement de l’objet 3D autours de son centre de gravité.
– Actions sur l’objet : l’utilisation de la Wiimote devra nous permettre
de réaliser des actions sur l’objet (par exemple : extrusions, coupes, ...).
1.3
Fonctionnalités communes
La gestion de la reconnaissance de gestes ainsi que la volonté des clients
de disposer d’une architecture de projet permettant d’envisager le remplacement du contrôleur Wiimote par un autre périphérique (tablette graphique
par exemple), nous forcent à mettre en place un certain nombre de fonctionnalités communes aux deux logiciels qui sont :
– Module d’apprentissage de mouvement : ce module permettra
l’acquisition de mouvements en 2D ou en 3D ainsi que leur sauvegarde
dans l’optique de leur reconnaissance au sein des logiciels.
– Gestion de profils utilisateurs : il devra être possible de créer et
basculer entre différents profils utilisateurs associant à chaque action
un mouvement personnalisé.
18
– Gestion du curseur : il sera nécessaire de prendre en charge la caméra
infrarouge de la Wiimote afin de gérer le déplacement du curseur à
l’écran (Voir Figure 7).
Fig. 7 – Gestion du curseur souris via la caméra infrarouge
– Stockage des mouvement : notre module d’apprentissage devra gérer
l’enregistrement des données de chaque mouvement pour son stockage
dans le système de gestion de profils utilisateurs afin de permettre la
reconnaissance dudit geste par les logiciels finaux.
– Gestion de plusieurs Wiimotes : nous devons mettre en place une
identification stricte de chaque contrôleur associé à l’ordinateur de
manière à empêcher toute intervention d’une autre Wiimote dans le
travail de l’utilisateur.
– Modularité de l’architecture du projet : comme expliqué ci-dessus
nous devrons nous assurer de la possibilité d’utiliser un autre type de
contrôleur lors de la reconnaissance des gestes.
2
Besoins Non Fonctionnels
Il existe également de nombreux besoins non fonctionnels à satisfaire lors
de l’implémentation de notre projet. Ces besoins, implicites dans la demande
19
des clients, sont les suivants :
– Instantanéité : l’intéractivité du logiciel et l’utilisation de la Wiimote comme périphérique de contrôle et de pointage rendent nécessaire
l’aspect “temps réel” de notre application, excluant ainsi tout algorithme coûteux en temps.
– Fiabilité : l’application finale des clients étant destinée au milieu médical
implique une optimum fiabilité de nos modules.
– Flexibilité : il est nécessaire que notre application s’adapte aux différents
utilisateurs et à leurs caractéristiques : gestes amples ou réduits, mouvements précis ou tremblements, ...
– Ergonomie : la prise en main, tout comme l’utilisation régulière de
l’application, doivent se faire de la manière la plus simple, rapide, et la
moins fatigante possible.
20
Architecture du projet
1
Communications Bluetooth
La communication entre deux périphériques Bluetooth est bien plus complexe qu’une connexion filaire. En effet, là où un périphérique comme une
souris se contente normalement d’un driver et d’une bibliothèque spécifique
au matériel et au langage, le Bluetooth ajoute une pile (ou stack ) qui va
se placer entre le driver et la bibliothèque. Ainsi, afin de faire communiquer une Wiimote avec un ordinateur, toute information va devoir transiter
par le dongle Bluetooth, être gérée par le driver puis par le stack et enfin
par la bibliothèque qui permettra l’exploitation des données dans le langage
choisi.(Voir Figure 8)
La bibliothèque BlueCove est donc utilisée comme point d’entrée des
données issues du Bluetooth et se charge de lancer les deux connexions
L2CAP nécessaires respectivement à l’envoi et à la réception de données.
Certaines classes de Bluecove sont alors implémentées par Wiimote et WiimoteStreamer qui vont pouvoir interpréter les données propres à la wiimote
et rendre moins ”bas niveau” la communication avec ce périphérique.
On peux voir sur le schéma la mention Wiigee qui correspond en fait à la
partie communication avec la Wiimote de WiiGee que nous avons décomposé.
2
Controleurs
La gestion de multiples périphériques d’interface utilisateur est une des
parties principales de notre projet. Il doit être possible pour les clients de
rajouter aisement le support d’un contrôleur à son application grâce à l’architecture de nos réalisations. Nous avons implémenté le support de deux
contrôleurs : la Wiimote et la souris et nous allons détailler leur structure.
2.1
Souris
La classe controlMouseListener dédiée à la souris ne présente pas de
véritable complexité. En effet, elle se contente, pour la plupart des actions, de
relayer l’information à partir des mouseListener habituels. Il faut cependant
remarquer la nécessité, pour interfacer la souris avec le module de reconnais21
Fig. 8 – Fonctionnement global de la communication Wiimote/Projet.
sance de gestes, d’une conversion des coordonnées de celle-ci vers des données
d’accélération en 3 dimensions, tâche accomplie par la classe abstraite Controller2D que controlMouseListener étends. Le reste des opérations tiens
principalement du mappage de boutons ou de la conversion de coordonnées
de pointeur.
2.2
Wiimote
La classe controlWiimoteListener dédiée à la Wiimote est, elle, beaucoup
plus complexe. En effet, l’utilisateur habitué au périphérique répandu qu’est
la souris va d’instinct chercher à retrouver les sensations de cette dernière
dans tout périphérique de contrôle utilisateur. Il a donc été nécessaire de
conserver la notion de pointeur, chose facilitée par les fonctions infrarouge
proposées par la manette. Il a donc suffit de récupérer les coordonnées des
deux points observés par la caméra IR de celle-ci afin d’obtenir un point
central que l’on projette sur la scène OpenGL.
De la même manière que pour la souris, le mappage des boutons en des
identifiants standardisés par notre classe ControlListener est effectué lors des
différents appuis et relachements afin de de procéder au transfert des évents
22
reçus vers les listeners existants. La reconnaissance des gestes reçoit quand
à elle les données directement issues des accéléromètres.
3
Listeners et Events
Comme nous avons pu le voir, la gestion des Contrôleurs passe principalement par un système de listeners et events que nous avons décidé d’étendre à
tout notre projet. Notre architecture va donc avoir pour rôle de retransmettre, en les ayant uniformisés, les events des différents périphériques jusqu’à
notre application finale (Wii2D ou Wii3D dans notre cas).
Fig. 9 – Structure des Listeners et Events
3.1
Interface matérielle
Comme on peux le voir sur la Figure 9 la communication avec le matériel
s’effectue via des classes héritées de l’interface ControllerListener (par exemple ControlWiimoteListener ou ControlMouseListener ) qui implémentent un
certain nombre de constructeurs spécifiques au périphérique dont ils vont recevoir les events. Ces derniers, faisant écho des changements de coordonnées,
d’accélérations ou d’appuis sur les boutons, vont être traités par la classe
23
de type ControllerListener puis renvoyés, pour les appuis de boutons et
l’évolution des coordonnées, au logiciel final sous la forme de ControlEvent,
et, pour les accelerations et lors de l’appui sur le bouton dédié à la reconnaissance de gestes ou lors du relachement d’un bouton, au module GestureRecognizer sous la forme de ControlAccelerationEvent pour leur interprétation.
3.2
Reconnaissance de gestes
Le module de reconnaissance de gestes, GestureRecognizer, traite donc les
events de type ControlAccellerationEvent sous deux forme : gestureStart et
gestureEnd. Les events gestureStart correspondent à l’acquisition des données
d’accélération et à leur stockage tandis que gestureEnd se charge de lancer la
reconnaissance du mouvement à partir des données enregistrées et de transmettre un GestureEvent correspondant au geste reconnu (ou à GestureListener.GESTURE NONE en cas d’echec), à destination du programme final.
3.3
Programme final
Le programme final implémente les interfaces ControllerListener et GestureListener et va donc traiter les ControlEvent et GestureEvent qu’il reçoit
en y associant les actions souhaitées.
24
Travail Réalisé et Problèmes
Rencontrés
1
Travail préliminaire
Notre travail a dans un premier temps consisté à tester la capacité de
la Wiimote à être connectée à un ordinateur. En effet, malgré les vidéos de
démonstration de plusieurs individus, la compatibilité avec l’implémentation
d’une application java n’étais aucunement garantie, l’ensemble des développements et tests étant effectués par des amateurs sans documentation sur le
matériel.
Nous avons choisi dans un premier temps une configuration Ubuntu et un
dongle Bluetooth nous appartenant, le choix de travailler sur les machines
du CREMI nous paraissant le plus judicieux. Plusieurs problèmes se sont
alors posés : malgré la possibilité de reconnaitre la Wiimote au moyen des
applications Bluetooth de Linux (Voir Annexe 1), un problème de droits est
apparu à chaque tentative d’appairage avec le périphérique. Le superviseur
du réseau nous ayant refusé ces autorisations supplémentaires, nous avons
alors dû choisir de travailler sur nos propres machines.
Nous avons alors choisi d’utiliser un environnement Windows Vista et
nous sommes heurtés au problème du choix d’un stack bluetooth. En effet,
contrairement à Linux où seul BlueZ est utilisé, il existe une multitude de
piles Bluetooth sous Windows. Quelques recherches et essais nous ont montré
que la bibliothèque choisie pour nos développements (Wiigee) ne pouvait
fonctionner qu’avec une pile de l’éditeur Widcomm (la Wiimote nécessite
une double connexion de type L2CAP supportée par cette seul pile). Le
site de l’éditeur ne proposant actuellement pas le téléchargement du logiciel, nous avons dû nous lancer dans la recherche de versions téléchargeables
en d’autres emplacements. Plusieurs versions nous ont posé des problèmes
de fonctionnalités liés à leur ancienneté, d’autres n’étaient pas compatibles
avec la Wiimote. Après plusieurs dizaines de versions testées nous sommes
parvenus à trouver la version 5.0.1.801, fonctionnelle mais provoquant de
fréquents freezes de notre système. Nous avons alors expérimenté la version
bêta de Windows Seven qui a présenté les mêmes symptomes puis les distributions Debian et Ubuntu où nous avons pu constater l’incompatibilité de la
pile BlueZ.
25
Nous avons enfin installé Windows XP qui s’est avéré des plus stables
avec ce stack nous permettant de débuter le travail de programmation.
2
Interfaçage et Utilisation des Controlleurs
Lors de la recherche d’un stack compatible, les tentatives d’utilisation
de la wiimote avec wiigee ont soulevé un nouveau problème. En effet, la
récupération de toutes les données de la manette passe par l’accès à des
valeurs de PSM inférieures à 0x1001, rendue impossible par la spécification
JSR-82 (Voir Figure 10). Une recherche sur des forums utilisateurs et dans
la documentation de la bibliothèque Bluecove, chargée de la gestion du Bluetooth en Java, nous a permis de découvrir un paramètre permettant de
forcer cet accès. Il nous a alors suffit d’ajouter un fichier de paramètre bluecove.jsr82.psm minimum off contenant la valeur 1 à la racine de notre projet.
java.lang.IllegalArgumentException: PCM values restricted
by JAR82 to minimum 4097
Fig. 10 – Erreur rencontrée liée à la spécification JSR-82
Notre travail a ensuite porté principalement sur la compréhension du fonctionnement de WiiGee et des communications Bluetooth avec la Wiimote.
Une étude des exemples de trames reçues par l’ordinateur nous a permis par
la suite de modifier WiiGee afin, par exemple, de prendre en compte la taille
des points observés par la caméra infrarouge. Nous avons choisi d’exploiter
le mode Extended de l’infrarouge qui présente une trame (Voir Figure 11)
contenant les coordonnées de 4 points de lumière infrarouge repérés par la
caméra et leurs tailles respectives.
Comme on peux le voir dans ce tableau, chaque répétition de ce schéma
nous fournit les données d’un des points. Les coordonnées X et Y sont divisées en deux parties (bits de 0-7 et bits 8-9 séparés), encodées chacune sur
10 bits et la largeur du point, encodée sur 4 bits. Une simple manipulation
bit-a-bit au sein du code nous as permis simplement de rassembler les deux
parties de chaque coordonnée.
26
Fig. 11 – Trame renvoyée par la Wiimote concernant sa caméra Infrarouge
3
Mise en place du module de Reconnaissance de Gestes
Une fois la Wiimote interfacée, nous avons dû réfléchir à l’intégration des
mécanismes dédiés à la reconnaissance de gestes au sein de notre architecture de manière à pouvoir prendre en compte à la fois des périphériques nous
fournissant des accélérations en 3 dimensions (la Wiimote par exemple) et
des périphériques nous fournissant de simples coordonnées 2D (comme une
souris).
Nous avons décidé d’implémenter, à destination de la classe ControlMouseListener et de toute autre classe fonctionnant en deux dimensions
(tablette graphique par exemple), une classe abstraite Controller2D fournissant le nécessaire à la conversion en temps réel des coordonnées en accélérations ainsi exploitables par notre gestureRecognizer.
La reconnaissance de gestes récupère ainsi systématiquement en entrée
trois accélérations x, y et z (la dernière étant à 0 pour les périphériques 2D)
et va retourner, à la fin du geste, un identifiant de geste reconnu à tous les listeners enregistrés. L’envoi de données à gestureRecognizer se fait uniquement
27
lors de l’appui sur le bouton secondaire du contrôleur, ou, selon les critères
fixés lors de l’implémentation de la classe de ce dernier. La fin de l’appui
sur ce bouton, ou toute autre action choisie, envoie un event de fin d’action
à gestureRecognizer qui lance alors l’analyse de l’objet de type gesture enregistré au fil des accélérations reçues. En mode learning, déclenché par le
logiciel final, le mouvement est alors ajouté à un gestureModel au lieu d’être
analysé afin d’agrandir la base de gestes qui permettra la reconnaissance en
mode normal.
Etant donné notre choix de conserver la structure de reconnaissance de
gestes utilisée au sein de WiiGee, principalement en raison du temps perdu
à la configuration matérielle de la connexion Bluetooth, nous n’avons rencontré aucun problème hormis de compréhension, au sein de cette partie du
développement.
4
Modification du logiciel Wii2D
Les modifications du logiciel Wii2D ont principalement porté sur deux
points : l’adaptation du logiciel à notre architecture de contrôleurs et de
reconnaissance de gestes et l’ajout d’un rendu graphique et d’une interface
légère reflétant nos futures actions.
4.1
ControllerListener et gestureListener
Notre travail a dans un premier temps porté sur l’adaptation du logiciel
fourni par les clients à notre système permettant l’interfacage de plusieurs
périphériques. Il a suffit pour celà d’implémenter le modèle ControllerListener, ajoutant les contrôleurs de périphérique en fonction des choix de l’utilisateur et de permettre à ce dernier de changer de contrôleur de manière
simple et intuitive.
Sont donc effectué à chaque changement de périphérique, la suppression
de tous les listeners courants, l’ajout d’un listener de type ControllerListener
correspondant au choix de l’utilisateur et celui d’un GestureListener adapté
au matériel sélectionné.
La gestion des évènements se fait au sein de l’application de la même
manière que l’implémentation d’un mouseListener classique.
28
4.2
Graphisme et fonctionnalités
Nous avons ensuite travaillé sur le rendu graphique des actions, comme
demandé par les clients, et sur l’amélioration de l’interface utilisateur. Aucun
d’entre nous n’ayant jamais été formé sur l’utilisation d’OpenGL, nous avons
du nous documenter sur chaque aspect de l’application afin d’en comprendre
le fonctionnement et de trouver des solutions adaptées à nos développements.
La bibliothèque choisie par les clients, JOGL, nous a cependant posé
quelques ennuis. En effet, celle-ci n’étant pas standard, son installation et
son utilisation ont présenté quelques erreurs que nous avons pu résoudre en
intégrant directement au sein du projet, jogl.jar et gluegen-rt.jar.
Nous avons ensuite été confrontés aux notions de gestion du contexte,
modification des axes et repères ou création de formes, chacune nous ayant
demandé de nombreuses recherche et un apprentissage autodidacte.
Nous avons enfin dû nous intéresser à la réalisation d’un menu contextuel,
les clients souhaitant avoir la possibilité de choisir d’effectuer les actions à
l’aide du curseur ou à l’aide de la reconnaissance d’un geste. Nous étant, dans
un premier temps, penchés sur l’utilisation d’un glutCreateMenu, le peu de
documentation et la quasi impossibilité de reçycler le code de cette méthode
nous ont encouragé à tenter de réaliser un menu contextuel à base de formes
et de textes. L’utilisation de gluBitmapString nous permettant de générer
un bitmap à partir de texte puis de l’insérer dans le contexte OpenGL, nous
avont pu mener à bien cette tâche.
La mise en place de la reconnaissance de gestes implique bien entendu
un certain rendu graphique des différentes commandes souhaitées par les
clients. En effet, il ne nous est pas demandé de gérer chacune des actions
mais uniquement de prévoir leur exécution. Nous avons donc choisi des effets
simples rendant bien compte des différentes opérations à effectuer sur l’image.
5
5.1
Modification du logiciel Wii3D
ControllerListener et gestureListener
De même que pour Wii2D, Wii3D permet l’utilisation d’autres types de
périphériques que la souris et le clavier. Nous pouvons interagir avec l’objet
3D (en l’occurence une sphère) et effectuer des opérations de bases décrites
29
par les clients. Nous n’avons pas trouvé nécessaire d’effectuer de reconnaissance de mouvements sur ce logiciel, car une précision certaine est recommandée pour le bon rendu des actions implémentées.
5.2
Graphisme et fonctionnalités
Wii3D s’est vu doté de nouvelles fonctionnalités disposant ainsi d’un
rendu visuel pour satisfaire les attentes des clients. Ces fonctions sont la
coupe et l’extrusion. Etant donné que la réalisation de ces fonctions ne constitue pas l’objectif du projet et notre manque d’expérience en OpenGL,
nous avons donc créé des fonctions simples permettant de visualiser l’interaction entre l’utilisateur et l’application. Nous avons cependant essayé
d’améliorer nos rendus, notemment en voulant avoir une vraie acquisition
des coordonnées 3D en passant par la fonction Convert2D3D, dont la manipulation s’est avéré trop difficile. En effet, celle-ci propose de retourner un
vecteur 3D en prenant en paramêtre une abscisse et une ordonnée, seulement
l’influence des contextes nous a bloqué.
30
Installation et Fonctionnement
Notre projet impliquant un périphérique peu commun, la Wiimote, il
est sujet à un grand nombre de disfonctionnements tant au niveau matériel
qu’au niveau logiciel. Nous allons donner ci-dessous des instructions afin de
procéder à l’installation d’un environnement de travail et/ou d’utilisation.
1
Installation et Matériel
Nous avons dû, lors des tests préliminaires, faire de nombreux essais afin
de trouver un environnement de travail fonctionnel. Notre choix s’est finalement porté sur le système d’exploitation Windows XP, seul à présenter une
certaine stabilité face à la contrainte logicielle du Bluetooth (stack ), les versions Vista et Seven de Windows ainsi que Debian et Ubuntu présentant des
problèmes de stabilité ou de paramétrage matériel (incompatibilité du stack
ou problèmes de communication matériel/logiciel).
1.1
Matériel et drivers
Afin de pouvoir utiliser la Wiimote, il est nécessaire de procéder à l’installation d’un stack, ou pile logicielle Bluetooth, qui se chargera des fonctions de
connexion et de communication entre périphériques et récepteur. Notre choix
s’est porté sur la version 5.0.1.801 du stack Widcomm associé à un dongle
USB Bluetooth Sitecom CN-502. La compatibilité stack/dongle étant relativement chaotique, d’autres modèles de clefs Bluetooth peuvent cependant
fonctionner. Il est important de noter qu’il est parfois nécessaire de remplacer
dans le Gestionnaire de Périphériques, le driver installé automatiquement par
Windows lors du branchement de la clef par celui fourni en même temps que
le stack.
1.2
Interface graphique
Afin de faire fonctionner les logiciels des clients il est nécessaire d’installer
la bibliothèque OpenGL choisie par ce dernier. Nous avons donc ajouté la
version 1.1.2 pour Windows x86 de JOGL au sein de l’environnement de
développement de notre IDE.
31
2
2.1
Utilisation du logiciel
Interface de Wii2D/Wii3D
Les interfaces des logiciels des clients présentent une scène sur laquelle
se trouvent les objets à manipuler (vignettes pour Wii2D ou sphère pour
WIi3D). Un menu présent en haut de la fênetre permet de paramétrer, à la
souris, plusieurs des composants de notre projet.
Le menu Profile propose trois fonctionnalités liées aux profils de gestes :
New, Open et Save qui permettent respectivement de créer un nouveau profil, ouvrir un fichier de profil et sauvegarder le profil courant sous un fichier.
Les gestes étant spécifiques à un individu, il permet donc à plusieurs usagers
d’utiliser l’application selon ses préférences.
Le menu Gesture permet de lancer, via Learning, l’ajout ou le remplacement du geste correspondant à une fonctionnalité dans le profil courant.
Le menu Devices propose de choisir le contrôleur actuellement activé au
sein de l’application. Lors de la première sélection du contrôleur Wiimote, la
procédure d’appairage est lancée et des instructions détaillées sont fournies à
l’écran. Une erreur d’activation de la Wiimote nécessite le retour à un autre
contrôleur avant une nouvelle tentative et il n’est possible d’utiliser qu’un
seul contrôleur à la fois.
2.2
Utilisation des périphériques
L’utilisation des périphériques se base sur une utilisation commune des
boutons. Pour la souris, le clic gauche est le bouton principal et le clic droit
le secondaire. Pour la Wiimote, le (A) correspond au bouton principal et le
(B) au bouton secondaire.
L’appui sur le bouton principal d’un périphérique correspond au clic
habituel d’une souris. Il est donc possible de réaliser une sélection par un
simple clic ou de sélectionner plusieurs vignettes par un rectangle de sélection
dans Wii2D ou bien de déplacer la caméra autours de la sphère par un cliquerdéplacer sous Wii3D.
L’appui sur le bouton secondaire est lui dédié à la reconnaissance de geste.
Il suffit alors d’appuyer et de maintenir le bouton pendant la réalisation du
32
geste pour ensuite le relacher et que celui-ci soit reconnu (ou enregistré en
mode Apprentissage).
Pour les périphériques possédant plus de boutons, d’autres fonctionnalités
sont disponibles, il s’agit de celles présentes dans la barre de menu en haut
des applications. Pour la Wiimote, par exemple, le bouton (-) va lancer l’enregistrement du profil courant, le bouton (+) va lancer le chargement d’un
fichier de profil et le bouton (1) lancer l’interface d’apprentissage d’un geste.
On notera que l’utilisation de la Wiimote nécessite une sensor-bar placée
au bord d’un écran ou d’un meuble et un éloignement de quelques mètres
de celle-ci pour assurer le bon fonctionnement du capteur infrarouge de la
manette. Il sera alors possible de déplacer le curseur dans la scène de l’application en dirigeant la Wiimote vers l’écran.
2.3
Interface d’apprentissage
L’interface d’apprentissage permet l’ajout d’un geste au profil courant et
son association avec une fonction disponible au sein de l’application finale.
La fênetre ouverte présente des instructions détaillées invitant l’utilisateur à
répéter le geste désiré un certain nombre de fois (10 par défaut) et l’invite
ensuite à choisir la fonction associée.
33
Définition et Réalisation des
tests
Dans le cadre de notre projet, la réalisation de tests est quelque peu particulière. En effet, bien qu’il nous soit possible de tester une série de valeurs
pré-enregistrées, la bonne exécution ne nous donnerais aucune indication concernant le bon fonctionnement de notre application : notre programme a pour
but de reconnaitre les gestes humains dans leur diversité et doit donc, pour
ses tests, passer entre les mains d’individus réels.
Nous allons donc tenter de décrire quelques procédures visant à tester les
fonctionnalités de notre application et la bonne prise en main de celle-ci par
l’utilisateur.
1
Test de la fonction Curseur
et du déplacement
Comme prévu lors de l’étude des besoins, la souris et la wiimote, périphériques choisis pour notre développement, doivent permettre de contrôler un
curseur sur la scène OpenGL de l’application des clients. On peux considérer le test comme intuitif pour la souris mais il nécessite, pour la wiimote,
quelques précisions.
Il est nécessaire dans un premier temps de procéder à l’activation et à
l’appairage de la wiimote avec le PC. Pour celà, l’utilisateur doit activer la
fonction Wiimote du menu Controllers, puis suivre les instructions afin de
procéder à l’association de la manette. Dès la fin de cette procédure, il est
possible pour l’utilisateur d’orienter sa wiimote vers l’emetteur infrarouge
et de contrôler le curseur en déplaçant le périphérique. Il est cependant
nécessaire, en raison de contraintes techniques, de s’éloigner de quelques
mètres de l’emetteur afin d’obtenir une utilisation fluide.
En cliquant sur une vignette avec la touche principale du contrôleur,
l’utilisateur peut ainsi déplacer le carré de couleur et le relacher où il le
souhaite.
34
Fig. 12 – Screen de l’application Wii2D : Exemple de déplacement de vignette
2
Test des logiciels
Le but de notre projet étant l’intéraction entre différents contrôleurs et
une application, il est normale de présenter dans cette partie, des tests qui
mettent en évidence cette intéraction. Par le biais des fonctions implémentées
au sein des logiciels 2D/3D, nous disposons d’un rendu visuel
– Fonctions basiques :
Nous avons développé, au sein des différents logiciels fournis par les
clients, des fonctions permettant d’intéragir directement avec les objets
présents sur la scène. Ainsi, nous avons implémenté des actions telles
que l’ajout, la suppression, la fusion, la négation, etc. Par exemple la
suppression d’images s’effectue en plusieurs étapes : dans un premier
temps, il s’agit de sélectionner à l’aide de la Wiimote (appui bref sur
le bouton (A) au dessus d’une image ou maintient du bouton (A) pour
utiliser le rectangle de sélection) les images désirées. L’instruction de
suppression est ensuite donnée par la reconnaissance de gestes, il faut
donc appuyer sur le bouton (B) et dessiner une croix (voir figure 14).
35
Fig. 13 – Screen de l’application Wii2D : Exemple d’ajout de vignettes
Fig. 14 – Screen de l’application Wii2D : Exemple de suppression de vignettes
36
– Apprentissage d’un mouvement et reconnaissance :
Le point crucial de ce projet est l’intéraction avec n’importe quel périphérique et notamment la reconnaissance de geste. Afin d’effectuer cette
dernière, il est avant tout nécessaire de procéder à l’enregistrement d’un
geste, fonctionnalité qui devient alors forcément l’objet d’un test par
sa place centrale au sein de l’architecture. Ce test prouve le bon fonc-
Fig. 15 – Screen de l’application Wii2D : Exemple de reconnaissance de geste
tionnement du module d’apprentissage de mouvements et la possibilité
de définir facilement des profils de mouvements à utiliser au sein des
logiciels.
37
Améliorations et réutilisations
possibles
Nous avons tenté lors de la réalisation de notre projet de respecter des
principes de programmation offrant la possibilité de réutiliser aisément notre
code dans d’autre applications. Nous avons également pu remarquer de nouvelles voies de développement qui permettraient l’amélioration ou l’ajout de
fonctionnalités mais qui, faute de temps ou d’intérêt pour les clients, n’ont pas
été implémentées. Nous allons vous exposer quelques unes des améliorations
ou réutilisations possibles.
Améliorations
– Amélioration de la classe ControlMouseListener : Nous nous
sommes contentés lors de l’élaboration de ce module de traiter les
données d’une souris basique (à trois boutons). Il est cependant à noter
que l’on trouve de plus en plus de souris possédant de multiples boutons
qu’il serait intéressant d’exploiter. La diversité des configurations et l’utilisation répandue de drivers propriétaires fait qu’il sera nécessaire de
traiter le matériel au cas par cas.
– Création de nouvelles classes de périphériques : Etant donné
que notre implémentation permet, en théorie, l’utilisation de n’importe
quel périphérique d’interface utilisateur (HID), l’amélioration de notre
application passe par la création de nouveaux modules spécifiques à
chaque type de matériel existant (tablette graphique, gant, etc).
– Amélioration de la prise en charge des contrôleurs : Lors de
la mise en place de notre architecture de contrôleurs, nous avons été
confrontés à plusieurs choix d’implémentations et avons décidé de ne
répondre qu’aux besoins des clients. Cependant, il aurait été possible
d’améliorer le système en proposant par exemple la possibilité d’utiliser
plusieurs contrôleurs à la fois (risque de conflits lors de l’utilisation) ou
de permettre l’ajout “à la volée” d’une nouvelle classe de périphérique.
Il serait aussi intéressant de proposer pour chaque contrôleur un ensemble de données de reconnaissance de gestes par defaut.
38
– Amélioration de l’interface utilisateur : La plus grande partie
de notre travail a porté sur des soucis d’ordre matériel ou liés à la
réalisation de notre architecture de projet, délaissant ainsi quelque peu
l’aspect graphique de l’application. Un travail visuel ou lié à l’ergonomie
de notre interface pourra donc faire partie des points d’amélioration,
avec par exemple une interface plus intuitive pour l’association d’une
Wiimote, ou encore des menus au sein de la scène OpenGL.
– Ajout d’une interface de configuration : La majorité des paramétrages de notre appplication se font actuellement par la modification de
variables globales au sein des differentes classes. L’introduction d’une
interface permettant la configuration des paramètres principaux de nos
modules serait donc une amélioration possible (modification du nombre
de répétitions pour l’acquisition d’un geste ou encore choix des boutons
associés aux actions).
Réutilisations
– Utilisation dans une autre application : Les modules de notre
projet sont implémentés de manière à pouvoir être intégrés à n’importe
quelle application tirant habituellement parti de la souris. La simple
implémentation de nos ControlListener et GestureListener au sein d’un
programme permet ainsi d’y inclure la reconnaissance de gestes et le
support de plusieurs types de contrôleurs.
– Mise en place au niveau de l’OS : Il serait possible de réaliser une
couche applicative afin de fournir des fonctionnalités avancées concernant les periphériques d’interface utilisateur au sein du système d’exploitation (reconnaissance de gestes ou utilisation de boutons supplémentaire par exemple) en se basant sur le code de notre projet.
39
Conclusion
Le travail que nous avons eu à fournir lors de ce projet de PDP nous a
procuré de nombreux enseignement au niveau de la tenue d’un projet, de la
communication avec un client, du travail en équipe mais aussi en programmation en nous permettant de manipuler de nouvelles notions et fonctions.
Nous avons du travailler à la lisibilité de notre code et en conséquent, à sa
maintenabilité ce qui nous a dans le même temps permis de mieux nous approprier le code, autorisant chacun des membres du groupe à comprendre
l’ensemble des processus mis en jeu.
Le sujet particulièrement intéressant nous a permis de travailler sur un objet assez mystérieux au premier abord et d’en découvrir la majorité des secrets
de fonctionnement et nous espérons tomber sur des projets aussi intéressants
lors de notre entrée dans la vie professionnelle.
40
Bibliographie
Commentaire
Le document [1] est le site officiel de la bibliothèque Java JOGL, qui permet l’utilisation de l’OpenGL.
Le document [2] est un site fournis par les clients présentant une multitude de tutoriels pour l’OpenGL. Contient des codes sources commenté dans
différents langages dont JOGL qui est utilisé dans notre projet. Il présente
aussi des exemples d’utilisation des fonctions glut.
Le document [3] présente une librairie Java permettant la reconaissance
de mouvements par l’intermédiaire de la Wii Mote. Ce site comprend un tutoriel pour ajouter la librairie à un projet, quelques explications au niveau
de la reconnaissance de mouvements ainsi qu’une JavaDoc de la librairie.
Le document [4] est un livre qui est la référence en matière de programmation OpenGL en langage C. Complément aux tutoriels de NeHe, de nombreux
exemples de code sont disponibles.
Le documents [5] est un rapport de recherche présentant une étude orientée utilisateur dont le but est de tester les interactions 3D. Cette approche
s’appuie sur un prototype léger et facilement extensible constitué principalement d’un gant comme périphérique 3D. De plus, le rapport évoque également
l’ajout d’un deuxième périphérique tel qu’une WiiMote pour la facilité de
contrôle de l’application.
Le document [6] est un wiki contenant les bases de compéhension des
accéléromêtres de la Wii Mote. Il contient également différents drivers qui
sont fonctionnels, écrit dans des langages variés. Ce site nous servira principalement pour les drivers puisque qu’il en propose une assez grande séléction.
Nous devrons choisir celui qui correspond le mieux aux objectifs de notre projet.
Le documents [7] est une thèse sur la détection, suivi et reconnaissance
des formes et du mouvement par modèles probabilistes d’apparence.
Le documents [8] est un article qui explique les expériences menées par
des chercheurs de l’université de Oldenburg sur la reconnaissance de mouve41
ments par l’intermédiaire d’accéléromêtres. L’analyse est faites de plusieurs
étapes qui sont détaillées (notemment au niveau de la l’acquisition des mouvements effectués par la Wii Mote) ainsi que la méthode de filtrage de mouvement utilisée. Les chercheurs indiquent aussi les résultats obtenus avec leurs
méthodes au niveau de la bonne identification des mouvements effectués.
Références
[1] Jogl : https ://jogl.dev.java.net/.
[2] Nehe productions : http ://nehe.gamedev.net. 1997.
[3] Wiili : www.wiili.org. 2006.
[4] Jackie Neider Tom Davis Dave Shreiner, Mason Woo. The opengl programming guide - sixth edition/the redbook. 2007. version HTML :
http ://www.glprogramming.com/red/.
[5] Philippe Renevier Anne-Marie Pinna-Déry1 Julien Soula Michel Riveill
Diane Lingrand, Sébastien Meunier. Gestaction 3d : combiner commandes
gestuelles et interactions 3d. In Rapport de recherche isrn, Novembre
2006.
[6] Benjamin Poppinga and Thomas Schlömer. Wiigee : www.wiigee.org.
2008.
[7] Fabrice Heitz Rouf Hamdan. Détection, suivi et reconnaissance des
formes et du mouvement par modèles probabilistes d’apparence. PhD thesis, Strasbourg I, 2001.
[8] Niels Henze Susanne Boll Thomas Schlömer, Benjamin Poppinga. Gesture recognition with a wii controller. In Proceedings of the 2nd International Conference on Tangible and Embedded Interaction, February 2008.
42
Annexes
43