SecureM

Aller au contenu | Aller au menu | Aller à la recherche

WiiInteract : triangulation et "hard-syncing" pour les Wiimotes

Vous connaissez mon projet WiiInteract de FingerTracking par Wiimote. Je me suis remis à travailler sur le projet depuis peu, en développant/améliorant certaines fonctionnalités :

Triangulation

A la base, j'utilise une Wiimote au dessus de l'écran qui fournit la position (X,Y) du curseur, ainsi qu'une seconde Wiimote sur le côté ou en dessous qui sers à détecter le clic (dès qu'on passe au dessus, on "clique").
Le problème, c'est que la Wiimote principale (celle au dessus de l'écran) ne fournit que des coordonnées dans le plan (et non dans l'espace) : si la coordonnée Z (distance doigt-écran) ne varie pas, on reste dans un plan, et la Wiimote fournit des données précises, et c'est comme ça qu'on peut déplacer le pointeur avec précision.
Par contre, quand on veut cliquer, la coordonnée Z (la "cote") varie et on ne reste plus dans le même plan. L'image à droite montre ce qui se passe : alors que la Wiimote secondaire enregistre bien le clic, la Wiimote principale enregistre également en déplacement dans le plan, et on clique souvent à côté...
Explication de l'image : tant qu'on reste dans le plan (déplacement en vert, points 1 et 2) la Wiimote n'a aucun problème à détecter la position. Par contre, dès que la cote varie (déplacement en rouge) sans pour autant que les coordonnées X ou Y ne varient, la Wiimote croira que si puisqu'elle ne tient pas compte de la cote du point : le point 3 paraîtra se décaler quand il avancera, alors que non.

Le principe de triangulation permet, à partir de deux Wiimotes, d'obtenir la position complète du point dans l'espace (X,Y,Z), tout simplement en disposant les deux Wiimotes de part à d'autre de l'écran, et en appliquant quelques petites formules de mathématiques (trigonométrie)...
Le système de triangulation semble fonctionner correctement, et il sera bientôt intégré au programme d'émulation de curseur qui passera donc en v2.0 (peut-être que si je recode aussi le système de calibrage ça fera une version 2.5 :D ).
Le problème le plus important en triangulation est la position des deux Wiimotes, par rapport à l'écran, mais aussi l'angle entre les deux Wiimotes (elles ne sont pas parallèles). Et promis, je vous fais un petit schéma pour la prochaine fois ;)

Le hard-syncing

Le "hard-syncing" ou synchronisation matérielle, permet la synchronisation directe entre la Wiimote et son périphérique associé (Wii habituellement, ordinateur pour moi).
A chaque lancement du programme, je suis obligé de "synchroniser" la/les Wiimote(s) avec l'ordinateur pour que le programme puisse communiquer avec elle, en appuyant simultanément sur les boutons 1 et 2... ce qui est à la longue assez fastidieux et ennuyeux (pour ne pas dire autre chose ^^).
Ca, c'est une synchronisation logicielle, mais vous n'en faites qu'une seule au tout début pour jouer à la Wii... les jours suivants, il vous suffit d'appuyer sur une touche pour que la Wiimote se réveille et se connecte. C'est ce comportement que je recherche et qui se nomme synchronisation matérielle : j'imagine que la Wiimote stocke l'adresse MAC (adresse physique du périphérique Bluetooth de l'ordinateur ou de la Wii) directement en mémoire, et que dès qu'on la réveille elle s'y connecte. Malheureusement, comme vous le savez peut-être, Nitendo n'a pas publié le fonctionnement du protocole de communication Wii / Wiimote, et tout ce qu'on peut faire actuellement avec l'ordinateur, on le doit à une poignée de "hackers" qui ne sont pas je le rappelle, des pirates informatiques.
Vous pouvez aller voir http://wiki.wiimoteproject.com/Connecting pour quelques information supplémentaires sur les communications de la Wiimote.

Olympiades & PPE : Vive la SI :D

