middleware/src/Tracking/Gestures/JumpDetector.cs
author bastiena
Tue, 20 Mar 2012 18:00:55 +0100
changeset 7 8a21bec5d45f
parent 5 d40f84d77db4
child 8 e4e7db2435f8
permissions -rw-r--r--
Middleware : No proximity bugs anymore. The skeleton disappear if a tracked person is too close or not tracked anymore. Processing : There are no laggs anymore when an user stay too long moving his hands and drawing tons of ellipses. (TUIO Cursors are not taken by their vectors, only the last position of the cursors are caught to be drawn).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     1
/*
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     2
 * Projet : TraKERS
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     3
 * Module : MIDDLEWARE
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     4
 * Sous-Module : Tracking/Gestures
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     5
 * Classe : JumpDetector
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     6
 * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     7
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     8
 * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     9
 * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    10
 * des règles appliquées à la positions des noeuds dans le temps.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    11
 * 
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    12
 * P.S : Cette partie est encore en développement.
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    13
 */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    14
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    15
using System;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    16
using System.Collections.Generic;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    17
using System.Linq;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    18
using System.Text;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    19
using Microsoft.Kinect;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    20
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    21
namespace Trakers.Tracking.Gestures
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    22
{
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    23
    public class JumpDetector : GestureDetector
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    24
    {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    25
        Debug.DebugWindow debug;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    26
        static int n = 0;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    27
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    28
        public JumpDetector(Debug.DebugWindow _d) : base()
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    29
        {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    30
            debug = _d;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    31
            gesturePeriod = (float)1;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    32
            indexesPerSecond = 30;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    33
            indexesToCheck = (int)(gesturePeriod * indexesPerSecond);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    34
        }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    35
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    36
        /*
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    37
         * Lit les noeuds de l'historique du squelette afin de détecter un Jump.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    38
         * Règles :
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    39
         * .
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    40
         */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    41
        public bool CheckForJump()
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    42
        {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    43
            //Crée un historique de squelette local, puisque l'historique est mis à jour toutes les ~1/30 s.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    44
            List<List<Joint>> localHistory = new List<List<Joint>>(history);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    45
            
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    46
            //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    47
            if (localHistory.Count < indexesToCheck)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    48
                return false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    49
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    50
            /* (HeadBelowBaseLine || LeftKneeBelowBaseLine || RightKneeBelowBaseLine ||
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    51
             * LeftAnkleBelowBaseLine || RightAnkleBelowBaseLine || BodyFaceUpwards
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    52
             * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    53
             * NOT
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    54
             * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    55
             * AND
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    56
             * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    57
             * HeadAboveBaseLine && LeftKneeAboveBaseLine && RightKneeAboveBaseLine &&
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    58
             * LegsStraightPreviouslyBent)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    59
             * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    60
             * OR
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    61
             * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    62
             * HeadFarAboveBaseLine
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    63
             */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    64
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    65
            //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    66
            refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    67
            //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    68
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    69
            int beginIdx = localHistory.Count - indexesToCheck + 1;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    70
            int middleIdx = localHistory.Count - indexesToCheck / 2;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    71
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    72
            //bool middleOK = true
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    73
            bool topOfJump = false;
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    74
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    75
            
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    76
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    77
            //De la position p1 à pn, on suit l'algorithme.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    78
            for (int i = beginIdx ; i < localHistory.Count ; i++)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    79
            {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    80
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    81
                if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[beginIdx][(int)JointType.HandRight].Position.Y + refDistance &&
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    82
                   localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    83
                {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    84
                    topOfJump = true;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    85
                    //Console.Out.WriteLine("TOP");
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    86
                }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    87
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    88
                if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y && !topOfJump)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    89
                    return false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    90
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    91
                //Si la position Y de la main est plus haute que la tête
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    92
                //OU si la position Y de la main est plus basse que la hanche
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    93
                //OU si la nouvelle position Z de la main est moins profonde que la précédente
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    94
                //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    95
                //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    96
                //Alors la main en question ne fait pas de push.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    97
                if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y &&
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    98
                    topOfJump || localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y &&
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    99
                    !topOfJump)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   100
                    return false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   101
            }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   102
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   103
            //Console.Out.WriteLine("OK");
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   104
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   105
            //Si la distance en Z du geste a été plus courte que la distance N
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   106
            //Alors on retourne faux.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   107
            //float dist = (localHistory[localHistory.Count - 1][handRightID].Position.X - localHistory[localHistory.Count - indexesToCheck][handRightID].Position.X);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   108
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   109
            //Console.WriteLine(Math.Abs(localHistory[0][handLeftID].Position.Z - localHistory[localHistory.Count - indexesToCheck][handLeftID].Position.Z) * 100 + " " + refDistance);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   110
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   111
            //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   112
            //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   113
            //Alors on retourne faux.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   114
            
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   115
            //On supprime l'historique local.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   116
            
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   117
            debug.ExceptionLbl.Background = System.Windows.Media.Brushes.Yellow;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   118
            
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   119
            return false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   120
        }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   121
    }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   122
}