Example #1
0
        public override void Stop(StopMode mode)
        {
            Historique.AjouterAction(new ActionStop(this, mode));

            _lockMove.WaitOne();

            if (mode == StopMode.Smooth)
            {
                Position nouvelleDestination = new Position(Position.Angle, new RealPoint(_currentPosition.Coordinates.X, _currentPosition.Coordinates.Y));

                if (IsInLineMove)
                {
                    if (_sensMove == SensAR.Avant)
                    {
                        nouvelleDestination.Move(GetCurrentLineBreakDistance());
                    }
                    else
                    {
                        nouvelleDestination.Move(-GetCurrentLineBreakDistance());
                    }
                }

                _destination = nouvelleDestination;
            }
            else if (mode == StopMode.Abrupt)
            {
                _currentSpeed = 0;
                _destination  = Position;
            }
            _lockMove.Release();
        }
Example #2
0
        public override void MoveForward(int distance, bool wait = true)
        {
            base.MoveForward(distance, wait);

            IsInLineMove = true;

            if (distance > 0)
            {
                if (!_inRecalibration)
                {
                    Historique.AjouterAction(new ActionAvance(this, distance));
                }
                _sensMove = SensAR.Avant;
            }
            else
            {
                if (!_inRecalibration)
                {
                    Historique.AjouterAction(new ActionRecule(this, -distance));
                }
                _sensMove = SensAR.Arriere;
            }

            _destination = new Position(Position.Angle, new RealPoint(Position.Coordinates.X + distance * Position.Angle.Cos, Position.Coordinates.Y + distance * Position.Angle.Sin));

            // TODO2018 attente avec un sémaphore ?
            if (wait)
            {
                while ((Position.Coordinates.X != _destination.Coordinates.X ||
                        Position.Coordinates.Y != _destination.Coordinates.Y) && !Execution.Shutdown)
                {
                    Thread.Sleep(10);
                }
            }
        }
Example #3
0
        public override void MoveBackward(int distance, bool wait = true)
        {
            base.MoveBackward(distance, wait);

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            IsInLineMove = true;

            Frame frame;

            if (distance < 0)
            {
                frame = UdpFrameFactory.Deplacer(SensAR.Avant, -distance, this);
            }
            else
            {
                frame = UdpFrameFactory.Deplacer(SensAR.Arriere, distance, this);
            }

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionRecule(this, distance));

            if (wait)
            {
                //if (!SemaphoresTrame[FrameFunction.FinDeplacement].WaitOne((int)SpeedConfig.LineDuration(distance).TotalMilliseconds))
                //    Thread.Sleep(1000); // Tempo de secours, on a jamais reçu la fin de trajectoire après la fin du délai théorique
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
Example #4
0
 private void SpeedConfig_ParamChange(bool lineAccelChange, bool lineDecelChange, bool lineSpeedChange, bool pivotAccelChange, bool pivotDecelChange, bool pivotSpeedChange)
 {
     if (lineSpeedChange)
     {
         Frame frame = UdpFrameFactory.VitesseLigne(SpeedConfig.LineSpeed, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionVitesseLigne(this, SpeedConfig.LineSpeed));
     }
     if (lineAccelChange || lineDecelChange)
     {
         Frame frame = UdpFrameFactory.AccelLigne(SpeedConfig.LineAcceleration, SpeedConfig.LineDeceleration, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionAccelerationLigne(this, SpeedConfig.LineAcceleration, SpeedConfig.LineDeceleration));
     }
     if (pivotSpeedChange)
     {
         Frame frame = UdpFrameFactory.VitessePivot(SpeedConfig.PivotSpeed, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionVitessePivot(this, SpeedConfig.PivotSpeed));
     }
     if (pivotAccelChange || pivotDecelChange)
     {
         Frame frame = UdpFrameFactory.AccelPivot(SpeedConfig.PivotAcceleration, this);
         _asserConnection.SendMessage(frame);
         Historique.AjouterAction(new ActionAccelerationPivot(this, SpeedConfig.PivotAcceleration, SpeedConfig.PivotDeceleration));
     }
 }
Example #5
0
 public virtual void SetMotorSpeed(MotorID moteur, SensGD sens, int vitesse)
 {
     if (MotorState.ContainsKey(moteur))
     {
         MotorState[moteur] = vitesse == 0 ? false : true;
     }
     Historique.AjouterAction(new ActionMoteur(this, vitesse, moteur));
 }
Example #6
0
        public override void SetActuatorOnOffValue(ActuatorOnOffID actuator, bool on)
        {
            ActuatorOnOffState[actuator] = on;

            Frame frame = UdpFrameFactory.ActionneurOnOff(_boardActuatorOnOff[actuator], actuator, on);

            Connections.UDPBoardConnection[_boardActuatorOnOff[actuator]].SendMessage(frame);

            Historique.AjouterAction(new ActionOnOff(this, actuator, on));
        }
Example #7
0
        public override void Init()
        {
            Historique          = new Historique(IDRobot);
            PositionsHistorical = new List <Position>();
            Position            = new Position(GoBot.Recalibration.StartPosition);

            PositionTarget = null;

            _linkAsserv.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, _highResolutionAsservissement ? 1 : 16));
            _linkLogPositions.StartInfiniteLoop(new TimeSpan(0, 0, 0, 0, 100));
        }