Coucou tout le monde :) Tout d'abord quelques nouvelles du projet d'Olympiades (FingerTracking par Wiimote) :  Je suis allé présenter mon projet aux olympiades de SI, au musée des Arts & Métiers, le mercredi 5 mai : à notre arrivée par les couloirs de service à partir de 8H, nous avons été assignés à un stand, sur lequel on a commencé à s'installer (pas de prise, et une fois déplacés, pas de multiprise pour nos ordinateurs et l'écran 20" de présentation).
Je dis nous parce que les Olympiades ça se présente en équipe, et qu'une équipe tout seul ça le faisait pas. Du coup mon compère en a profité pour extraire un bout du film Minority Report, une belle démonstration par Tom Cruise des applications du FingerTracking...
Le public est arrivé, pas le temps de s'asseoir, mais c'était très sympathique :) Le jury qui est passé était un peu moins sympathique, surtout que montrer tout le travail réalisé était tout bonnement impossible, je me suis donc contenté de leur en mettre plein la vue 8)
Et bien sûr, quand il pose sa petite question de ***, qui pour moi était "Mais... vous avez mesuré la distance minimale entre deux diodes pour que la Wiimote les sépare correctement ?" (parce que lorsqu'on rapproche trop deux diodes IR, la wiimote considère qu'il n'y a plus qu'un seul spot) et bien sûr j'étais pas allé mesurer, surtout que ça dépend de la distance LEDs/Wiimote (et qu'on s'en fiche un peu).
Du coup ils sont partis pas super satisfaits. Mais ça a pas empêché l'ensemble de la troupe, la délégation presque au grand complet, de revenir l'après-midi demander un "complément d'information de 5 min". En plus, on avait réparé le casque qui s'était abimé pendant le trajet et était inutilisable le matin, et qui servait au HeadTracking... Le HeadTracking, je ferais sûrement un article plus poussé pour l'expliquer (avec l'ensemble du projet je pense) donc sachez juste qu'au lieu de suivre un doigt, on suit la tête et on affiche l'image en fonction de la position de l'utilisateur, telle qu'il la verrait de son point de vue si l'objet était en 3D et non affichée sur une surface plane (écran). Bref, on a pu leur faire une petite démo, on a passé le casque à un membre du jury qui a été subjugué (vous me dites si j'en fait trop hein)... Donc au final, ils repartent super content, j'ai eu quelques visites particulièrement sympas : un ancien ingénieur des Arts&Métiers à la retraite et un homme d'affaire étranger qui a tenu à nous serrer la main en disant avec un fort accent "Félicitation, bravo !" :D
A 16H, c'était la remise des prix en salle de conférences...
  • 3e prix... Le projet du train à sustension magnétique (ceux qui ont vu m'ont parlé de "plusieurs aimants scotchés entre eux", mais comme j'ai pas vu je vais pas parler, en plus le sujet est pas mal)
  • 2e prix... Le calibreur automatique de vidéoprojecteur (sur une surface au coins de laquelle sont fixés 4 photorésistances qui permettent après correction d'afficher une image carrée sur une surface non perpendiculaire au projecteur; même si leur méthode de calibrage aurait pu être améliorée c'était un bon projet aussi, réalisé par des élèves de première pour leur TPE)
  • 1e prix... Un robot suiveur de lumière. EPIC FAIL. Là encore, j'ai pas vu donc je peux pas dire, mais comme thème ça m'a l'air assez... nul.
Donc oui vous, l'aurez compris, j'avais un peu la haine, surtout que les 3e ont eu des iPod Touch et les premiers des Netbooks...

Projets Pluritechniques Encadrés : notre PPE "robot suiveur de ligne, par capteur optique"

C'est aujourd'hui qu'avec mon groupe nous avons passé l'oral des PPE et rendu la production écrite (une synthèse obligatoire et un dossier facultatif). Ca s'est bien passé, même si la réalisation du robot nous a posé pas mal de problèmes : notre lycée étant le seul établissement non polyvalent (uniquement filière générale > pas de laboratoire de STI, STG, BEP, DUT, etc...) à faire de la SSI, c'est un peu la dèche niveau matériel. Genre la thermoplieuse qui thermoplie quand elle veut, et la scie électrique qui casse toutes les semaines étaient les deux seules machines à notre disposition. Ah si, j'oubliais le fer à souder (quand même), quand personne ne l'avait emprunté. Du coup, à nous de ramener la perceuse, à nous d'aller acheter les composants (jusqu'au scotch pour fabriquer la piste du robot), nos professeurs étant allés fabriquer nos circuits imprimés dans un autre lycée (nous n'avons récupéré ces cartes que l'avant dernière semaine)
Enfin bref, même si au final c'est un peu compliqué à réaliser, je comprends pas comment un robot suiveur de lumière a pu gagner les Olympiades de SI (ou alors il fait autre chose de mieux et ils ont mal choisi le nom).

Pour ce qui est de WiiInteract, le projet de FingerTracking, je compte bien continuer à l'améliorer pour le rendre encore plus attractif (notamment permettre un clic plus intuitif à moins de 50 cm de l'écran) et développer des applications originales ou utiles (photowall, instrument de musique, batterie virtuelle pour Guitar Hero, jeu de course pour utiliser le HeadTracking...)
Je vous tiendrais au courant, surtout si je fais un dossier explicatif :)

