private void TimerStrategy_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (isLocked == false)
            {
                lock (strategyLock)
                {
                    isLocked = true;
                    InitRobotRoleDeterminationZones();
                    //Le joueur détermine sa stratégie
                    sw.Restart();
                    DetermineRobotRole();                                  //if (displayConsole) Console.WriteLine("Tps calcul détermination des rôles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();
                    IterateStateMachines();                                //if (displayConsole) Console.WriteLine("Tps calcul State machines : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms");  sw.Restart();
                    GenerateStrategyHeatMap();                             //if (displayConsole) Console.WriteLine("Tps calcul Heatmap Destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms");  sw.Restart();
                    var optimalPosition = GetOptimalStrategyDestination(); //if (displayConsole) Console.WriteLine("Tps calcul Get Optimal Destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();
                    List <LocationExtended> obstacleList = new List <LocationExtended>();
                    double seuilDetectionObstacle        = 0.4;
                    //Construction de la liste des obstacles en enlevant le robot lui-même
                    lock (globalWorldMap)
                    {
                        if (globalWorldMap.obstacleLocationList != null)
                        {
                            foreach (var obstacle in globalWorldMap.obstacleLocationList)
                            {
                                if (Toolbox.Distance(new PointD(obstacle.X, obstacle.Y), new PointD(robotCurrentLocation.X, robotCurrentLocation.Y)) > seuilDetectionObstacle)
                                {
                                    obstacleList.Add(obstacle);
                                }
                            }
                        }
                        if (globalWorldMap.teammateLocationList != null)
                        {
                            foreach (var teammate in globalWorldMap.teammateLocationList)
                            {
                                if (teammate.Key != robotId)
                                {
                                    obstacleList.Add(new LocationExtended(teammate.Value.X, teammate.Value.Y, 0, 0, 0, 0, ObjectType.Robot));
                                }
                            }
                        }
                    }

                    // if (displayConsole) Console.WriteLine("Tps calcul Génération obstacles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();
                    OnHeatMapStrategy(robotId, strategyHeatMap); // if (displayConsole) Console.WriteLine("Tps envoi strat Heatmap : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();

                    ///On copie la heatmap de strategy dans la heatmap de waypoint pour la compléter sans abimer la première
                    CopyStrategyHeatMapToWayPointHeatMap();

                    /// Calcul de la HeatMap WayPoint
                    WayPointHeatMap.ExcludeMaskedZones(new PointD(robotCurrentLocation.X, robotCurrentLocation.Y), obstacleList, ObstacleAvoidanceDistance); //if (displayConsole) Console.WriteLine("Tps calcul zones exclusion obstacles : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms");  sw.Restart();

                    OnHeatMapWayPoint(robotId, WayPointHeatMap);                                                                                             //if (displayConsole) Console.WriteLine("Tps calcul HeatMap WayPoint : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();
                    var optimalWayPoint = GetOptimalWayPointDestination();                                                                                   //if (displayConsole) Console.WriteLine("Tps calcul Get Optimal Waypoint : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); sw.Restart();

                    //Mise à jour de la destination
                    if (optimalPosition == null)
                    {
                        OnDestination(robotId, new Location((float)robotCurrentLocation.X, (float)robotCurrentLocation.Y, (float)robotOrientation, 0, 0, 0));
                    }
                    else
                    {
                        OnDestination(robotId, new Location((float)optimalPosition.X, (float)optimalPosition.Y, (float)robotOrientation, 0, 0, 0));
                    }

                    if (optimalWayPoint == null)
                    {
                        OnWaypoint(robotId, new Location((float)robotCurrentLocation.X, (float)robotCurrentLocation.Y, (float)robotOrientation, 0, 0, 0));
                    }
                    else
                    {
                        OnWaypoint(robotId, new Location((float)optimalWayPoint.X, (float)optimalWayPoint.Y, (float)robotOrientation, 0, 0, 0));
                    }

                    //if (displayConsole) Console.WriteLine("Tps events waypoint et destination : " + sw.Elapsed.TotalMilliseconds.ToString("N4") + " ms"); // Affichage de la mesure
                    //if (displayConsole) Console.WriteLine("Tps calcul Global Stratégie : " + swGlobal.Elapsed.TotalMilliseconds.ToString("N4") + " ms \n\n"); // Affichage de la mesure globale
                    //Thread.Sleep(100);

                    isLocked = false;
                }
            }
            else
            {
                Console.WriteLine("Calcul de strategie déjà en cours");
            }
        }