middleware/src/MainModule/KinectMain.cs
changeset 17 fda26bfcabef
parent 16 a9ebacd6c089
child 27 6c08d4d7219e
equal deleted inserted replaced
16:a9ebacd6c089 17:fda26bfcabef
    28 using System.Linq;
    28 using System.Linq;
    29 using System.Windows.Documents;
    29 using System.Windows.Documents;
    30 using Microsoft.Kinect;
    30 using Microsoft.Kinect;
    31 using Trakers.Communication;
    31 using Trakers.Communication;
    32 using Trakers.MainModule.Events;
    32 using Trakers.MainModule.Events;
    33 using Trakers.MainModule.Gestures;
    33 using Trakers.Tracking.Search;
    34 using Trakers.MainModule.Search;
       
    35 using Trakers.Debug;
    34 using Trakers.Debug;
    36 using System.Windows;
    35 using System.Windows;
       
    36 using Trakers.Tracking.Gestures;
       
    37 using Trakers.Tracking.Postures;
    37 
    38 
    38 namespace Trakers.MainModule
    39 namespace Trakers.MainModule
    39 {
    40 {
    40     //Il s'agit des fonctions permettant d'appeler les fonctions des événements Main droite/gauche entre/quitte le champ.
    41     //Il s'agit des fonctions permettant d'appeler les fonctions des événements Main droite/gauche entre/quitte le champ.
    41     public delegate void LeftHandTrackedHandler(object o, LeftHandTrackedEventArgs e);
    42     public delegate void LeftHandTrackedHandler(object o, LeftHandTrackedEventArgs e);
    42     public delegate void RightHandTrackedHandler(object o, RightHandTrackedEventArgs e);
    43     public delegate void RightHandTrackedHandler(object o, RightHandTrackedEventArgs e);
    43     public delegate void LeftHandQuitHandler(object o, LeftHandQuitEventArgs e);
    44     public delegate void LeftHandQuitHandler(object o, LeftHandQuitEventArgs e);
    44     public delegate void RightHandQuitHandler(object o, RightHandQuitEventArgs e);
    45     public delegate void RightHandQuitHandler(object o, RightHandQuitEventArgs e);
       
    46 
       
    47     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Bend.
       
    48     public delegate void BendHandler(object o, BendEventArgs e);
       
    49     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Cross.
       
    50     public delegate void CrossHandler(object o, CrossEventArgs e);
       
    51     //Il s'agit de la fonction permettant d'appeler les fonctions des événements KneeUp.
       
    52     public delegate void KneeUpHandler(object o, KneeUpEventArgs e);
       
    53 
    45     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Swipe left/right/up/down.
    54     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Swipe left/right/up/down.
    46     public delegate void SwipeHandler(object o, SwipeEventArgs e);
    55     public delegate void SwipeHandler(object o, SwipeEventArgs e);
    47     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull.
    56     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull.
    48     public delegate void PushHandler(object o, PushEventArgs e);
    57     public delegate void PushHandler(object o, PushEventArgs e);
    49     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump.
    58     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump.
    50     public delegate void JumpHandler(object o, JumpEventArgs e);
    59     public delegate void JumpHandler(object o, JumpEventArgs e);
       
    60     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave.
       
    61     public delegate void WaveHandler(object o, WaveEventArgs e);
       
    62     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle.
       
    63     public delegate void CircleHandler(object o, CircleEventArgs e);
    51     //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité.
    64     //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité.
    52     public delegate void UserPositionHandler(object o, UserPositionEventArgs e);
    65     public delegate void UserPositionHandler(object o, UserPositionEventArgs e);
    53 
    66 
    54     public class KinectMain
    67     public class KinectMain
    55     {
    68     {
    56         //Fenêtre de debug.
    69         //Fenêtre de debug.
    57         private DebugWindow debug;
    70         private DebugWindow debug;
    58         //Fenêtre de paramètres.
       
    59         private DebugParameters parameters;
       
    60         //Squelettes (Il y en a 6 par défaut).
    71         //Squelettes (Il y en a 6 par défaut).
    61         private Skeleton[] skeletons;
    72         private Skeleton[] skeletons;
    62         //Caméra infrarouge (sensor) de la Kinect.
    73         //Caméra infrarouge (sensor) de la Kinect.
    63         private KinectSensor kinectSensor;
    74         private KinectSensor kinectSensor;
       
    75 
       
    76         //Détecteur de penchés.
       
    77         private BendDetector bendDetector;
       
    78         //Détecteur de croisement de bras en X.
       
    79         private CrossDetector crossDetector;
       
    80         //Détecteur de levé de genou.
       
    81         private KneeUpDetector kneeUpDetector;
    64 
    82 
    65         //Détecteur de swipes.
    83         //Détecteur de swipes.
    66         private SwipeDetector swipeDetector;
    84         private SwipeDetector swipeDetector;
    67         //Détecteur de pushes.
    85         //Détecteur de pushes.
    68         private PushDetector pushDetector;
    86         private PushDetector pushDetector;
    69         //Détecteur de jumps.
    87         //Détecteur de jumps.
    70         private JumpDetector jumpDetector;
    88         private JumpDetector jumpDetector;
       
    89         //Détecteur de waves.
       
    90         private WaveDetector waveDetector;
       
    91         //Détecteur de cercles.
       
    92         private CircleDetector circleDetector;
    71         //Détecteur de proximité.
    93         //Détecteur de proximité.
    72         private UserPositionDetector userPositionDetector;
    94         private UserPositionDetector userPositionDetector;
    73 
    95 
    74         //Serveur TUIO pour la connexion du Middleware vers le Front Atelier.
    96         //Serveur TUIO pour la connexion du Middleware vers le Front Atelier.
    75         private Server server;
    97         private Server server;
    80         //Les événements des mains pour la recherche.
   102         //Les événements des mains pour la recherche.
    81         public static event LeftHandTrackedHandler LeftHandTrackedEvent;
   103         public static event LeftHandTrackedHandler LeftHandTrackedEvent;
    82         public static event RightHandTrackedHandler RightHandTrackedEvent;
   104         public static event RightHandTrackedHandler RightHandTrackedEvent;
    83         public static event LeftHandQuitHandler LeftHandQuitEvent;
   105         public static event LeftHandQuitHandler LeftHandQuitEvent;
    84         public static event RightHandQuitHandler RightHandQuitEvent;
   106         public static event RightHandQuitHandler RightHandQuitEvent;
       
   107 
       
   108         //L'événement bend.
       
   109         public static event BendHandler BendEvent;
       
   110         //L'événement cross.
       
   111         public static event CrossHandler CrossEvent;
       
   112         //L'événement kneeUp.
       
   113         public static event KneeUpHandler KneeUpEvent;
       
   114 
    85         //L'événement swipe.
   115         //L'événement swipe.
    86         public static event SwipeHandler SwipeEvent;
   116         public static event SwipeHandler SwipeEvent;
    87         //L'événement push.
   117         //L'événement push.
    88         public static event PushHandler PushEvent;
   118         public static event PushHandler PushEvent;
    89         //L'événement jump.
   119         //L'événement jump.
    90         public static event JumpHandler JumpEvent;
   120         public static event JumpHandler JumpEvent;
       
   121         //L'événement wave.
       
   122         public static event WaveHandler WaveEvent;
       
   123         //L'événement circle.
       
   124         public static event CircleHandler CircleEvent;
    91         //L'événement l'utilisateur se déplace dans la zone de détection.
   125         //L'événement l'utilisateur se déplace dans la zone de détection.
    92         public static event UserPositionHandler UserPositionEvent;
   126         public static event UserPositionHandler UserPositionEvent;
    93 
   127 
    94         /*
   128         /*
    95         *  Initialisation de la classe principale.
   129         *  Initialisation de la classe principale.
    99         public KinectMain()
   133         public KinectMain()
   100         {
   134         {
   101             //On crée la fenêtre de debug.
   135             //On crée la fenêtre de debug.
   102             debug = new DebugWindow();
   136             debug = new DebugWindow();
   103 
   137 
       
   138             //On crée les détecteurs de postures.
       
   139             bendDetector = new BendDetector(debug);
       
   140             crossDetector = new CrossDetector(debug);
       
   141             kneeUpDetector = new KneeUpDetector(debug);
       
   142 
   104             //On crée les détecteurs de gestes.
   143             //On crée les détecteurs de gestes.
   105             swipeDetector = new SwipeDetector();
   144             swipeDetector = new SwipeDetector(debug);
   106             pushDetector = new PushDetector();
   145             pushDetector = new PushDetector(debug);
   107             jumpDetector = new JumpDetector();
   146             jumpDetector = new JumpDetector(debug);
       
   147             waveDetector = new WaveDetector(debug);
       
   148             circleDetector = new CircleDetector(debug);
   108             //On crée le détecteur de proximité.
   149             //On crée le détecteur de proximité.
   109             userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands());
   150             userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands());
   110 
   151 
   111             //On connecte le serveur à l'adresse locale sur le port 80.
   152             //On connecte le serveur à l'adresse locale sur le port 80.
   112             try
   153             try
   197 
   238 
   198             //Fonction appelée lorsque la main droite quitte le champ de recherche.
   239             //Fonction appelée lorsque la main droite quitte le champ de recherche.
   199             RightHandQuitListener rightHandQuitListener = new RightHandQuitListener();
   240             RightHandQuitListener rightHandQuitListener = new RightHandQuitListener();
   200             RightHandQuitEvent += new RightHandQuitHandler(rightHandQuitListener.showAndSend);
   241             RightHandQuitEvent += new RightHandQuitHandler(rightHandQuitListener.showAndSend);
   201 
   242 
       
   243             //Fonction appelée lorsque l'utilisateur se penche.
       
   244             BendListener bendListener = new BendListener();
       
   245             BendEvent += new BendHandler(bendListener.showAndSend);
       
   246 
       
   247             //Fonction appelée lorsque l'utilisateur croise les bras en X.
       
   248             CrossListener crossListener = new CrossListener();
       
   249             CrossEvent += new CrossHandler(crossListener.showAndSend);
       
   250 
       
   251             //Fonction appelée lorsque l'utilisateur lève le genou.
       
   252             KneeUpListener kneeUpListener = new KneeUpListener();
       
   253             KneeUpEvent += new KneeUpHandler(kneeUpListener.showAndSend);
       
   254 
   202             //Fonction appelée lorsque l'utilisateur effectue un Swipe right/left/up/down.
   255             //Fonction appelée lorsque l'utilisateur effectue un Swipe right/left/up/down.
   203             SwipeListener swipeListener = new SwipeListener();
   256             SwipeListener swipeListener = new SwipeListener();
   204             SwipeEvent += new SwipeHandler(swipeListener.showAndSend);
   257             SwipeEvent += new SwipeHandler(swipeListener.showAndSend);
   205 
   258 
   206             //Fonction appelée lorsque l'utilisateur effectue un Push/Pull.
   259             //Fonction appelée lorsque l'utilisateur effectue un Push/Pull.
   208             PushEvent += new PushHandler(pushListener.showAndSend);
   261             PushEvent += new PushHandler(pushListener.showAndSend);
   209 
   262 
   210             //Fonction appelée lorsque l'utilisateur effectue un Jump.
   263             //Fonction appelée lorsque l'utilisateur effectue un Jump.
   211             JumpListener jumpListener = new JumpListener();
   264             JumpListener jumpListener = new JumpListener();
   212             JumpEvent += new JumpHandler(jumpListener.showAndSend);
   265             JumpEvent += new JumpHandler(jumpListener.showAndSend);
       
   266 
       
   267             //Fonction appelée lorsque l'utilisateur effectue un Wave.
       
   268             WaveListener waveListener = new WaveListener();
       
   269             WaveEvent += new WaveHandler(waveListener.showAndSend);
       
   270 
       
   271             //Fonction appelée lorsque l'utilisateur effectue un Circle.
       
   272             CircleListener circleListener = new CircleListener();
       
   273             CircleEvent += new CircleHandler(circleListener.showAndSend);
   213 
   274 
   214             //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection.
   275             //Fonction appelée lorsque l'utilisateur se déplace dans la zone de détection.
   215             UserPositionListener userPositionListener = new UserPositionListener();
   276             UserPositionListener userPositionListener = new UserPositionListener();
   216             UserPositionEvent += new UserPositionHandler(userPositionListener.showAndSend);
   277             UserPositionEvent += new UserPositionHandler(userPositionListener.showAndSend);
   217 
   278 
   400                 joints.Insert((int)JointType.HipRight, hipRight);
   461                 joints.Insert((int)JointType.HipRight, hipRight);
   401                 joints.Insert((int)JointType.KneeRight, kneeRight);
   462                 joints.Insert((int)JointType.KneeRight, kneeRight);
   402                 joints.Insert((int)JointType.AnkleRight, ankleRight);
   463                 joints.Insert((int)JointType.AnkleRight, ankleRight);
   403                 joints.Insert((int)JointType.FootRight, footRight);
   464                 joints.Insert((int)JointType.FootRight, footRight);
   404                 GestureDetector.UpdateSkeletonHistory(joints);
   465                 GestureDetector.UpdateSkeletonHistory(joints);
       
   466                 PostureDetector.UpdateSkeletonState(joints);
   405 
   467 
   406                 //Si la main gauche est dans le champ, on lance l'événement approprié.
   468                 //Si la main gauche est dans le champ, on lance l'événement approprié.
   407                 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands())
   469                 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands())
   408                 {
   470                 {
   409                     LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z);
   471                     LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z);
   410                     OnLeftHandTrackedEvent(leftHandTrackedEvent);
   472                     OnLeftHandTrackedEvent(leftHandTrackedEvent);
       
   473                     /*if (circleDetector.CheckForLeftCircle())
       
   474                     {
       
   475                         CircleEventArgs circleEvent = new CircleEventArgs(server, debug);
       
   476                         OnCircleEvent(circleEvent);
       
   477                     }*/
   411                 }
   478                 }
   412                 //Si la main gauche quitte le champ, on lance l'événement approprié.
   479                 //Si la main gauche quitte le champ, on lance l'événement approprié.
   413                 else
   480                 else
   414                 {
   481                 {
   415                     LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug);
   482                     LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug);
   418                 //Si la main droite est dans le champ, on lance l'événement approprié.
   485                 //Si la main droite est dans le champ, on lance l'événement approprié.
   419                 if (handRight.Position.Z < debug.getMaxDistHands() && handRight.Position.Z > debug.getMinDistHands())
   486                 if (handRight.Position.Z < debug.getMaxDistHands() && handRight.Position.Z > debug.getMinDistHands())
   420                 {
   487                 {
   421                     RightHandTrackedEventArgs rightHandTrackedEvent = new RightHandTrackedEventArgs(server, debug, handRight, handRight.Position.Z);
   488                     RightHandTrackedEventArgs rightHandTrackedEvent = new RightHandTrackedEventArgs(server, debug, handRight, handRight.Position.Z);
   422                     OnRightHandTrackedEvent(rightHandTrackedEvent);
   489                     OnRightHandTrackedEvent(rightHandTrackedEvent);
       
   490                     /*if (circleDetector.CheckForRightCircle())
       
   491                     {
       
   492                         CircleEventArgs circleEvent = new CircleEventArgs(server, debug);
       
   493                         OnCircleEvent(circleEvent);
       
   494                         //Console.Out.WriteLine("CIRCLE");
       
   495                     }*/
   423                 }
   496                 }
   424                 //Si la main droite quitte le champ, on lance l'événement approprié.
   497                 //Si la main droite quitte le champ, on lance l'événement approprié.
   425                 else
   498                 else
   426                 {
   499                 {
   427                     RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug);
   500                     RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug);
   428                     OnRightHandQuitEvent(rightHandQuitEvent);
   501                     OnRightHandQuitEvent(rightHandQuitEvent);
       
   502                 }
       
   503 
       
   504                 //Si l'utilisateur s'est penché.
       
   505                 if (bendDetector.CheckForBend())
       
   506                 {
       
   507                     BendEventArgs bendEvent = new BendEventArgs(server, debug);
       
   508                     OnBendEvent(bendEvent);
       
   509                 }
       
   510 
       
   511                 //Si l'utilisateur a croisé les bras en X.
       
   512                 if (crossDetector.CheckForCross())
       
   513                 {
       
   514                     CrossEventArgs crossEvent = new CrossEventArgs(server, debug);
       
   515                     OnCrossEvent(crossEvent);
       
   516                 }
       
   517 
       
   518                 //Si l'utilisateur a levé le genou.
       
   519                 if (kneeUpDetector.CheckForKneeUp())
       
   520                 {
       
   521                     KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug);
       
   522                     OnKneeUpEvent(kneeUpEvent);
   429                 }
   523                 }
   430 
   524 
   431                 //Si l'utilisateur effectue un swipe left.
   525                 //Si l'utilisateur effectue un swipe left.
   432                 if (swipeDetector.CheckForSwipeLeft())
   526                 if (swipeDetector.CheckForSwipeLeft())
   433                 {
   527                 {
   453                 //Si l'utilisateur effectue un pull.
   547                 //Si l'utilisateur effectue un pull.
   454                 if ((handPush = pushDetector.CheckForPull()) != PushDetector.Hand.NONE)
   548                 if ((handPush = pushDetector.CheckForPull()) != PushDetector.Hand.NONE)
   455                 {
   549                 {
   456                     PushEventArgs pushEvent = new PushEventArgs(server, debug, PushDetector.Direction.PULL, handPush);
   550                     PushEventArgs pushEvent = new PushEventArgs(server, debug, PushDetector.Direction.PULL, handPush);
   457                     OnPushEvent(pushEvent);
   551                     OnPushEvent(pushEvent);
       
   552                 }
       
   553 
       
   554                 //Si l'utilisateur effectue un wave.
       
   555                 if (waveDetector.CheckForWave())
       
   556                 {
       
   557                     WaveEventArgs waveEvent = new WaveEventArgs(server, debug);
       
   558                     OnWaveEvent(waveEvent);
       
   559                     Console.Out.WriteLine("WAVE");
   458                 }
   560                 }
   459 
   561 
   460                 //Si l'utilisateur se déplace dans la zone de détection.
   562                 //Si l'utilisateur se déplace dans la zone de détection.
   461                 //On traite le problème en plusieurs limites, on discrétise la zone.
   563                 //On traite le problème en plusieurs limites, on discrétise la zone.
   462                 if (first.TrackingState == SkeletonTrackingState.Tracked)
   564                 if (first.TrackingState == SkeletonTrackingState.Tracked)
   540             if (RightHandQuitEvent != null)
   642             if (RightHandQuitEvent != null)
   541                 RightHandQuitEvent(new object(), e);
   643                 RightHandQuitEvent(new object(), e);
   542         }
   644         }
   543 
   645 
   544         /*
   646         /*
       
   647         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se penche.
       
   648         */
       
   649         public static void OnBendEvent(BendEventArgs e)
       
   650         {
       
   651             if (BendEvent != null)
       
   652                 BendEvent(new object(), e);
       
   653         }
       
   654 
       
   655         /*
       
   656         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur croise les bras en X.
       
   657         */
       
   658         public static void OnCrossEvent(CrossEventArgs e)
       
   659         {
       
   660             if (CrossEvent != null)
       
   661                 CrossEvent(new object(), e);
       
   662         }
       
   663 
       
   664         /*
       
   665         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur lève le genou.
       
   666         */
       
   667         public static void OnKneeUpEvent(KneeUpEventArgs e)
       
   668         {
       
   669             if (KneeUpEvent != null)
       
   670                 KneeUpEvent(new object(), e);
       
   671         }
       
   672 
       
   673         /*
   545         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un swipe right.
   674         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un swipe right.
   546         */
   675         */
   547         public static void OnSwipeEvent(SwipeEventArgs e)
   676         public static void OnSwipeEvent(SwipeEventArgs e)
   548         {
   677         {
   549             if (SwipeEvent != null)
   678             if (SwipeEvent != null)
   567             if (JumpEvent != null)
   696             if (JumpEvent != null)
   568                 JumpEvent(new object(), e);
   697                 JumpEvent(new object(), e);
   569         }
   698         }
   570 
   699 
   571         /*
   700         /*
       
   701         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle.
       
   702         */
       
   703         public static void OnCircleEvent(CircleEventArgs e)
       
   704         {
       
   705             if (CircleEvent != null)
       
   706                 CircleEvent(new object(), e);
       
   707         }
       
   708 
       
   709         /*
       
   710         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un wave.
       
   711         */
       
   712         public static void OnWaveEvent(WaveEventArgs e)
       
   713         {
       
   714             if (WaveEvent != null)
       
   715                 WaveEvent(new object(), e);
       
   716         }
       
   717 
       
   718         /*
   572         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se déplace
   719         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur se déplace
   573          *  dans la zone de détection.
   720          *  dans la zone de détection.
   574         */
   721         */
   575         public static void OnUserPositionEvent(UserPositionEventArgs e)
   722         public static void OnUserPositionEvent(UserPositionEventArgs e)
   576         {
   723         {