From d9ed4228c82fb0f1a3eb4a703b3e5cc655f23c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Payen=20de=20La=20Garanderie?= <gregoire.payendelagaranderie@telecom-bretagne.eu> Date: Fri, 11 Feb 2011 14:16:01 +0100 Subject: [PATCH] Abstraction de la notion de commmande. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L’idée est d’utiliser une classe de base Command qui présente à l’asservissement une interface commune. On peut ainsi construire une grande variété de commande sans changer l’asservissement. --- stm32/include/command.h | 12 +++++++++++- stm32/include/simul/robot.h | 2 +- stm32/include/strategie.h | 6 +++--- stm32/src/command.cpp | 10 +++++----- stm32/src/simul/robot.cpp | 2 +- stm32/src/strategie.cpp | 4 ++-- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/stm32/include/command.h b/stm32/include/command.h index 9b094c7e..7f5d5e17 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 a77838ea..95a086dc 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 f908d2f8..3e2640de 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 b3d448bd..8f301f05 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 0534d86c..be62c536 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 9d497705..c8d51763 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; -- GitLab