Skip to content
Snippets Groups Projects
Commit d9ed4228 authored by Grégoire Payen de La Garanderie's avatar Grégoire Payen de La Garanderie
Browse files

Abstraction de la notion de commmande.

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.
parent b74c8b35
No related branches found
No related tags found
No related merge requests found
#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);
......
......@@ -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;
......
......@@ -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);
......
......@@ -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;
......
......@@ -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;
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment