Gestes Kinect

De Wiki de Projets IMA

Projet Kinect

Sujet

Kinect.jpg

https://twiki.polytech-lille.fr/cgi-bin/view/Main/XavierRedonProjets2010Kinect

"Vous développerez ensuite un programme permettant de récupérer et analyser les gestes d'un utilisateur face à une vitrine. Les opérations de l'utilisateur seront: sélectionner un objet, annuler la sélection, afficher les informations d'un objet sélectionné sur un grand écran, afficher un comparatif entre différents objets sélectionné. Le feedback de la sélection des objets sera assuré par des LED positionnées sous chaque objet."

Objectifs initial

- Un utilisateur voulant utiliser le système devrait faire un petit coucou à la caméra (ensuite, comme le sujet le demande, il pourrait pointer vers un objet, puis vers plusieurs pour afficher un comparatif etc...)
- Si plusieurs utilisateurs souhaitent utiliser le système, le premier présent à en faire la demandea la priorité. Ensuite, un ordre est donné aux utilisateurs suivants.
- Chaque utilisateur se voit donné un certain temps d'utilisation du système. La mise en place d'un timer sera nécessaire.
- Si un utilisateur souhaite terminer sa session, il fait un signe X avec ses avants-bras ou sort du champ de la caméra.
- un écran pourrait afficher une image de tous les utilisateurs présents dans le champ de vision du kinect en affichant un numéro au-dessus de leurs petites têtes.

Objectifs atteint

- La limitation principale de ce sujet a été la nécessité de calibration imposée par l'API NITE et c'est cela qui nous a amenés à modifier la plupart de nos objectifs initiaux - Un utilisateur voulant utiliser le système doit se placer sur la croix afin de réaliser la calibration dans des meilleurs conditions possible </strong> (ensuite, comme le sujet le demande, il pourrait pointer vers un objet, puis vers plusieurs pour afficher un comparatif etc...)
- Si plusieurs utilisateurs souhaitent utiliser le système, il faut attendre que la personne en cours quitte l'environnement kinect grâce au geste qui est un signe X avec les avant-bras (l'utilisateur peut également sortir du champ de la caméra).
- Si un utilisateur souhaite terminer sa session, il fait un signe X avec ses avants-bras ou sort du champ de la caméra.
- un écran affiche une image de tous les utilisateurs présents dans le champ de vision du kinect avec seulement l'utilisateur principal d'une couleur différente.

Matériel

Matériel requis

- 1 kinect (disponible)
- plusieurs LEDs (au moins une pour chaque objet)
- micro-contrôleur Arduino
- système Foxboard
- ordinateur PC
- du talent (disponible)

Matériel finalement utilisé

La volonté d'améliorer l'aspect et les fonctionnalités de notre projet, nous ont amenés à utiliser plus de matériels que prévus

- 1 kinect
- 8 LEDs Bleu
- 8 petit abat-jour
- Système Foxboard
- Carte Phidget et 8 contacteurs
- 1 Thomas Vantroys
- 1 Xavier Redon
- Câbles/ralonge en tout genre : usb, vga, électrique etc...
- 2 écrans
- 2 tour de pc pour surélever les écrans
- 1 "grand" tapis de souris de la salle titus pour cacher les tours
- ordinateur PC
- Beaucoup de Scotch 3M Noir
- Nappe jetable Noir pour faire office de fond
- 1 armoir
- du talent

Références

HowTo Kinect : http://www.keyboardmods.com/2010/12/howto-kinect-openninite-skeleton.html
Source Code Mouse Kinect : http://www.keyboardmods.com/2010/12/howto-use-kinect-as-mouse-in-linux.html
Video Mouse Kinect : http://www.youtube.com/watch?v=-Hqu2DwnVok
Source OpenNI : https://github.com/OpenNI/OpenNI
Configuration Proxy Git : http://www.kernel.org/pub/software/scm/git/docs/git-config.html
Configuration Proxy Git : http://stackoverflow.com/questions/128035/how-do-i-pull-from-a-git-repository-through-an-http-proxy
Installation FAAST : http://projects.ict.usc.edu/mxr/faast/
Tuto FAAST : http://kinect-or.com/tuto-kinect/493-faast-004-dispo-tuto-appli-a-telecharger.html
Configuration fichiers XML pour NITE : http://groups.google.com/group/openni-dev/browse_thread/thread/c50238431e6dec4f
Affichage BMP : http://paulbourke.net/dataformats/bmp/
Bientot un SDK MS officiel : http://etudiants.frogz.fr/post/2011/02/22/Le-SDK-Kinect-disponible-au-printemps-2011.aspx
Utilisation de la kinect avec une vitrine réfrigérée : http://www.youtube.com/watch?v=7Szn3rDRzdo

Avancement du projet

