middleware/src/MainModule/KinectMain.cs
changeset 37 37ebedd84755
parent 28 9ccef81f02ab
child 41 d2f735d7763f
equal deleted inserted replaced
36:25e71ada2a6d 37:37ebedd84755
     4 * (c) IRI <http://www.iri.centrepompidou.fr/>
     4 * (c) IRI <http://www.iri.centrepompidou.fr/>
     5 *
     5 *
     6 * For the full copyright and license information, please view the LICENSE
     6 * For the full copyright and license information, please view the LICENSE
     7 * file that was distributed with this source code.
     7 * file that was distributed with this source code.
     8 */
     8 */
     9 
       
    10 /*
     9 /*
    11  * Projet : TraKERS
    10  * Projet : TraKERS
    12  * Module : MIDDLEWARE
    11  * Module : MIDDLEWARE
    13  * Sous-Module : Tracking
    12  * Sous-Module : Tracking
    14  * Classe : KinectMain
    13  * Classe : KinectMain
    20  * noeuds de son squelette. Lance des événements lorsque la main gauche/droite entre dans/quitte le champ.
    19  * noeuds de son squelette. Lance des événements lorsque la main gauche/droite entre dans/quitte le champ.
    21  * Envoie des données au sous-module de debug de manière a afficher un retour visuel sur la position de l'utilisateur,
    20  * Envoie des données au sous-module de debug de manière a afficher un retour visuel sur la position de l'utilisateur,
    22  * son squelette, la détection de ses mains.
    21  * son squelette, la détection de ses mains.
    23  * Découpe l'interaction avec le middleware en différents modes.
    22  * Découpe l'interaction avec le middleware en différents modes.
    24  */
    23  */
    25 
       
    26 using System;
    24 using System;
    27 using System.Collections.Generic;
    25 using System.Collections.Generic;
    28 using System.Linq;
    26 using System.Linq;
    29 using System.Windows.Documents;
    27 using System.Windows;
    30 using Microsoft.Kinect;
    28 using Microsoft.Kinect;
    31 using Trakers.Communication;
    29 using Trakers.Communication;
       
    30 using Trakers.Debug;
    32 using Trakers.MainModule.Events;
    31 using Trakers.MainModule.Events;
    33 using Trakers.Tracking.Search;
       
    34 using Trakers.Debug;
       
    35 using System.Windows;
       
    36 using Trakers.Tracking.Gestures;
    32 using Trakers.Tracking.Gestures;
    37 using Trakers.Tracking.Postures;
    33 using Trakers.Tracking.Postures;
    38 
    34 
    39 namespace Trakers.MainModule
    35 namespace Trakers.MainModule
    40 {
    36 {
    55     public delegate void SwipeHandler(object o, SwipeEventArgs e);
    51     public delegate void SwipeHandler(object o, SwipeEventArgs e);
    56     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull.
    52     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Push/Pull.
    57     public delegate void PushHandler(object o, PushEventArgs e);
    53     public delegate void PushHandler(object o, PushEventArgs e);
    58     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump.
    54     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Jump.
    59     public delegate void JumpHandler(object o, JumpEventArgs e);
    55     public delegate void JumpHandler(object o, JumpEventArgs e);
       
    56     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Fall.
       
    57     public delegate void FallHandler(object o, FallEventArgs e);
    60     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave.
    58     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Wave.
    61     public delegate void WaveHandler(object o, WaveEventArgs e);
    59     public delegate void WaveHandler(object o, WaveEventArgs e);
    62     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle.
    60     //Il s'agit de la fonction permettant d'appeler les fonctions des événements Circle.
    63     public delegate void CircleHandler(object o, CircleEventArgs e);
    61     public delegate void CircleHandler(object o, CircleEventArgs e);
    64     //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité.
    62     //Il s'agit de la fonction permettant d'appeler les fonctions des événements de proximité.
    77         private BendDetector bendDetector;
    75         private BendDetector bendDetector;
    78         //Détecteur de croisement de bras en X.
    76         //Détecteur de croisement de bras en X.
    79         private CrossDetector crossDetector;
    77         private CrossDetector crossDetector;
    80         //Détecteur de levé de genou.
    78         //Détecteur de levé de genou.
    81         private KneeUpDetector kneeUpDetector;
    79         private KneeUpDetector kneeUpDetector;
       
    80         //Détecteur de position correcte.
       
    81         private CorrectPosture correctPostureDetector;
    82 
    82 
    83         //Détecteur de swipes.
    83         //Détecteur de swipes.
    84         private SwipeDetector swipeDetector;
    84         private SwipeDetector swipeDetector;
    85         //Détecteur de pushes.
    85         //Détecteur de pushes.
    86         private PushDetector pushDetector;
    86         private PushDetector pushDetector;
    87         //Détecteur de jumps.
    87         //Détecteur de jumps.
    88         private JumpDetector jumpDetector;
    88         private JumpDetector jumpDetector;
       
    89         //Détecteur de falls.
       
    90         private FallDetector fallDetector;
    89         //Détecteur de waves.
    91         //Détecteur de waves.
    90         private WaveDetector waveDetector;
    92         private WaveDetector waveDetector;
    91         //Détecteur de cercles.
    93         //Détecteur de cercles.
    92         private CircleDetector circleDetector;
    94         private CircleDetector circleDetector;
    93         //Détecteur de proximité.
    95         //Détecteur de proximité.
   116         public static event SwipeHandler SwipeEvent;
   118         public static event SwipeHandler SwipeEvent;
   117         //L'événement push.
   119         //L'événement push.
   118         public static event PushHandler PushEvent;
   120         public static event PushHandler PushEvent;
   119         //L'événement jump.
   121         //L'événement jump.
   120         public static event JumpHandler JumpEvent;
   122         public static event JumpHandler JumpEvent;
       
   123         //L'événement fall.
       
   124         public static event FallHandler FallEvent;
   121         //L'événement wave.
   125         //L'événement wave.
   122         public static event WaveHandler WaveEvent;
   126         public static event WaveHandler WaveEvent;
   123         //L'événement circle.
   127         //L'événement circle.
   124         public static event CircleHandler CircleEvent;
   128         public static event CircleHandler CircleEvent;
   125         //L'événement l'utilisateur se déplace dans la zone de détection.
   129         //L'événement l'utilisateur se déplace dans la zone de détection.
   137 
   141 
   138             //On crée les détecteurs de postures.
   142             //On crée les détecteurs de postures.
   139             bendDetector = new BendDetector(debug);
   143             bendDetector = new BendDetector(debug);
   140             crossDetector = new CrossDetector(debug);
   144             crossDetector = new CrossDetector(debug);
   141             kneeUpDetector = new KneeUpDetector(debug);
   145             kneeUpDetector = new KneeUpDetector(debug);
       
   146             correctPostureDetector = new CorrectPosture(debug);
   142 
   147 
   143             //On crée les détecteurs de gestes.
   148             //On crée les détecteurs de gestes.
   144             swipeDetector = new SwipeDetector(debug);
   149             swipeDetector = new SwipeDetector(debug);
   145             pushDetector = new PushDetector(debug);
   150             pushDetector = new PushDetector(debug);
   146             jumpDetector = new JumpDetector(debug);
   151             jumpDetector = new JumpDetector(debug);
       
   152             fallDetector = new FallDetector(debug);
   147             waveDetector = new WaveDetector(debug);
   153             waveDetector = new WaveDetector(debug);
   148             circleDetector = new CircleDetector(debug);
   154             circleDetector = new CircleDetector(debug);
   149             //On crée le détecteur de proximité.
   155             //On crée le détecteur de proximité.
   150             userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands());
   156             userPositionDetector = new UserPositionDetector(debug.getMinDist(), debug.getMaxDist(), debug.getZeroPoint(), debug.getMinDistHands(), debug.getMaxDistHands());
   151 
   157 
   164             //On écoute l'événement de clic sur le bouton on/off du debug.
   170             //On écoute l'événement de clic sur le bouton on/off du debug.
   165             //Car on lancera l'intitialisation/fermeture de la kinect.
   171             //Car on lancera l'intitialisation/fermeture de la kinect.
   166             debug.getSwitch().Click += new RoutedEventHandler(Switch_ClickInKinectMain);
   172             debug.getSwitch().Click += new RoutedEventHandler(Switch_ClickInKinectMain);
   167             debug.Loaded += new RoutedEventHandler(Window_LoadedInKinectMain);
   173             debug.Loaded += new RoutedEventHandler(Window_LoadedInKinectMain);
   168             debug.Closed += new EventHandler(Window_CloseInKinectMain);
   174             debug.Closed += new EventHandler(Window_CloseInKinectMain);
   169             debug.getQuitMenu().Click += new RoutedEventHandler(Quit_ClickInKinectMain);
   175             /*debug.getQuitMenu().Click += new RoutedEventHandler(Quit_ClickInKinectMain);
   170             debug.getParametersWindow().getModButton().Click += new RoutedEventHandler(updateParameters);
   176             debug.getParametersWindow().getModButton().Click += new RoutedEventHandler(updateParameters);*/
       
   177 
       
   178             /*Console.WriteLine("DEBUG");
       
   179 
       
   180             Console.WriteLine("searchMinDistance:" + debug.getMinDistHands());
       
   181             Console.WriteLine("minDistance:" + debug.getMinDist());
       
   182             Console.WriteLine("connexionHost:" + debug.getConnexionHost());
       
   183             Console.WriteLine("timerElapsing:" + debug.getTimerElapsing());
       
   184             Console.WriteLine("takenPoints:" + debug.getTakenPoints());
       
   185             Console.WriteLine("directionChangeTresholdXY:" + debug.getDirectionChangeTresholdXY());
       
   186             Console.WriteLine("connexionPort:" + debug.getConnexionPort());
       
   187             Console.WriteLine("imagesToShow:" + debug.getImagesToShow());
       
   188             Console.WriteLine("searchMaxDistance:" + debug.getMaxDistHands());
       
   189             Console.WriteLine("maxDistance:" + debug.getMaxDist());
       
   190             Console.WriteLine("zeroPoint:" + debug.getZeroPoint());
       
   191             Console.WriteLine("directionChangeTresholdZ:" + debug.getDirectionChangeTresholdZ());*/
   171 
   192 
   172             //On affiche la fenêtre de debug.
   193             //On affiche la fenêtre de debug.
   173             try
   194             try
   174             {
   195             {
   175                 debug.ShowDialog();
   196                 debug.ShowDialog();
   176             }
   197             }
   177             catch(Exception){
   198             catch(Exception){
   178             }
   199             }
       
   200         }
       
   201 
       
   202         /*public bool loadParameters()
       
   203         {
       
   204             try
       
   205             {
       
   206                 string[] lines = System.IO.File.ReadAllLines(@"config.txt");
       
   207 
       
   208                 foreach (string line in lines)
       
   209                 {
       
   210                     Console.WriteLine(line);
       
   211                 }
       
   212 
       
   213                 /*minDistHands = Properties.Settings.Default.searchMinDistance;
       
   214                 maxDistHands = Properties.Settings.Default.searchMaxDistance;
       
   215                 minDist = Properties.Settings.Default.minDistance;
       
   216                 maxDist = Properties.Settings.Default.maxDistance;
       
   217                 zeroPoint = Properties.Settings.Default.zeroPoint;
       
   218                 connexionHost = Properties.Settings.Default.connexionHost;
       
   219                 connexionPort = Properties.Settings.Default.connexionPort;
       
   220                 timerElapsing = Properties.Settings.Default.timerElapsing;
       
   221                 imagesToShow = Properties.Settings.Default.imagesToShow;
       
   222                 takenPoints = Properties.Settings.Default.takenPoints;
       
   223                 directionChangeTresholdXY = Properties.Settings.Default.directionChangeTresholdXY;
       
   224                 directionChangeTresholdZ = Properties.Settings.Default.directionChangeTresholdZ;*/
       
   225             /*}
       
   226             catch (Exception)
       
   227             {
       
   228                 return false;
       
   229             }
       
   230 
       
   231             if (maxDistHands <= 0f || minDistHands <= 0f || maxDistHands > maxDist || minDistHands > maxDist ||
       
   232                 minDistHands >= maxDistHands || zeroPoint < maxDistHands || minDistHands > minDist ||
       
   233                 zeroPoint >= maxDist || connexionPort < 0 || timerElapsing < 0 || imagesToShow < 1 ||
       
   234                 takenPoints <= 0 || directionChangeTresholdXY < 0 || directionChangeTresholdZ < 0)
       
   235             {
       
   236                 ExceptionLbl.Content = rm.GetString("loadParametersIncorrect");
       
   237                 Console.WriteLine(ExceptionLbl.Content);
       
   238                 return false;
       
   239             }
       
   240             return true;
   179         }
   241         }
   180 
   242 
   181         /*
   243         /*
   182          * Envoi les paramètres mis à jour dans les différents modules.
   244          * Envoi les paramètres mis à jour dans les différents modules.
   183          */
   245          */
   261             PushEvent += new PushHandler(pushListener.showAndSend);
   323             PushEvent += new PushHandler(pushListener.showAndSend);
   262 
   324 
   263             //Fonction appelée lorsque l'utilisateur effectue un Jump.
   325             //Fonction appelée lorsque l'utilisateur effectue un Jump.
   264             JumpListener jumpListener = new JumpListener();
   326             JumpListener jumpListener = new JumpListener();
   265             JumpEvent += new JumpHandler(jumpListener.showAndSend);
   327             JumpEvent += new JumpHandler(jumpListener.showAndSend);
       
   328 
       
   329             //Fonction appelée lorsque l'utilisateur effectue un Fall.
       
   330             FallListener fallListener = new FallListener();
       
   331             FallEvent += new FallHandler(fallListener.showAndSend);
   266 
   332 
   267             //Fonction appelée lorsque l'utilisateur effectue un Wave.
   333             //Fonction appelée lorsque l'utilisateur effectue un Wave.
   268             WaveListener waveListener = new WaveListener();
   334             WaveListener waveListener = new WaveListener();
   269             WaveEvent += new WaveHandler(waveListener.showAndSend);
   335             WaveEvent += new WaveHandler(waveListener.showAndSend);
   270 
   336 
   463                 joints.Insert((int)JointType.AnkleRight, ankleRight);
   529                 joints.Insert((int)JointType.AnkleRight, ankleRight);
   464                 joints.Insert((int)JointType.FootRight, footRight);
   530                 joints.Insert((int)JointType.FootRight, footRight);
   465                 GestureDetector.UpdateSkeletonHistory(joints);
   531                 GestureDetector.UpdateSkeletonHistory(joints);
   466                 PostureDetector.UpdateSkeletonState(joints);
   532                 PostureDetector.UpdateSkeletonState(joints);
   467 
   533 
       
   534                 if (!correctPostureDetector.CheckForCorrectPosture())
       
   535                 {
       
   536                     debug.hideSkeleton();
       
   537                     modeManagement.DetectProximityBasedModes(0);
       
   538                     //Console.WriteLine("NO-USER");
       
   539                     LeftHandQuitEventArgs leftHandQuitEvent = new LeftHandQuitEventArgs(server, debug);
       
   540                     OnLeftHandQuitEvent(leftHandQuitEvent);
       
   541                     RightHandQuitEventArgs rightHandQuitEvent = new RightHandQuitEventArgs(server, debug);
       
   542                     OnRightHandQuitEvent(rightHandQuitEvent);
       
   543 
       
   544                     return;
       
   545                 }
       
   546                 
   468                 //Si la main gauche est dans le champ, on lance l'événement approprié.
   547                 //Si la main gauche est dans le champ, on lance l'événement approprié.
   469                 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands())
   548                 if (handLeft.Position.Z < debug.getMaxDistHands() && handLeft.Position.Z > debug.getMinDistHands())
   470                 {
   549                 {
   471                     LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z);
   550                     LeftHandTrackedEventArgs leftHandTrackedEvent = new LeftHandTrackedEventArgs(server, debug, handLeft, handLeft.Position.Z);
   472                     OnLeftHandTrackedEvent(leftHandTrackedEvent);
   551                     OnLeftHandTrackedEvent(leftHandTrackedEvent);
   520                 {
   599                 {
   521                     KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug);
   600                     KneeUpEventArgs kneeUpEvent = new KneeUpEventArgs(server, debug);
   522                     OnKneeUpEvent(kneeUpEvent);
   601                     OnKneeUpEvent(kneeUpEvent);
   523                 }
   602                 }
   524 
   603 
       
   604                 //Si l'utilisateur a fait un jump.
       
   605                 if (jumpDetector.CheckForJump())
       
   606                 {
       
   607                     JumpEventArgs jumpEvent = new JumpEventArgs(server, debug);
       
   608                     OnJumpEvent(jumpEvent);
       
   609                 }
       
   610 
       
   611                 //Si l'utilisateur a fait un fall.
       
   612                 if (fallDetector.CheckForFall())
       
   613                 {
       
   614                     FallEventArgs fallEvent = new FallEventArgs(server, debug);
       
   615                     OnFallEvent(fallEvent);
       
   616                 }
       
   617 
   525                 //Si l'utilisateur effectue un swipe left.
   618                 //Si l'utilisateur effectue un swipe left.
   526                 if (swipeDetector.CheckForSwipeLeft())
   619                 if (swipeDetector.CheckForSwipeLeft())
   527                 {
   620                 {
   528                     SwipeEventArgs swipeEvent = new SwipeEventArgs(server, debug, SwipeDetector.Direction.LEFT);
   621                     SwipeEventArgs swipeEvent = new SwipeEventArgs(server, debug, SwipeDetector.Direction.LEFT);
   529                     OnSwipeEvent(swipeEvent);
   622                     OnSwipeEvent(swipeEvent);
   566                     float proximity = userPositionDetector.CalcProximity(first.Position.Z);
   659                     float proximity = userPositionDetector.CalcProximity(first.Position.Z);
   567                     int numberOfImages = userPositionDetector.ImagesToShow(proximity, debug.getImagesToShow());
   660                     int numberOfImages = userPositionDetector.ImagesToShow(proximity, debug.getImagesToShow());
   568 
   661 
   569                     modeManagement.DetectProximityBasedModes(proximity);
   662                     modeManagement.DetectProximityBasedModes(proximity);
   570 
   663 
   571                     if (proximity > 0f)
   664                     if (proximity >= 10f)
   572                     {
   665                     {
   573                         UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(server, debug, proximity, numberOfImages);
   666                         UserPositionEventArgs userPositionEvent = new UserPositionEventArgs(server, debug, proximity, numberOfImages);
   574                         OnUserPositionEvent(userPositionEvent);
   667                         OnUserPositionEvent(userPositionEvent);
   575                     }
   668                     }
   576                     else if(proximity < 10f)
   669                     else if(proximity < 10f)
   696             if (JumpEvent != null)
   789             if (JumpEvent != null)
   697                 JumpEvent(new object(), e);
   790                 JumpEvent(new object(), e);
   698         }
   791         }
   699 
   792 
   700         /*
   793         /*
       
   794         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un fall.
       
   795         */
       
   796         public static void OnFallEvent(FallEventArgs e)
       
   797         {
       
   798             if (FallEvent != null)
       
   799                 FallEvent(new object(), e);
       
   800         }
       
   801 
       
   802         /*
   701         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle.
   803         *  Initialise l'événement et fait appel aux fonctions du listener quand l'utilisateur effectue un cercle.
   702         */
   804         */
   703         public static void OnCircleEvent(CircleEventArgs e)
   805         public static void OnCircleEvent(CircleEventArgs e)
   704         {
   806         {
   705             if (CircleEvent != null)
   807             if (CircleEvent != null)