# HG changeset patch # User bastiena # Date 1332148916 -3600 # Node ID d40f84d77db48e03896454fa5d35970a09b4bc64 # Parent f4e52a4c34b3b1f7e137b54d059ea53e11839904 Documentations (readme) Installer Deletion of useless comments and code lines diff -r f4e52a4c34b3 -r d40f84d77db4 .hgignore --- a/.hgignore Thu Mar 15 13:35:25 2012 +0100 +++ b/.hgignore Mon Mar 19 10:21:56 2012 +0100 @@ -6,3 +6,10 @@ front_processing/src/Trakers_gestures/code/* front_processing/src/Trakers/code/* front_processing/extern/TUIO_PROCESSING/library/* +front_processing/extern/TUIO_JAVA/TuioDemo.jar +front_processing/extern/TUIO_JAVA/libTUIO.jar +front_processing/src/Trakers/application.windows/lib/* +front_processing/src/Trakers_gestures/application.windows/lib/* +middleware/dist/Output/* +front_processing/src/Trakers_gestures/application.windows/Trakers_gestures.exe +front_processing/src/Trakers/application.windows/Trakers.exe diff -r f4e52a4c34b3 -r d40f84d77db4 front_processing/doc/readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_processing/doc/readme.txt Mon Mar 19 10:21:56 2012 +0100 @@ -0,0 +1,95 @@ +TraKERS (Tracking using Kinect and Extracting Robust Skeletons) est une interface basée sur la détection de gestures / positions du squelette envoyé par le SDK Microsoft (1.0) de Kinect. + +Auteur : Alexandre BASTIEN. + +I) TraKERS - Eléments requis : + +Dans cette partie, il vous faudra installer Processing, disponible ici : http://processing.org/download/ + +Vous les trouverez ici si vous le souhaitez : http://www.microsoft.com/en-us/kinectforwindows/develop/release-notes.aspx + +II) TraKERS - Structure : + +Dans le Front, se trouvent deux exécutables "Trakers" et "Trakers_gestures", respectivement pour le tracé de courbes via les coordonnées des positions des mains récupérées du Middleware et pour l'affichage des gestes détectés. Il aurait été possible de les rassembler en un programme, mais pour des raisons de clarté lors de l'utilisation, j'ai préféré procéder ainsi. + +III) TraKERS - Utilisation : + +Si le Middleware est lancé, le programme de Front lancé fait office de client, et récupère les notifications envoyées. Détaillons les deux programmes : + +A) Trakers +Comme indiqué plus haut, il reçoit et affiche les coordonnées des mains entrant dans le champ délimité par le Middleware. +Afin d'indiquer les limites de zone de dessin, un masque noir a été appliqué, et se met à jour. +Les notifications du client s'affichent en blanc en haut du masque, et indique si une ou deux mains sont détectées. +Lorsque l'on dessine, une série d'ellipses apparaissent à l'écran, formant des courbes. +Lorsque deux mains sont détectées, la gauche est rouge et l'autre verte. +Si une main et une seule est détectée, la courbe sera rouge. +Si la ou les mains s'approchent et atteignent une certaine proximité, le segment dessiné deviendra bleu à partir de ce moment-là. + +B) Trakers_gestures +Le même masque a été appliqué dans ce programme d'affichage de notifications de gestes indiqués par le Middleware. +Le programme indique simplement dans la partie supérieure du masque s'il détecte ou non une gesture, et s'il en détecte une, donne le code envoyé par le Middleware. + +IV) Fonctionnement : + +Les programmes sont découpés en fonctions, afin de rendre leur structure plus cohérente. + +Il existe deux fonctions principales sous Processing. +void setup(), qui permet d'initialiser des variables, la taille de la fenêtre, etc. +void draw(), qui est raffraichie constamment et sert principalement à dessiner ou faire appel aux fonctions amenées à être appelées toutes les N ms. +Il est bien entendu possible de dessiner via des fonctions déjà implémentées et prêtes à l'emploi, dont la documentation se trouve ici : + +http://processing.org/reference/ + +Ils reçoivent des messages OSC de la part du Middleware. Ceux-ci sont contenus dans des objets qui sont des TuioCursors (en 3D) pour gérer la position des mains et des TuioStrings (objets personnalisés, ajoutés aux dll client et serveur TUIO). + +Dans les programmes, les curseurs 3D sont principalement utilisés pour transmettre les coordonnées X, Y et Z (X et Y étant des pixels, et Z une distance en mètres). Les strings, quant à eux, ne véhiculent que de simples messages textuels. + +Ils sont envoyés par des listes présentes dans le client TUIO. + +Voici un bout de code expliquant comment obtenir la position des mains : + +TuioProcessing tuioClient; +tuioClient = new TuioProcessing(host, port; //host pourrait être this par défaut et port le numéro du port au format int. +//On récupère les curseurs. +Vector tuioCursorList = tuioClient.getTuioCursors(); +//Si aucune main n'est repérée. +if(tuioCursorList.size() <= 0) +{ + //fonction_1(); +} +//Si une main est repérée. +else if (tuioCursorList.size() == 1) +{ + TuioCursor cursor = (TuioCursor)tuioCursorList.elementAt(0); + //fonctionAffiche1Main(cursor); +} +//Si c'est les 2. +else if(tuioCursorList.size() == 2) +{ + //fonctionAffiche2Mains(tuioCursorList); +} + +Voici à présent comment extraire les positions d'une main, via un tuioCursor : + +//On obtient la liste des points (déplacements) du curseur TUIO. +Vector pointList = cursor.getPath(); +for (int j=0;j - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -r f4e52a4c34b3 -r d40f84d77db4 middleware/src/Communication/Server.cs --- a/middleware/src/Communication/Server.cs Thu Mar 15 13:35:25 2012 +0100 +++ b/middleware/src/Communication/Server.cs Mon Mar 19 10:21:56 2012 +0100 @@ -27,6 +27,9 @@ using System.Windows.Media.Media3D; using Trakers.Tracking.Events; using System.Timers; +using Trakers.Debug; +using System.Resources; +using System.Reflection; namespace Trakers.Communication { @@ -34,29 +37,30 @@ { //Serveur TUIO, provenant de la DLL TuioServer créé par Bespoke. private TuioServer server; + //Affichage de debug. + private DebugWindow debug; //Permet de savoir si un curseur pour la main gauche/droite a été créé. private bool leftHandCursorCreated; private bool rightHandCursorCreated; private bool messageCreated; private bool gestureLocked; - + //Intervalle minimum entre les gestures. private int timerElapsing; - - System.Timers.Timer _timer; + //Timer. + private System.Timers.Timer _timer; + //Gestionnaire de ressources. + private ResourceManager rm; /* * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs * ne sont pas créés et on indique au ThreadPool une fonction de callback de manière à vérifier * s'il reçoit des notifications. */ - public Server(String host, int port, int _timerElapsing) + public Server(String host, int port, int _timerElapsing, DebugWindow _debug) { - //On démarre le serveur TUIO. - server = new TuioServer(host, port); - //On initialise le threadPool (appelé toutes les N ms). - ThreadPool.QueueUserWorkItem(ThreadPoolCallback); - + debug = _debug; + rm = new ResourceManager("Trakers.Properties.resources", Assembly.GetExecutingAssembly()); //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée. leftHandCursorCreated = false; rightHandCursorCreated = false; @@ -65,10 +69,22 @@ timerElapsing = _timerElapsing; - //On instancie le timer à N ms. - _timer = new System.Timers.Timer(timerElapsing); - //Dès que le timer est expiré, on appelle _timer_Elapsed. - _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); + try + { + //On démarre le serveur TUIO. + server = new TuioServer(host, port); + //On initialise le threadPool (appelé toutes les N ms). + ThreadPool.QueueUserWorkItem(ThreadPoolCallback); + + //On instancie le timer à N ms. + _timer = new System.Timers.Timer(timerElapsing); + //Dès que le timer est expiré, on appelle _timer_Elapsed. + _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); + } + catch (Exception) + { + debug.ExceptionLbl.Content = rm.GetString("serverCantStart"); + } } /* @@ -95,7 +111,6 @@ */ public void LeftHandTracked(object sender, LeftHandTrackedEventArgs e) { - return; //Si le curseur de la main gauche n'est pas créé, alors on le crée. if (!leftHandCursorCreated) { @@ -114,19 +129,16 @@ */ public void RightHandTracked(object sender, RightHandTrackedEventArgs e) { - return; //Si le curseur de la main droite n'est pas créé, alors on le crée. if (!rightHandCursorCreated) { server.AddTuioCursor(1, SkeletonPointToPoint3D(e.handJoint.Position)); - //server.AddTuioString(1, "BOO"); rightHandCursorCreated = true; } //S'il existe, on le met simplement à jour. else { server.UpdateTuioCursor(1, SkeletonPointToPoint3D(e.handJoint.Position)); - //server.UpdateTuioString(1, "BOO"); } } @@ -135,7 +147,6 @@ */ public void LeftHandQuit(object sender, LeftHandQuitEventArgs e) { - return; //Si le curseur de la main gauche existe, alors on le supprime. if (leftHandCursorCreated) { @@ -149,12 +160,10 @@ */ public void RightHandQuit(object sender, RightHandQuitEventArgs e) { - return; //Si le curseur de la main droite existe, alors on le supprime. if (rightHandCursorCreated) { server.DeleteTuioCursor(1); - //server.DeleteTuioString(1); rightHandCursorCreated = false; } } @@ -191,8 +200,6 @@ else hand = "BOTH"; - Console.Out.WriteLine(pushPull + "-" + hand); - GesturePerformed(pushPull + "-" + hand); } @@ -210,7 +217,7 @@ if (!messageCreated) { messageCreated = true; - server.AddTuioString(1, code); + server.AddTuioString(2, code); //On démarre le timer. _timer.Start(); } @@ -246,7 +253,7 @@ { //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. messageCreated = false; - server.DeleteTuioString(1); + server.DeleteTuioString(2); } } } diff -r f4e52a4c34b3 -r d40f84d77db4 middleware/src/Debug/DebugParameters.xaml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/middleware/src/Debug/DebugParameters.xaml Mon Mar 19 10:21:56 2012 +0100 @@ -0,0 +1,62 @@ + + + + + +