Projet d'Olympiades : Fingertracking par Wiimote

Bonjour tout le monde, voici quelques mois que je n'ai pas touché au site, je vous apporte donc des nouvelles :)

Depuis le début des vacances (eh oui on est encore en vacances nous :p) je travaille sur mon projet d'Olympiades de SI (pas à longueur de journée non plus, faut pas exagérer hein). Je m'explique.

Les Olympiades... de SI

 Les SI, Sciences de l'Ingénieur, nous sont enseignées depuis la première en voie générale scientifique (on abandonne la SVT pour prendre la SI). Peut-être avez-vous déjà entendu parler des Olympiades, mais c'était sûrement les Olympiades de Physique ou de Chimie. Les Olympiades de SI sont effet pratiquement inconnues, puisque c'est... leur première année. Vous pouvez visiter le site officiel : http://sites.google.com/site/lesolympiadesdesi/. Cette année donc, j'ai décidé de participer à ces olympiades : mais contrairement à la majorité des autres groupes qui je pense vont reprendre leur projet de PPE (projets pluritechniques encadrés) et présenter un robot suiveur de ligne (youpi T_T) ou un compacteur pour déchets, j'ai eu envie de faire quelque chose de différent et de plus intéressant (lisez "plus intéressant que mon robot suiveur de ligne de PPE")...
 On a beaucoup hésité, la robotique c'est bien sympa (c'est les SI en puissance, avec un gros bout de méca et un peu d'élec), mais personne n'a trouvé d'idée intéressante. Je suis donc parti sur... les IHM : une Interface Homme-Machine, c'est ce qui vous permet d'interagir avec votre ordinateur ou tout autre système informatisé. Par exemple, votre clavier, votre souris, votre manette de Playstation, et même maintenant une Wiimote, qui est un peu plus intuitif (surtout pour les jeux) et vous permet de lancer une boule de Bowling, de faire de la guitare, ou encore de tirer sur des lapins crétins, etc...
 Eh bien justement, parlons-en de la Wiimote, j'avais vu récemment un article qui m'avait permis de contrôler mon ordinateur en utilisant une Wiimote (CWiid) : en pointant un coin de l'écran je pouvais y déplacer ma souris, cliquer avec un bouton, etc... C'est là que j'ai pensé au fingertracking infra-rouge. Méçékoassa ?

"Fingertracking infra-rouge" avec une Wiimote et plus

  De l'anglais finger, le doigt, et tracking, le suivi, on pourrait traduire cela par "suivi du doigt". Il s'agit en fait simplement de repérer en temps réel la position du bout du doigt dans l'espace devant l'écran et de le retranscrire en mouvement du curseur. Ce n'est pas phénoménal, sûrement pas nouveau, mais je me suis rappelé le film futuriste Minority Report de S.Spielberg avec Tom Cruise, dans lequel ce dernier utilise en système similaire assez stylé pour visionner des vidéos et ordonner des éléments sur un grand écran translucide, le tout avec juste trois doigts qu'il balade d'un bout à l'autre de l'écran. Alors, allons-y :D
 Première difficulté : obtenir la position d'un doigt dans l'espace. Solution technique : utiliser une caméra. Mais pas n'importe quelle caméra, le groupe de PPE qui en utilise une sait très bien que transformer des pixels colorés en données concrètes c'est pas simple. J'ai donc repris le principe du contrôle de l'ordinateur par la Wiimote : celle-ci possède, sur la face avant, une caméra infra-rouge (le petit rectangle noir) qui permet de "voir" les principales sources infrarouges : objets très chauds, ou diodes infra-rouge... comme celles de la "Sensor Bar" de la Wii, qui est uniquement composée de deux sources infrarouges. Eh oui, il n'y a aucun capteur dedans, juste deux petites diodes. C'est la Wiimote qui repère, grâce à sa caméra, la position des deux bouts de la sensor bar, et calcule ensuite les coordonnées de l'endroit pointé par la Wiimote, sur l'écran.
 Très bien me direz-vous, mais si la caméra est dans la Wiimote et que tu veux juste savoir où se trouve ton doigt tu fais comment ? Tu te fixes une sensor bar sur le doigt ? Héhéééé non. Mais presque. Et oui, il suffit de placer une diode infrarouge (on abrège IR) au bout de chaque doigt pour en connaître la position !
