summaryrefslogtreecommitdiff
path: root/2005
diff options
context:
space:
mode:
authordufourj2005-05-06 19:17:09 +0000
committerdufourj2005-05-06 19:17:09 +0000
commit2f229e93056445ca05e0948ff663d850efcb3566 (patch)
tree6570339311f46f1dd0912576db785c3942cc89b8 /2005
parent098033352f64f814b6e8586624319855a5982b99 (diff)
Ai
Nettoyage
Diffstat (limited to '2005')
-rw-r--r--2005/i/robert/src/ai/ai.cc453
-rw-r--r--2005/i/robert/src/ai/ai.hh26
-rw-r--r--2005/i/robert/src/ai/test_ai.cc6
3 files changed, 203 insertions, 282 deletions
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<int>("ai.roundDuration")),
- vitesseAsc_(config.get<int>("ai.vitesseAsc"))
+ vitesseAsc_(config.get<int>("ai.vitesseAsc")),
+ tempoDebutMatch_ (config.get <int> ("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 ();