Example #8
0
        public override void Stop(StopMode mode = StopMode.Smooth)
        {
            AsserEnable = (mode != StopMode.Freely);

            IsInLineMove = false;

            Frame frame = UdpFrameFactory.Stop(mode, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionStop(this, mode));
        }
Example #9
0
        public bool RunTrajectory(Trajectory traj)
        {
            TrajectoryRunning = traj;
            TimeSpan  estimatedDuration = traj.GetDuration(this);
            Stopwatch sw = Stopwatch.StartNew();

            TrajectoryCutOff = false;
            TrajectoryFailed = false;

            foreach (IAction action in traj.ConvertToActions(this))
            {
                if (!Execution.Shutdown)
                {
                    action.Executer();

                    if (TrajectoryCutOff || TrajectoryFailed)
                    {
                        break;
                    }

                    if (action is ActionAvance || action is ActionRecule)
                    {
                        Historique.Log("Noeud atteint " + TrajectoryRunning.Points[0].X.ToString("0") + ":" + TrajectoryRunning.Points[0].Y.ToString("0"), TypeLog.PathFinding);
                        TrajectoryRunning.RemovePoint(0);
                    }
                }
            }

            if (!Execution.Shutdown)
            {
                TrajectoryRunning = null;

                if (!TrajectoryCutOff && !TrajectoryFailed)
                {
                    Historique.Log("Trajectoire parcourue en " + (sw.ElapsedMilliseconds / 1000.0).ToString("0.0") + "s (durée théorique : " + (estimatedDuration.TotalSeconds).ToString("0.0") + "s)", TypeLog.PathFinding);

                    return(true);
                }

                if (TrajectoryFailed)
                {
                    Historique.Log("Echec du parcours de la trajectoire (dérapage, blocage...)", TypeLog.PathFinding);

                    return(false);
                }
            }

            return(false);
        }
Example #10
0
        public bool GoToPosition(Position dest)
        {
            Historique.Log("Lancement pathfinding pour aller en " + dest.ToString(), TypeLog.PathFinding);

            Trajectory traj = PathFinder.ChercheTrajectoire(Graph, GameBoard.ObstaclesAll, GameBoard.ObstaclesOpponents, Position, dest, Radius, Robots.MainRobot.Width / 2);

            if (traj == null)
            {
                return(false);
            }

            RunTrajectory(traj);

            return(!TrajectoryCutOff && !TrajectoryFailed);
        }
Example #11
0
        public override void Recalibration(SensAR sens, bool wait = true, bool sendOffset = false)
        {
            _inRecalibration = true;

            Historique.AjouterAction(new ActionRecallage(this, sens));

            if (wait)
            {
                RecalProcedure(sens);
            }
            else
            {
                ThreadManager.CreateThread(link => RecalProcedure(sens)).StartThread();
            }

            base.Recalibration(sens, wait, sendOffset);
        }
