// ai.cc // robert - programme du robot 2005. {{{ // // Copyright (C) 2005 Nicolas Haller // // Robot APB Team/Efrei 2005. // Web: http://assos.efrei.fr/robot/ // Email: robot AT efrei DOT fr // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // }}} #include #include "ai.hh" #include "config/config.hh" #include "timer/timer.hh" #include "ovision/see/ovision.hh" static void callback (void) { } /// Constructeur Ai::Ai(const Config & config) :motor_(config), es_(config), schedulableMotor_ (callback, motor_.getFd ()), schedulableEs_ (callback, es_.getFd ()), roundDuration_(config.get("ai.roundDuration")), vitesseAsc_(config.get("ai.vitesseAsc")) { //instance = this scheduler_.insert (schedulableMotor_); scheduler_.insert (schedulableEs_); } Ai::~Ai (void) { init (); do { update (); } while (motor_.sync ()); } /// Initialise le robot void Ai::init(void) { // Initialise les moteurs motor_.init(); // initialise la carte es es_.init(); // on init la vision //oVision_.init(motor_.colorState() ? Group::redSkittle : // Group::greenSkittle); /// XXX update(); } /// stop le robot void Ai::stop(void) { // Stop les moteurs motor_.stop(); } /// Lance le robot void Ai::run(void) { //Initialise le robot std::cout << "On init le robot" << std::endl; init(); // Attend l'entrée du jack "pret à initialiser" std::cout << "On attend le jack" << std::endl; waitJack(false); std::cout << "Le jack est mis" << std::endl; // Attend la première sortie du jack(init) waitJack(true); std::cout << "Le jack est sorti" << std::endl; //On fait une rotation pour recaler y 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; // Attend le jack "pret à partir" waitJack(false); std::cout << "Le jack est mis" << std::endl; // Attend la seconde sortie du jack(Daniel) waitJack(true); std::cout << "Le jack est sortie" << std::endl; // on lance le temps std::cout << "Lancmeent du match" << std::endl; Timer::startRound(); // On temporise pour laisser Taz sortir std::cout << "Attente du 15 secondes" << std::endl; temporisation(15000); ///XXX // 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 */ // On a fini notre run std::cout << "On a fini" << std::endl; } /// Attend. void Ai::wait (int t) { std::cout << "On attend le putain de Jack" << std::endl; motor_.wait(t); } /// Fonction de temporisation void Ai::temporisation(int t) { int time = Timer::getRoundTime(); time += t; while (time > Timer::getRoundTime()) { update(); } } // Attend le jack entré (false) ou sorti (true). void Ai::waitJack (bool out) { do { update(); } while (motor_.jackState() != out); } /// Rejoint un point. (argument en mm) void Ai::goTo (double x, double y ,double a) { motor_.goTo(x,y,a); do { update(); }while(!motor_.idle()); } /// Recale contre une bordure. // XXX Voir ca plus précisemment void Ai::recale (void) { motor_.recalage(); do { update(); } while(!motor_.idle()); } /// Mouvement basic. void Ai::basic (double d) { motor_.linearMove(d); do { update(); } while (!motor_.idle()); } /// Rotation (argument en radian) void Ai::rotation (double a) { // On vérifie que ca ne fasse pas moins de trois degré // XXX motor_.rotation(a); do { update(); }while (!motor_.idle()); // XXX Gérer le cas d'une rotation trop petite } /// Monte(vrai) ou descend(faux) l'ascenceur void Ai::ascenceur (bool monte) { if (monte) es_.monterAsc(); else es_.descendreAsc(); do { update(); } while(!es_.ascIsIdle()); } /// Désactive les ventouse void Ai::ventouses (void) /// XXX Temps à régler dans la config { es_.ventouses(); update(); } bool Ai::update (void) { scheduler_.schedule(500, true); // Gestion des cas critiques /// XXX sync (); // On vérifie que le match n'est pas fini if (Timer::getRoundTime () > roundDuration_) throw std::runtime_error ("Fin de match, merci d'avoir participé !"); return true; } void Ai::sync (void) { motor_.sync(); es_.sync(); }