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