Example #12
0
        public override void Turn(SensAR sensAr, SensGD sensGd, int radius, AngleDelta angle, bool wait = true)
        {
            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Virage(sensAr, sensGd, radius, angle, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionVirage(this, radius, angle, sensAr, sensGd));

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
Example #13
0
        public override void PivotRight(AngleDelta angle, bool wait = true)
        {
            base.PivotRight(angle, wait);

            angle = Math.Round(angle, 2);
            Historique.AjouterAction(new ActionPivot(this, angle, SensGD.Droite));

            _destination = new Position(Position.Angle + angle, new RealPoint(Position.Coordinates.X, Position.Coordinates.Y));
            _sensPivot   = SensGD.Droite;

            if (wait)
            {
                while (Position.Angle != _destination.Angle)
                {
                    Thread.Sleep(10);
                }
            }
        }
Example #14
0
        public override void Init()
        {
            Historique = new Historique(IDRobot);

            Connections.ConnectionCan.FrameReceived += ReceptionCanMessage;

            _asserConnection.FrameReceived += ReceptionUdpMessage;

            if (this == Robots.MainRobot)
            {
                Connections.ConnectionIO.FrameReceived += ReceptionUdpMessage;
            }

            //Connections.ConnectionsCan[CanBoard.CanAlim].FrameReceived += ReceptionCanMessage;

            if (this == Robots.MainRobot)
            {
                if (GameBoard.MyColor == GameBoard.ColorLeftBlue)
                {
                    Position = new Position(0, new RealPoint(240, 1000));
                }
                else
                {
                    Position = new Position(180, new RealPoint(3000 - 240, 1000));
                }
            }
            else
            {
                if (GameBoard.MyColor == GameBoard.ColorLeftBlue)
                {
                    Position = new Position(0, new RealPoint(480, 1000));
                }
                else
                {
                    Position = new Position(180, new RealPoint(3000 - 480, 1000));
                }
            }

            PositionTarget = null; //TODO2018 Init commun à la simu

            PositionsHistorical = new List <Position>();
            _asserConnection.SendMessage(UdpFrameFactory.DemandePositionContinue(50, this));
        }
Example #15
0
        public override void Recalibration(SensAR sens, bool wait = true, bool sendOffset = false)
        {
            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Recallage(sens, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionRecallage(this, sens));

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }

            base.Recalibration(sens, wait, sendOffset);
        }
Example #16
0
        public override void PivotRight(AngleDelta angle, bool wait = true)
        {
            base.PivotRight(angle, wait);

            if (wait)
            {
                _lockFrame[UdpFrameFunction.FinDeplacement] = new Semaphore(0, int.MaxValue);
            }

            Frame frame = UdpFrameFactory.Pivot(SensGD.Droite, angle, this);

            _asserConnection.SendMessage(frame);

            Historique.AjouterAction(new ActionPivot(this, angle, SensGD.Droite));

            if (wait)
            {
                //if (!SemaphoresTrame[FrameFunction.FinDeplacement].WaitOne((int)SpeedConfig.PivotDuration(angle, Entraxe).TotalMilliseconds))
                //    Thread.Sleep(1000); // Tempo de secours, on a jamais reçu la fin de trajectoire après la fin du délai théorique
                _lockFrame[UdpFrameFunction.FinDeplacement].WaitOne();
            }
        }
Example #17
0
 public virtual void SetMotorAcceleration(MotorID moteur, int acceleration)
 {
     Historique.AjouterAction(new ActionMoteur(this, acceleration, moteur));
 }
