From a95c0b822899c7004cfe06e1a6dfb84461ebc125 Mon Sep 17 00:00:00 2001 From: haller Date: Fri, 6 May 2005 19:26:03 +0000 Subject: Ai : Intégration de la vision (test à faire) --- 2005/i/robert/src/ai/Makefile.defs | 3 +- 2005/i/robert/src/ai/ai.cc | 73 ++++++++++++++++++++++++++++++++++++-- 2005/i/robert/src/ai/ai.hh | 16 +++++++-- 3 files changed, 87 insertions(+), 5 deletions(-) (limited to '2005/i') diff --git a/2005/i/robert/src/ai/Makefile.defs b/2005/i/robert/src/ai/Makefile.defs index 4eaade9..6f13fcf 100644 --- a/2005/i/robert/src/ai/Makefile.defs +++ b/2005/i/robert/src/ai/Makefile.defs @@ -4,6 +4,7 @@ ai_OBJECTS = ai.o test_ai_OBJECTS = test_ai.o $(ai_OBJECTS) $(motor_OBJECTS) $(log_OBJECTS) \ $(asserv_OBJECTS) $(proto_OBJECTS) $(utils_OBJECTS) $(serial_OBJECTS) \ -$(timer_OBJECTS) $(config_OBJECTS) $(scheduler_OBJECTS) $(es_OBJECTS) +$(timer_OBJECTS) $(config_OBJECTS) $(scheduler_OBJECTS) $(es_OBJECTS) \ +$(ovision_OBJECTS) $(video4linux_OBJECTS) $(image_OBJECTS) test_ai: $(test_ai_OBJECTS) diff --git a/2005/i/robert/src/ai/ai.cc b/2005/i/robert/src/ai/ai.cc index 55cb27d..7cd50ab 100644 --- a/2005/i/robert/src/ai/ai.cc +++ b/2005/i/robert/src/ai/ai.cc @@ -71,8 +71,8 @@ void Ai::init(void) // initialise la carte es es_.init(); // on init la vision - //oVision_.init(motor_.colorState() ? Group::redSkittle : -// Group::greenSkittle); /// XXX + oVision_.init(motor_.colorState() ? Group::redSkittle : + Group::greenSkittle); while (!update()); } @@ -400,6 +400,75 @@ Ai::parcourtFond (void) std::cout << "Fini : " << Timer::getRoundTime () << std::endl; } +// *** Fonctions de vision *** + +// On scan tout autour du robot +void Ai::scanVision (bool followLine) /// XXX mettre un argument +{ + double angleDepart = motor_.getA(); + std::vector > skittles; + for (int i = 0; i < (followLine ? 1 : 4) ; i++) + { + // On prend la photo + oVision_.takeShoot(); + // On analyse la photo + oVision_.update(); + // On mets la liste brute dans le vector + skittles.push_back(oVision_.getSkittles()); + // on tournicote + motor_.rotation(angleDepart + ((i + 1) * M_PI/4)); + } + analyseSkittles(skittles); +} + +// XXX Aucun moyen de tourner pour l'instant (donc followLine only) +// On analyse les quilles pour ne garder que les prétendants +void Ai::analyseSkittles(std::vector > skittlesBrut) +{ + goodSkittles_.clear(); + // On regarde pour tout les angles + for(std::vector >::iterator it = skittlesBrut.begin(); + it != skittlesBrut.end(); it++) + { + // On regarde zone par zone + for(std::vector::iterator it2 = it->begin(); it2 != it->end(); it2++) + { + if (!it2->alone) + continue; + if (it2->vertical) + continue; + if (it2->partial) + continue; + if (it2->small) + continue; + goodSkittles_.push_back(*it2); + } + } +} + + +// On remonte la ze quille la meilleur détecté par la cam +void Ai::remonteWithCam(void) +{ + int x, y , angle, dist; + Zone zeSkittles = goodSkittles_.back(); + oVision_.getLoc(zeSkittles, x, y, angle, dist); + dist -= 9; + rotation(motor_.getA() + angle); + setMaxSpeed(2,1); + basic(dist); + ascenceur(true); + basic (-dist - 5); + rotation(M_PI); + rotation(M_PI / 2); + basic(30); // XXX vérifier valeur + ventouses(); + setMaxSpeed(8, 4); + basic(-30); // XXX Vérifier valeur + ascenceur(false); + rotation(3 * M_PI / 4); +} + // Va du point de départ au pont pour protéger les quilles. void Ai::protectQuillePont (void) diff --git a/2005/i/robert/src/ai/ai.hh b/2005/i/robert/src/ai/ai.hh index 5905156..8454706 100644 --- a/2005/i/robert/src/ai/ai.hh +++ b/2005/i/robert/src/ai/ai.hh @@ -40,7 +40,7 @@ class Ai // Modules de controle du robot Motor motor_; Es es_; - //OVision oVision_; + OVision oVision_; // Scheduler du robot scheduler::Scheduler scheduler_; scheduler::SchedulableReadFd schedulableMotor_; @@ -50,6 +50,8 @@ class Ai const int vitesseAsc_; // Temps de temporisation const int tempoDebutMatch_; + // Tableau de bonne quilles + std::vector goodSkittles_; public: /// Constructeur. @@ -85,13 +87,15 @@ class Ai bool sync (void); /// Reset la PWM à zéro. void resetPwm (void); - + // Balistique non fiable. void runBalNonFiable (void); // Balistique fiable. void runBalFiable (void); // Pour les tests. void runTest (void); + /// Automate suiveur de ligne vision + void runVisionLine(void); /// Initialise le robot pour faire un match (placement). void initMatch (void); @@ -100,9 +104,17 @@ class Ai // Va du point de départ au pont pour protéger les quilles. void protectQuillePont (void); void setMaxSpeed (int l, int r); + void scanVision(bool followLine); void setAccel (int a); void runProtectFond (void); void parcourtFond (void); + // *** Fonctions de vision + // On scan tout autour du robot + void scanVision (void); + // On analyse les quilles pour ne garder que les prétendants + void analyseSkittles(std::vector > skittlesBrut); + // On remonte la ze quille la meilleur détecté par la cam + void remonteWithCam (void); }; #endif // ai_hh -- cgit v1.2.3