summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--2005/i/robert/src/ai/Makefile.defs3
-rw-r--r--2005/i/robert/src/ai/ai.cc73
-rw-r--r--2005/i/robert/src/ai/ai.hh16
3 files changed, 87 insertions, 5 deletions
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<std::vector<Zone> > 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<std::vector<Zone> > skittlesBrut)
+{
+ goodSkittles_.clear();
+ // On regarde pour tout les angles
+ for(std::vector<std::vector<Zone> >::iterator it = skittlesBrut.begin();
+ it != skittlesBrut.end(); it++)
+ {
+ // On regarde zone par zone
+ for(std::vector<Zone>::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<Zone> 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<std::vector<Zone> > skittlesBrut);
+ // On remonte la ze quille la meilleur détecté par la cam
+ void remonteWithCam (void);
};
#endif // ai_hh