Example #18
0
        public bool OpponentsTrajectoryCollision(IEnumerable <IShape> opponents)
        {
            bool ok = true;

            if (TrajectoryCutOff)
            {
                ok = false;
            }

            if (ok)
            {
                try
                {
                    // Teste si le chemin en cours de parcours est toujours franchissable
                    if (TrajectoryRunning != null && TrajectoryRunning.Lines.Count > 0)
                    {
                        List <Segment> segmentsTrajectoire = new List <Segment>();
                        // Calcule le segment entre nous et notre destination (permet de ne pas considérer un obstacle sur un tronçon déjà franchi)
                        Segment toNextPoint = new Segment(Position.Coordinates, new RealPoint(TrajectoryRunning.Lines[0].EndPoint));
                        segmentsTrajectoire.Add(toNextPoint);

                        for (int iSegment = 1; iSegment < TrajectoryRunning.Lines.Count; iSegment++)
                        {
                            segmentsTrajectoire.Add(TrajectoryRunning.Lines[iSegment]);
                        }

                        foreach (IShape opponent in opponents)
                        {
                            foreach (Segment segment in segmentsTrajectoire)
                            {
                                // Marge de 30mm pour être plus permissif sur le passage et ne pas s'arreter dès que l'adversaire approche
                                if (!IsFarEnough(toNextPoint, opponent, -30))
                                {
                                    // Demande de génération d'une nouvelle trajectoire
                                    Historique.Log("Trajectoire coupée, annulation", TypeLog.PathFinding);
                                    TrajectoryCutOff  = true;
                                    TrajectoryRunning = null;

                                    if (IsInLineMove)
                                    {
                                        Stop();
                                    }
                                    ok = false;
                                    break;
                                }
                            }

                            if (!ok)
                            {
                                break;
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    ok = false;
                }
            }

            return(ok);
        }
Example #19
0
        public override void Init()
        {
            Couleur = Color.Purple;

            Historique = new Historique(IDRobot);

            DateRefreshPos = DateTime.Now;

            //Enchainement = new Enchainements.HomologationEnchainement();

            Connexion.NouvelleTrameRecue += new ConnexionUDP.ReceptionDelegate(ReceptionMessage);

            if (this == Robots.GrosRobot)
                Connexions.ConnexionIO.NouvelleTrameRecue += new ConnexionUDP.ReceptionDelegate(ReceptionMessage);

            if (this == Robots.GrosRobot)
            {
                if (Plateau.NotreCouleur == Plateau.CouleurGaucheViolet)
                    Position = new Calculs.Position(new Angle(0, AnglyeType.Degre), new PointReel(240, 1000));
                else
                    Position = new Calculs.Position(new Angle(180, AnglyeType.Degre), new PointReel(3000 - 240, 1000));
            }
            else
            {
                if (Plateau.NotreCouleur == Plateau.CouleurGaucheViolet)
                    Position = new Calculs.Position(new Angle(0, AnglyeType.Degre), new PointReel(480, 1000));
                else
                    Position = new Calculs.Position(new Angle(180, AnglyeType.Degre), new PointReel(3000 - 480, 1000));
            }

            PositionCible = null;

            HistoriqueCoordonnees = new List<Position>();
            Connexion.SendMessage(TrameFactory.DemandePositionContinue(100, this));
        }
Example #20
0
        public override void Init()
        {
            Historique = new Historique(IDRobot);
            HistoriqueCoordonnees = new List<Position>();
            if (this == Robots.GrosRobot)
            {
                if (Plateau.NotreCouleur == Plateau.CouleurGaucheViolet)
                    Position = new Calculs.Position(new Angle(0, AnglyeType.Degre), new PointReel(240, 1000));
                else
                    Position = new Calculs.Position(new Angle(180, AnglyeType.Degre), new PointReel(3000 - 240, 1000));
            }
            else
            {
                if (Plateau.NotreCouleur == Plateau.CouleurGaucheViolet)
                    Position = new Calculs.Position(new Angle(0, AnglyeType.Degre), new PointReel(480, 1000));
                else
                    Position = new Calculs.Position(new Angle(180, AnglyeType.Degre), new PointReel(3000 - 480, 1000));
            }

            PositionCible = null;
        }
Example #21
0
 public override void SetActuatorOnOffValue(ActuatorOnOffID actuator, bool on)
 {
     // TODO
     Historique.AjouterAction(new ActionOnOff(this, actuator, on));
 }