Ainsi, une caméra IR (la Wiimote) placée face à l'utilisateur au dessus ou en dessous de l'écran permettra de récupérer la position des "spots" IR devant elle...
 "Oooohhh"
 Bon, c'est un poil compliqué donc je vous fait un petit shéma :
Bon, en théorie ça a l'air simple à faire... En pratique c'est autre chose. Tout d'abord, pour communiquer avec la Wiimote. La connexion se fait en bluetooth, pas de problème pour la connecter avec le logiciel de contrôle par Wiimote (dont j'ai parlé plus haut), c'est donc tout à fait possible et ça marche 9 fois sur 10 avec la clé bluetooth à 2€ (quand je vois qu'en magasin ils en vendent à 30€... :O).
 Donc pour commencer, le choix de la bibliothèque : il existe déjà des fonctions pour se connecter et récupérer les informations de la Wiimote, alors pourquoi le coder nous-même ? (Surtout que le support des frames Bluetooth, même avec les gars qui ont reversé le protocole de communication, ça reste assez dur)
Dans un premier temps j'ai essayé WiiUse, qui s'est avéré assez précis, paramétrable, et avancé. Mais... et il y a un gros MAIS, deux fois sur trois la connexion foirait à la connexion, et j'étais obligé de débrancher/rebrancher la clé Bluetooth. Assez intenable à la fin.
Du coup, je suis passé à CWiid, qui était la librairie utilisée par l'autre logiciel. Pas de doc. MAIS une fonction de connexion directe aux Wiimotes, en donnant leur adresse MAC : il s'agit de l'adresse unique et spécifique à chaque Wiimote, WiiUse auto-détectait les Wiimotes à proximité, tandis que CWiid permet de s'y connecter directement. Et du coup, plus aucun problème de connexion :D
Ca m'a pris un peu de temps de recoder la partie utilisant WiiUse, les systèmes étant moins évolués : c'est par exemple à moi de générer puis envoyer le mot de contrôle en hexadécimal pour par exemple activer les vibrations de la Wiimote. Mais bref. Là ça marche mieux.

Problèmes & Solutions techniques

 Et même quelques questions au niveau du cahier des charges : est-ce que veux pouvoir distinguer un état de clic, et de non clic quand le doigt bouge ? Sinon c'est assez simple : pas de spot visible (doigt baissé, la caméra ne peut pas voir la diode) > rien du tout, spot visible > clic à cet endroit. C'est par exemple la technique utilisé par Johnny Chung Lee (mais qui lui utilise des réflecteurs sur le bout des doigts, et un énorme panneau pour éclairer ces réflecteurs, voir la vidéo), un des premiers à avoir utilisé la Wiimote comme caméra IR. (voir son site en bas d'article)
 Mais si je ne veux pas être obligé de replier le doigt complètement dès que je ne veux plus cliquer, il faut pouvoir distinguer le moment de clic...
  1. Première solution : placer une seconde Wiimote perpendiculairement à la première, sur le côté, et détecter le moment où le doigt avance vers l'écran. L'ennui, c'est que les diodes n'émettent que très peu sur les côtés (donc avec un angle très réduit), et la seconde Wiimote ne voit rien du tout. On pourrait placer une deuxième diode perpendiculairement pour palier à ce problème, mais à chaque doigt ça devient encombrant et pas pratique du tout.
  2. Seconde solution : placer les deux Wiimotes de chaque côté de l'écran, légèrement incliné vers l'utilisateur : on obtient ainsi la profondeur en restant dans l'angle d'émission de la diode. Le problème, c'est qu'au niveau calculs, j'ai un peu du mal à suivre, même si c'est la piste que je privilégie pour le moment.
  3. Troisième solution : utiliser une méthode foireuse, style dès que le spot descend un petit coup puis remonte dans un délai très bref, exactement comme si on avait cliqué avec une souris, mais faut abandonner le cliquer-déplacer; ou encore dès que le spot grossit (on se rapproche de la caméra), mais si mon doigt se tourne sur le côté, et qu'il repointe ensuite la caméra, le spot va grossir puisqu'elle re-rentrera dans le cône d'émission de la diode (défini par son angle d'émission); etc...

[CETTE SECTION EST ENCORE EN COURS D'ECRITURE]


Références :
Johnny Chung Lee, et quelques applications de la caméra IR : http://johnnylee.net/projects/wii/ (la dernière vidéo de Head Tracking est particulièrement impressionnante).