diff --git a/stm32/include/command.h b/stm32/include/command.h index 9b094c7e2418c72267d2b29b2fc2da733e052f72..7f5d5e170072c8478f09b080cab725ae1dc2c044 100644 --- a/stm32/include/command.h +++ b/stm32/include/command.h @@ -1,8 +1,18 @@ #include "Angle.h" #include "PositionPlusAngle.h" + class Command { +public: + virtual void update(PositionPlusAngle positionPlusAngleActuelle, Angle vitesse_angulaire_atteinte, float vitesse_lineaire_atteinte) = 0; + + virtual float getLinearSpeed() = 0; + virtual Angle getAngularSpeed() = 0; +}; + +class TrapezoidalCommand : public Command +{ private: float vitesse_lineaire_a_atteindre; Angle vitesse_angulaire_a_atteindre; @@ -17,7 +27,7 @@ private: bool direction; bool stop; public: - Command(); + TrapezoidalCommand(); void update(PositionPlusAngle positionPlusAngleActuelle, Angle vitesse_angulaire_atteinte, float vitesse_lineaire_atteinte); void goTo(Position position, bool stop=true); diff --git a/stm32/include/simul/robot.h b/stm32/include/simul/robot.h index a77838eae2a327f6e3bf32641f194cc7d2b18eed..95a086dcbc564473d09105f04b29bac23533b863 100644 --- a/stm32/include/simul/robot.h +++ b/stm32/include/simul/robot.h @@ -17,7 +17,7 @@ public: PositionPlusAngle pos; PositionPlusAngle deriv; boost::circular_buffer<PositionPlusAngle> olds; - class Command* command; + class TrapezoidalCommand* command; class OdoRobot* odometrie; class Strategie* strategie; diff --git a/stm32/include/strategie.h b/stm32/include/strategie.h index f908d2f893924043f7c74dd10781fba0121de122..3e2640dec6d21da3a8a608b9ee705a8facb78d8e 100755 --- a/stm32/include/strategie.h +++ b/stm32/include/strategie.h @@ -7,13 +7,13 @@ #include <stdint.h> -class Command; +class TrapezoidalCommand; class Odometrie; class Strategie { private: bool is_blue; - Command* command; + TrapezoidalCommand* command; void doNext(); int instruction_nb; bool collision_detected; @@ -21,7 +21,7 @@ class Strategie { public: void collisionDetected(); - Strategie(bool is_blue, Command* command, Odometrie* odometrie); + Strategie(bool is_blue, TrapezoidalCommand* command, Odometrie* odometrie); void foundOtherRobot(); void done(); void doNthInstruction(uint16_t n); diff --git a/stm32/src/command.cpp b/stm32/src/command.cpp index b3d448bd60779dc2de6565d74b323ced0ae08eaa..8f301f0559d1b44539afe5164188fa6b54c5c26f 100644 --- a/stm32/src/command.cpp +++ b/stm32/src/command.cpp @@ -11,7 +11,7 @@ template<class T> T max(T a, T b) return a > b ? a : b; } -Command::Command() : +TrapezoidalCommand::TrapezoidalCommand() : vitesse_lineaire_a_atteindre(0), vitesse_angulaire_a_atteindre(0), #if 0 @@ -30,7 +30,7 @@ Command::Command() : #include <iostream> -void Command::update(PositionPlusAngle positionPlusAngleActuelle, Angle vitesse_angulaire_atteinte, float vitesse_lineaire_atteinte) +void TrapezoidalCommand::update(PositionPlusAngle positionPlusAngleActuelle, Angle vitesse_angulaire_atteinte, float vitesse_lineaire_atteinte) { Position vecteur_pos_actuelle_pos_arrivee = destination-positionPlusAngleActuelle.position; @@ -50,7 +50,7 @@ void Command::update(PositionPlusAngle positionPlusAngleActuelle, Angle vitesse_ -Distance Command::getVitesseLineaireAfterTrapeziumFilter(Distance vitesse_lineaire_atteinte, Distance distance_restante, Angle angle_restant) +Distance TrapezoidalCommand::getVitesseLineaireAfterTrapeziumFilter(Distance vitesse_lineaire_atteinte, Distance distance_restante, Angle angle_restant) { // Le pivot est la distance que l'on parcourerait si on commencait à décélérer dès maintenant jusqu'une vitesse nulle @@ -90,7 +90,7 @@ Distance Command::getVitesseLineaireAfterTrapeziumFilter(Distance vitesse_lineai } } -Angle Command::getVitesseAngulaireAfterTrapeziumFilter(Angle vitesse_angulaire_atteinte, Angle angle_restant) +Angle TrapezoidalCommand::getVitesseAngulaireAfterTrapeziumFilter(Angle vitesse_angulaire_atteinte, Angle angle_restant) { if(fabs(wrapAngle(angle_restant))>M_PI_2 + 0.01) { @@ -109,7 +109,7 @@ Angle Command::getVitesseAngulaireAfterTrapeziumFilter(Angle vitesse_angulaire_a } } -void Command::goTo(Position position, bool stop) +void TrapezoidalCommand::goTo(Position position, bool stop) { destination = position; direction = false; diff --git a/stm32/src/simul/robot.cpp b/stm32/src/simul/robot.cpp index 0534d86c538e9a9a11bedc4324b1be41e94d55d1..be62c536734d9eb695504707846b8f2f0764bd81 100644 --- a/stm32/src/simul/robot.cpp +++ b/stm32/src/simul/robot.cpp @@ -51,7 +51,7 @@ Robot::Robot(b2World & world) : world(world), olds(10000) level = 0; odometrie = new OdoRobot(this); - command = new Command; + command = new TrapezoidalCommand; Asservissement* asservissement = new Asservissement(odometrie, command); strategie = new Strategie(true, command, odometrie); asservissement->strategie = strategie; diff --git a/stm32/src/strategie.cpp b/stm32/src/strategie.cpp index 9d497705da967ae170ab6923b2b46c74694cdaca..c8d51763ca85b2e5ceede8b71b1f2330bd93837e 100755 --- a/stm32/src/strategie.cpp +++ b/stm32/src/strategie.cpp @@ -12,7 +12,7 @@ #define INSTRUCTION_COLLISION 128 -Strategie::Strategie(bool is_blue, Command* command, Odometrie* odometrie) : +Strategie::Strategie(bool is_blue, TrapezoidalCommand* command, Odometrie* odometrie) : collision_detected(false) { this->is_blue = is_blue; @@ -66,7 +66,7 @@ void Strategie::doNthInstruction(uint16_t n){ int cote = (is_blue ? 1:-1); if(n==1) - command->goTo(Position(1500, 700)); + command->goTo(Position(1500, 1000)); return; //rouleau.recracheBoule(); //return;