From 2f229e93056445ca05e0948ff663d850efcb3566 Mon Sep 17 00:00:00 2001 From: dufourj Date: Fri, 6 May 2005 19:17:09 +0000 Subject: Ai Nettoyage --- 2005/i/robert/src/ai/ai.cc | 453 ++++++++++++++++------------------------ 2005/i/robert/src/ai/ai.hh | 26 ++- 2005/i/robert/src/ai/test_ai.cc | 6 +- 3 files changed, 203 insertions(+), 282 deletions(-) (limited to '2005') diff --git a/2005/i/robert/src/ai/ai.cc b/2005/i/robert/src/ai/ai.cc index dc6ba18..55cb27d 100644 --- a/2005/i/robert/src/ai/ai.cc +++ b/2005/i/robert/src/ai/ai.cc @@ -41,7 +41,8 @@ Ai::Ai(const Config & config) schedulableMotor_ (callback, motor_.getFd ()), schedulableEs_ (callback, es_.getFd ()), roundDuration_(config.get("ai.roundDuration")), - vitesseAsc_(config.get("ai.vitesseAsc")) + vitesseAsc_(config.get("ai.vitesseAsc")), + tempoDebutMatch_ (config.get ("ai.tempoDebutMatch")) { scheduler_.insert (schedulableMotor_); scheduler_.insert (schedulableEs_); @@ -60,6 +61,8 @@ Ai::~Ai (void) while (!sync ()); } +// *** Fonctions de communication avec motor et es ***/*{{{*/ + /// Initialise le robot void Ai::init(void) { @@ -85,255 +88,7 @@ void Ai::stop(void) } while (!motor_.idle ()); } -/// Lance le robot -void Ai::run(void) -{ - // Lancement du placement pour les matchs - initMatch (); - - /*** AI d'homologation ***/ - /* - // On temporise pour laisser Taz sortir - std::cout << "Attente du 15 secondes" << std::endl; - temporisation(15000); - // On avance pour pouvoir aller vers la boule parallèlement au socle - std::cout << "On avance de 540mm" << std::endl; - basic(540); // 600 - 60 - // Aller devant la boule - std::cout << "GoTo 870,-675 -> Pi" << std::endl; - goTo(870, -675, M_PI); - // On change l'accélération - motor_.setAccel(32); - // Taper la boule - std::cout << "Recule de 410mm" << std::endl; - basic(-410); - // On restaure la valeur de l'acceleration - motor_.setAccel(64); - // se placer devant nos quilles près du pont - std::cout << "Avance de 410mm" << std::endl; - basic(410); - // On va derière les quilles - std::cout << "GoTo" << std::endl; - goTo(motor_.getX(),motor_.getY() - 150 ,M_PI); - // On set la vitesse à 2 - int MaxLSpeedConf = motor_.getMaxLSpeed(); - std::cout << "Reduction vitesse" << std::endl; - motor_.setMaxSpeed(2, -1); - // On colle les quilles - std::cout << "Recule de 400mm" << std::endl; - basic (-400); // 260 - 10 de marge - // On retaure la vitesse - std::cout << "Acceleration vitesse" << std::endl; - motor_.setMaxSpeed(MaxLSpeedConf, -1); - // XXX On temporise et on fait mumuse avec l'ascenceur - */ - - /*** AI du 1er match ***/ - temporisation (30000); - basic ( 600 ); - rotation ( - M_PI / 2 ); - basic ( 300 ); - rotation ( M_PI ); - basic ( 450 ); - - // On a fini notre run - std::cout << "On a fini" << std::endl; -} - -// Balistique non fiable. -void -Ai::initBalNonFiable (void) -{ - // Lancement du placement pour les matchs - initMatch (); - // Protection des quilles devant le pont - protectQuillePont (); -} - -// Match de parcourt du fond du terrain -void -Ai::runProtectFond (void) -{ - // Lancement du placement pour les matchs - initMatch (); - // Protection des quilles devant le pont - parcourtFond (); -} - -// test -void -Ai::initTest (void) -{ - /*** Init du match ***/ - init(); - // Reset la PWM à zéro si on a fait de la merde en le posant sur la table - resetPwm (); - - // On change la vitesse max pour reculer - std::cout << "On change la vitesse à 2" << std::endl; - setMaxSpeed (20, -1); - setAccel (30); - // Taper la boule - std::cout << "On recule à fond de 460mm" << std::endl; - basic(-300); - std::cout << "Arret d'urgence" << std::endl; - //setAccel (0); - //stop (); - // On restaure la vitesse - temporisation (400); - init (); - std::cout << "On restaure la vitesse à 8" << std::endl; - setAccel (96); - setMaxSpeed (8, -1); - std::cout << "On avance pour voir" << std::endl; - basic(+300); - - /* - std::cout << "On tourne -> -PI/2" << std::endl; - rotation(-M_PI/2); - // On recule dans le mur - std::cout << "On se recale" << std::endl; - recale (); - motor_.setPosition(motor_.getX(), -60, -M_PI / 2); - // On avance vers la position de départ en y - std::cout << "On avance de 155mm" << std::endl; - basic (155); // 215 - 60 = 155 - // On rotate de 90 ° - std::cout << "On rotate -> 0" << std::endl; - rotation (0); - // On se recale vers x - std::cout << "On se recale" << std::endl; - recale(); - motor_.setPosition(60, motor_.getY(), 0); - std::cout << "On attend le jack" << std::endl; - // On lance le timer de début de match - std::cout << "Lancmeent du match" << std::endl; - Timer::startRound(); - // *** Fin de l'init du match *** // - - // On avance pour pouvoir aller vers la boule parallèlement au socle - std::cout << "On avance de 540mm" << std::endl; - basic(540); // 600 - 60 - // On se place derrière les quilles en arrière - std::cout << "GoTo 925,-1150 -> Pi" << std::endl; - goTo(925, -1150, M_PI); - // On change la vitesse max pour reculer - std::cout << "On change la vitesse à 2" << std::endl; - setMaxSpeed (20, -1); - setAccel (96); - // Taper la boule - std::cout << "On recule à fond de 460mm" << std::endl; - basic(-460); - std::cout << "Arret d'urgence" << std::endl; - setAccel (0); - stop (); - // On restaure la vitesse - std::cout << "On restaure la vitesse à 8" << std::endl; - setAccel (96); - setMaxSpeed (8, -1); - std::cout << "On avance pour voir" << std::endl; - basic(-300); - */ - - -} - -// Parcourt la ligne du fond, en aveugle pour relever des quilles et les poser derrière soit -void -Ai::parcourtFond (void) -{ - /*** Préplacement ***/ - std::cout << "Placement dans la ligne - goTo 170" << std::endl; - goTo (200, motor_.getY (), - M_PI / 2); - // XXX 1 degré -> 0.017 - std::cout << "On avance de 30 cm" << std::endl; - basic (800); - /*** Fin du préplacement ***/ - - /*** Boucle de parcours de la ligne de fond ***/ - while (motor_.getY () > -1700) - { - std::cout << "On lève" << std::endl; - ascenceur (true); - std::cout << "Vitesse lente de rotation 2" << std::endl; - setMaxSpeed (-1, 1); - std::cout << "Tourne un peu" << std::endl; - rotation (M_PI); - std::cout << "Fini le tour" << std::endl; - rotation (M_PI / 2); - std::cout << "On attend" << std::endl; - temporisation (3000); - std::cout << "On lache" << std::endl; - ventouses (); - std::cout << "On attend" << std::endl; - temporisation (1500); - std::cout << "On restaure les vitesses" << std::endl; - setMaxSpeed (-1, 4); - std::cout << "On recule de 100" << std::endl; - basic (-100); - std::cout << "On descend" << std::endl; - ascenceur (false); - std::cout << "On se retourne" << std::endl; - rotation ( -M_PI / 2); - std::cout << "On avance de 100" << std::endl; - basic (200); - } - std::cout << "Fini : " << Timer::getRoundTime () << std::endl; -} - - - -// Balistique fiable. -void -Ai::initBalFiable (void) -{ - // Lancement du placement pour les matchs - initMatch (); - // Goto pour avance puis tourner de - PI/2 - // Algo de recherche de quille sur ligne du fond -} - -// Va du point de départ au pont pour protéger les quilles. -void -Ai::protectQuillePont (void) -{ - // On avance pour pouvoir aller vers la boule parallèlement au socle - std::cout << "On avance de 540mm" << std::endl; - basic(540); // 600 - 60 - // On se place derrière les quilles en arrière - std::cout << "GoTo 870,-675 -> Pi" << std::endl; - goTo(1225, -1200, M_PI); - // On change la vitesse max pour reculer - std::cout << "On change la vitesse à 2" << std::endl; - setMaxSpeed (2, -1); - // Taper la boule - std::cout << "On recule lentement de 200mm" << std::endl; - basic(-140); - // On restaure la vitesse - std::cout << "On restaure la vitesse à 8" << std::endl; - setMaxSpeed (8, -1); - // On attend un peu pour protéger - std::cout << "On temporise" << std::endl; - temporisation (2500); // 15000 XXX A changer - // XXX à finir - // On se barre des quilles - basic (200); - // On retourne à l'origine - goTo (600, -300, M_PI); - // On avance légèrement - goTo (250, motor_.getY (), -M_PI / 2); - // XXX Faire un fuck the wall en Y - // On met la caméra - // On avance d'une valeur fixe si on a rien - // Si on a quelque chose, on y va - // On remonte, rotation de 0 puis M_PI / 2 - // On pose, on recule de 100, on baisse l'ascenceur - // On pivote à - M_PI / 2 - // On réitère si on est pas au bout 1800 - // On recommence l'algo dans l'autre sens -} - -/// Attend. +/// Attend des données. void Ai::wait (int t) { motor_.wait(t); @@ -342,12 +97,13 @@ void Ai::wait (int t) /// Fonction de temporisation void Ai::temporisation(int t) { - int time = Timer::getRoundTime(); + int time = Timer::getProgramTime(); time += t; - while (time > Timer::getRoundTime()) + do { update(); } + while (time > Timer::getProgramTime()); } // Attend le jack entré (false) ou sorti (true). @@ -367,7 +123,8 @@ void Ai::goTo (double x, double y ,double a) do { update(); - }while(!motor_.idle()); + } + while(!motor_.idle()); } /// Recale contre une bordure. @@ -403,7 +160,7 @@ void Ai::rotation (double a) destNorm += 2 * M_PI; // On récupère la différence d'angle double diff = motor_.getA () - destNorm; - double limit = 3 / 360 * 2 * M_PI; // 3 degré en radian XXX + double limit = 3 / 360 * 2 * M_PI; // 3 degré en radian if (diff > limit || diff < - limit) { motor_.rotation(a); @@ -425,11 +182,11 @@ void Ai::ascenceur (bool monte) { update(); } - while(!es_.ascIsIdle()); + while (!es_.ascIsIdle()); } /// Désactive les ventouse -void Ai::ventouses (void) /// XXX Temps à régler dans la config +void Ai::ventouses (void) { es_.ventouses(); while (!update()); @@ -465,7 +222,90 @@ void Ai::resetPwm (void) // synchronise while (!update()); } - + +void +Ai::setMaxSpeed (int l, int r) +{ + motor_.setMaxSpeed (l, r); + while (!update ()); +} + +void +Ai::setAccel (int a) +{ + motor_.setAccel (a); + while (!update ()); +}/*}}}*/ + +// *** Les runs ***/*{{{*/ +// Balistique non fiable. +void +Ai::runBalNonFiable (void) +{ + // Lancement du placement pour les matchs + initMatch (); + // Protection des quilles devant le pont + protectQuillePont (); +} + +// Balistique fiable. +void +Ai::runBalFiable (void) +{ + // Lancement du placement pour les matchs + initMatch (); + // Goto pour avance puis tourner de - PI/2 + // Algo de recherche de quille sur ligne du fond +} + +// Match de parcourt du fond du terrain +void +Ai::runProtectFond (void) +{ + // Lancement du placement pour les matchs + initMatch (); + // Protection des quilles devant le pont + parcourtFond (); +} + +// Pour les Tests. +void +Ai::runTest (void) +{ + initTest (); + + // On change la vitesse max pour reculer + std::cout << "On change la vitesse à 2" << std::endl; + setMaxSpeed (20, -1); + setAccel (30); + // Taper la boule + std::cout << "On recule à fond de 460mm" << std::endl; + basic(-300); + std::cout << "Arret d'urgence" << std::endl; + //setAccel (0); + //stop (); + // On restaure la vitesse + temporisation (400); + init (); + std::cout << "On restaure la vitesse à 8" << std::endl; + setAccel (96); + setMaxSpeed (8, -1); + std::cout << "On avance pour voir" << std::endl; + basic(+300); +} +/*}}}*/ + +// *** Les inits (test/match) ***/*{{{*/ +// Séquences d'initiailisation pour les tests. +void +Ai::initTest (void) +{ + // On init le robot + init(); + // Reset la PWM à zéro si on a fait de la merde en le posant sur la table + resetPwm (); +} + /// Initialise le robot pour faire un match (placement). void Ai::initMatch (void) { @@ -509,21 +349,96 @@ void Ai::initMatch (void) std::cout << "Lancement du match" << std::endl; Timer::startRound(); // On temporise pour laisser Taz sortir - std::cout << "Attente du 15 secondes" << std::endl; - temporisation(21000); -} + std::cout << "Attente de " << tempoDebutMatch_ << " secondes" << std::endl; + temporisation(tempoDebutMatch_); +}/*}}}*/ -void -Ai::setMaxSpeed (int l, int r) +// Parcourt la ligne du fond, en aveugle pour relever des quilles et les poser derrière soit +void +Ai::parcourtFond (void) { - motor_.setMaxSpeed (l, r); - while (!update ()); + /*** Préplacement ***/ + std::cout << "Placement dans la ligne - goTo 200" << std::endl; + goTo (200, motor_.getY (), - M_PI / 2); + //1 degré -> 0.017 + std::cout << "On avance de 80 cm" << std::endl; + basic (800); + /*** Fin du préplacement ***/ + + /*** Boucle de parcours de la ligne de fond ***/ + // On s'arrête dans le dernire carreaux + while (motor_.getY () > -1700) + { + std::cout << "On recule un peu" << std::endl; + basic (-10); + std::cout << "On lève" << std::endl; + ascenceur (true); + std::cout << "Vitesse lente de rotation 1" << std::endl; + setMaxSpeed (-1, 1); + // XXX Ça pue un peu quand même ça, on ne peut pas faire en deux fois + std::cout << "On tourne un peu" << std::endl; + rotation (M_PI); + std::cout << "On fini le tour" << std::endl; + rotation (M_PI / 2); + std::cout << "On attend 3 secondes" << std::endl; + temporisation (3000); + std::cout << "On lache" << std::endl; + ventouses (); + std::cout << "On attend 1.5 secondes" << std::endl; + temporisation (1500); + std::cout << "On restaure les vitesses" << std::endl; + setMaxSpeed (-1, 4); + std::cout << "On recule de 10 cm" << std::endl; + basic (-100); + std::cout << "On descend" << std::endl; + ascenceur (false); + std::cout << "On se retourne" << std::endl; + rotation ( -M_PI / 2); + std::cout << "On avance de 20 cm" << std::endl; + basic (200); + } + std::cout << "Fini : " << Timer::getRoundTime () << std::endl; } -void -Ai::setAccel (int a) +// Va du point de départ au pont pour protéger les quilles. +void +Ai::protectQuillePont (void) { - motor_.setAccel (a); - while (!update ()); + // On avance pour pouvoir aller vers la boule parallèlement au socle + std::cout << "On avance de 540mm" << std::endl; + basic(540); // 600 - 60 + // On se place derrière les quilles en arrière + std::cout << "GoTo 1225, -1200 -> Pi" << std::endl; + goTo(1225, -1200, M_PI); + // On change la vitesse max pour reculer + std::cout << "On change la vitesse linéaire à 2" << std::endl; + setMaxSpeed (2, -1); + // Taper la boule + std::cout << "On recule lentement de 14 cm" << std::endl; + basic(-140); + // On restaure la vitesse + std::cout << "On restaure la vitesse à 8" << std::endl; + setMaxSpeed (8, -1); + // On attend un peu pour protéger + std::cout << "On temporise de 2.5 secondes" << std::endl; + temporisation (2500); + // On se barre des quilles + std::cout << "On avance de 20 cm" << std::endl; + basic (200); + // On retourne à l'origine + std::cout << "GoTo 600, -300 -> Pi" << std::endl; + goTo (600, -300, M_PI); + // On avance légèrement + std::cout << "GoTo 250, Y actuelle -> -Pi/2" << std::endl; + goTo (250, motor_.getY (), -M_PI / 2); + // TODO + // Faire un fuck the wall en Y + // On met la caméra + // On avance d'une valeur fixe si on a rien + // Si on a quelque chose, on y va + // On remonte, rotation de 0 puis M_PI / 2 + // On pose, on recule de 100, on baisse l'ascenceur + // On pivote à - M_PI / 2 + // On réitère si on est pas au bout 1800 + // On recommence l'algo dans l'autre sens } - diff --git a/2005/i/robert/src/ai/ai.hh b/2005/i/robert/src/ai/ai.hh index b563410..5905156 100644 --- a/2005/i/robert/src/ai/ai.hh +++ b/2005/i/robert/src/ai/ai.hh @@ -48,18 +48,20 @@ class Ai // Paramètre de Ai const int roundDuration_; const int vitesseAsc_; + // Temps de temporisation + const int tempoDebutMatch_; public: - /// Constructeur + /// Constructeur. Ai(const Config & config); + /// Destructeur. ~Ai (void); + // Initialise le robot. void init (void); /// Arrète le robot. void stop (void); - /// Lance le robot. - void run (void); - /// Attend. + /// Attend des données (préférez plutôt temporisation). void wait (int t); /// Fonction de temporisation void temporisation (int t); @@ -83,16 +85,20 @@ class Ai bool sync (void); /// Reset la PWM à zéro. void resetPwm (void); - /// Initialise le robot pour faire un match (placement). - void initMatch (); + // Balistique non fiable. - void initBalNonFiable (void); + void runBalNonFiable (void); // Balistique fiable. - void initBalFiable (void); + void runBalFiable (void); + // Pour les tests. + void runTest (void); + + /// Initialise le robot pour faire un match (placement). + void initMatch (void); + /// Séquence d'initiailisation simple pour les tests. + void initTest (void); // Va du point de départ au pont pour protéger les quilles. void protectQuillePont (void); - // test - void initTest (void); void setMaxSpeed (int l, int r); void setAccel (int a); void runProtectFond (void); diff --git a/2005/i/robert/src/ai/test_ai.cc b/2005/i/robert/src/ai/test_ai.cc index 2b7bbbb..f205819 100644 --- a/2005/i/robert/src/ai/test_ai.cc +++ b/2005/i/robert/src/ai/test_ai.cc @@ -79,13 +79,13 @@ main (int argc, char **argv) case '0': // Pour un robot qui n'est pas fiable en // asservissement - ai_.initBalNonFiable(); + ai_.runBalNonFiable(); break; case '1': - ai_.initBalFiable (); + ai_.runBalFiable (); break; case '2': - ai_.initTest (); + ai_.runTest (); break; case '3': ai_.runProtectFond (); -- cgit v1.2.3