Lundi 28 février 2011

 - Installation OpenNi
 - libusb manquant 
   => Installation libusb
 - version `GLIBC_2.12' not found avec la version binaire pour Ubuntu
   => Téléchargement Source Code OpenNi
 - Installation de git pour récupérer le Code Source
   => Paramètrage du proxy
 - Installation, paramétrage Nite
 - Problème d'execution

Jeudi 3 mars 2011

 - Pour limiter les problèmes, utilisation d'un nouveau PC à usage exclusif pour ce projet.
 - Création Makefile pour les Samples de OpenNI et Nite.
 - Etude, compilation des Samples.
   => Problème de FPS ( 2 fps )
 - Passage sous windows.
   => Affichage a 30 fps donc problème venant de notre compilation ou xml sous linux

Lundi 7 mars 2011

 - Problème de FPS résolu sur linux
   => Modification XML ( Id + Serial )
 - Création programme permettant de récupérer la distance entre le capteur et le centre de l'usager.
   => Modification : Annonce à l'utilisateur, s'il est bien positionné .
 - Etude, compilation, test du programme NiUserTracker.

Jeudi 10 mars 2011

 - Récupération des coordonnées 3D de la main droite et du coude droit.
 - Algo pour récupèrer les coordonnées de la zone visé.
 - Activation de la recherche de squelette uniquement dans une certaine zone.

Lundi 14 mars 2011

 - Implantation de la partie qui récupère les coordonnées de la zone visé.
 - Mesure de la position des "items"
 - Réalisation d'un quadrillage définissant les différents zones.
 - Test sur l'armoire avec les dvd Lost, Stargate ...
   => Test réussi : Lost affiché lorsqu'il est pointé.

Jeudi 17 mars 2011

 - Réalisation programme Arduino permettant d'allumer une led X grâce à une variable qui lui est envoyée par ZigBee.
 - Optimisation du système de calibrage.
 - Création d'une "libXbee" qui va permettre à notre programme kinect de dialoguer avec l'arduino.
 - Ajout fonction qui envoie un entier vers l'arduino lorsque qu'un item est pointé. ( Item 01 pointé => "1" envoyé à l'arduino )
 - Creation fonction qui permet de viser différents objets et récupérer lequel est visé

Lundi 21 mars 2011

 - Câblage de l'arduino dans l'armoire.
   => Utilisation des led bleu ainsi que des supports pour les leds.
 - Test réussi : 
   => Allumage des leds lorsque l'item est pointé.
 - Etude de la sélection d'un item ainsi que l'affichage de son descriptif sur un deuxième écran.
 - Optimisation algorithme pour la selection des objets

Jeudi 24 mars 2011

 - Réalisation d'un applet Java permettant d'afficher l'image souhaitée.
 - Réalisation Serveur/Client UDP en java pour dialoguer entre le programme et l'applet
 - Optimisation de la partie envoie de donnée par Zigbee :
   => 1 seule ouverture du port pour tous les envois
   => Suppression des Serial.print("xxx") pour ne pas "polluer" le réseau.
 - Modification de l'example initial pour n'afficher en couleur que l'utilisateur principal qui manipule (les autres restent gris).

Lundi 28 mars 2011

 - Abandon de l'idée d'affichage par la liaison UDP en utilisant java
 - Installation librairies de développement SDL
 - Réalisation d'un programme avec la lib SDL qui ouvre une fenêtre avec l'image souhaitée (image BMP)
 - Installation librairies SDL_image pour pouvoir charger des images de plusieurs formats
 - Optimisation algorithme pour selection.

Jeudi 31 mars 2011

 - Passage de Arduino vers FoxBoard+Phidget
 - Changement des LEDs pour des 12V
 - Modification de l'agencement des objets (objets autour de la camera).
 - Installation des drivers openKinect (freenect) pour permettre d'orienter la kinect.

Lundi 4 avril 2011

 - Modification de libXbee pour respecter la nouvelle forme des messages et ainsi,
   être compatible avec le nouveau système FoxBoard + Phidget 
     => 2 bits de poids forts = Etat de la LED ; 0 = eteint ; 1 = Allume ; 2 = Clignote 
     => 6 bits suivant = Numero de la LED
 - Test du programme :
   => Mauvais positionnement des Leds au premier étage
   => Inversion des états 0 et 1 ( Eteint/Allumé ) pour les LEDs 5,6
   => LED 7 non connecté donc impossible de tester
 - Modification des positionnements des LEDs sur la nappe pour respecter un ordre croissant
 - Modification branchement sur la carte Phidget pour les LEDs 5 et 6 :
   => Inversion câble NC -> NO
 - Transformation pour code pour le rendre plus modulaire

Mardi 5 avril 2011

 - Modification de libXbee :
   => Envoie de l'état des LEDs sous formes de matrice depuis le programme puis envoie séparé de chaque état.
 - Creation de la fonction pour allumer les bonnes LEDs en fonction de ce qui est pointé.

Jeudi 7 avril 2011

 - Amélioration du programme d'affichage pour être implanter avec le programme kinect
   => Affichage caractéristique en mode fullscreen
   => Chargement de 1 ou 2 images caractéristique
   => Mise en place de mutex

Lundi 11 avril 2011

 - Implantation de la partie affichage avec le programme kinect