Robot's source code

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
sype
Date:
Tue Apr 14 18:27:53 2015 +0000
Parent:
73:d8e1b543fbe3
Child:
80:5399183aa39b
Commit message:
PID posey

Changed in this revision

Asserv_Plan_B/planB.cpp Show annotated file Show diff for this revision Revisions of this file
Asserv_Plan_B/planB.h Show annotated file Show diff for this revision Revisions of this file
Odometry/Odometry2.cpp Show annotated file Show diff for this revision Revisions of this file
Odometry/Odometry2.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Asserv_Plan_B/planB.cpp	Sat Apr 11 10:36:56 2015 +0000
+++ b/Asserv_Plan_B/planB.cpp	Tue Apr 14 18:27:53 2015 +0000
@@ -14,12 +14,20 @@
     erreur_d = 0;
     cmd_g = 0;
     cmd_d = 0;
-    somme_erreur_g = 0;
+    somme_erreur = 0;
     somme_erreur_d = 0;
-    Kp = 0.02;
-    
-    
-    state = 0; // Etat ou on fait rien
+    delta_erreur = 0;
+    erreur_precedente = 0;
+    Kp = 0.30;
+    Ki = 0.01;
+    Kd = 0.5;
+    //etat_angle = 0;
+    cmd = 0;
+    N = 0;
+    moyenne = 0;
+    limite = 0;
+    done = false;
+    state = 0; // Etat ou l'on ne fait rien
 }
 
 void aserv_planB::setGoal(float x, float y, float theta)
@@ -27,7 +35,7 @@
     m_goalX = x;
     m_goalY = y;
     m_goalTheta = theta;
-    
+
     state = 1; // Etat de rotation 1
 }
 
@@ -35,12 +43,12 @@
 {
     vitesse_d = m_odometry.getVitRight();
     vitesse_g = m_odometry.getVitLeft();
-    
+
     erreur_g = consigne_g - vitesse_g;
     cmd_g = erreur_g*Kp;
     erreur_d = consigne_d - vitesse_d;
     cmd_d = erreur_d*Kp;
-    
+
     m_motorL.setSpeed(cmd_g);
     m_motorR.setSpeed(cmd_d);
 }
@@ -50,33 +58,46 @@
     if(state == 1)
     {
         float thetaGoal = atan2(m_goalY-m_odometry.getY(),m_goalX-m_odometry.getX());
-        
+
         float erreur_theta = thetaGoal-m_odometry.getTheta();
         if(erreur_theta <= PI) erreur_theta += 2.0*PI;
         if(erreur_theta >= PI) erreur_theta -= 2.0*PI;
+
+        logger.printf("%.2f\r\n",erreur_theta*180/PI);
         
-        //logger.printf("%.2f %.2f %.2f\r\n",m_odometry.getTheta()*180/PI,thetaGoal*180/PI,erreur_theta*180/PI);
+        /*if(erreur_theta < 0) etat_angle = 1;
+        else if(erreur_theta > 0) etat_angle = 2;
+        else etat_angle = 0;*/
+        /*limite = (0.5-Kp*erreur_theta)/Ki;
+        if(somme_erreur >= limite) somme_erreur = limite;
+        if(somme_erreur <= -limite) somme_erreur = -limite;*/
         
+        cmd = erreur_theta*Kp + somme_erreur*Ki - delta_erreur*Kd;
+        somme_erreur += erreur_theta;
+        delta_erreur = erreur_theta - erreur_precedente;
+        erreur_precedente = erreur_theta;
         
+        m_motorL.setSpeed(-cmd);
+        m_motorR.setSpeed(cmd);
+
         //! Pas bon coeff, mais c'est l'idée
         consigne_g = 0;//-erreur_theta*0.0001;
         consigne_d = 0;//erreur_theta*0.0001;
-        
-        control_speed();
-    }
-}
 
-void aserv_planB::control_position()
-{
-    //position_g = m_odometry.getPosRight();
-    //position_d = m_odometry.getPosLeft();
-    
-    erreur_position_g = consigne_position_g - position_g;
-    cmd_g = erreur_position_g*Kp;
-    
-    erreur_position_d = consigne_position_d - position_d;
-    cmd_d = erreur_position_d*Kp;
-    
-    m_motorL.setSpeed(cmd_g);
-    m_motorR.setSpeed(cmd_d);
+        /*if(erreur_theta <= abs(0.7))
+        {
+            done = true;
+            logger.printf("Posey\r\n");
+            state = 2;
+        }*/
+    }
+    /*switch(etat_angle)
+    {
+        case 0:
+
+        break;
+
+        case 1:
+
+        break;*/
 }
--- a/Asserv_Plan_B/planB.h	Sat Apr 11 10:36:56 2015 +0000
+++ b/Asserv_Plan_B/planB.h	Tue Apr 14 18:27:53 2015 +0000
@@ -8,7 +8,6 @@
     aserv_planB(Odometry2 &odometry,Motor &motorL,Motor &motorR);
     void update(float dt);
     void control_speed();
-    void control_position();
     void setGoal(float x, float y, float theta);
     float Kp, Ki, Kd;
 
@@ -21,12 +20,19 @@
     float erreur_d, vitesse_d;
     float cmd_g, cmd_d;
     float consigne_g, consigne_d;
-    float somme_erreur_g, somme_erreur_d;
-    
+    float somme_erreur, somme_erreur_d;
+    float delta_erreur;
+    float erreur_precedente;
     float m_goalX, m_goalY, m_goalTheta;
+    bool done;
+    int N;
+    float moyenne;
+    float limite;
     
     char state;
+    //char etat_angle;
     
+    float cmd;
     float erreur_position_g, position_g;
     float erreur_position_d, position_d;
     float consigne_position_g, consigne_position_d;
--- a/Odometry/Odometry2.cpp	Sat Apr 11 10:36:56 2015 +0000
+++ b/Odometry/Odometry2.cpp	Tue Apr 14 18:27:53 2015 +0000
@@ -40,7 +40,7 @@
     this->x = x;
 }
 
-void Odometry2::setY(float Y)
+void Odometry2::setY(float y)
 {
     this->y = y;
 }
--- a/Odometry/Odometry2.h	Sat Apr 11 10:36:56 2015 +0000
+++ b/Odometry/Odometry2.h	Tue Apr 14 18:27:53 2015 +0000
@@ -11,7 +11,7 @@
         
         void setPos(float x, float y, float theta);
         void setX(float x);
-        void setY(float Y);
+        void setY(float y);
         void setTheta(float theta);
         
         float getX() {return x;}
--- a/main.cpp	Sat Apr 11 10:36:56 2015 +0000
+++ b/main.cpp	Tue Apr 14 18:27:53 2015 +0000
@@ -6,7 +6,7 @@
 #include "Map.h"
 #include "AX12.h"
 
-#define PLAN_A
+#define PLAN_B
 
 #ifdef PLAN_A
     #include "Odometry.h"
@@ -19,8 +19,8 @@
 #include "Motor.h"
 /*----------------------------------------------------------------------------------------------*/
 /*Serial*/    
-Serial logger(OUT_TX, OUT_RX); // tx, rx
-//Serial logger(USBTX,USBRX);
+//Serial logger(OUT_TX, OUT_RX); // tx, rx
+Serial logger(USBTX,USBRX);
 //logger.baud((int)115200);
 /*----------------------------------------------------------------------------------------------*/
 
@@ -56,12 +56,12 @@
         QEI qei_right(PB_3,PA_10,NC,1024*4,QEI::X4_ENCODING);
         QEI qei_left(PB_4,PB_5,NC,1024*4,QEI::X4_ENCODING);
         
-        Odometry odometry(&qei_left,&qei_right,63/2.,63/2.,280);
+        Odometry odometry(&qei_left,&qei_right,63/2.,63/2.,255);
     #else
         QEI qei_left(ODO_G_A,ODO_G_B,NC,1024*4,QEI::X4_ENCODING);
         QEI qei_right(ODO_D_A,ODO_D_B,NC,1024*4,QEI::X4_ENCODING);
         
-        Odometry2 odometry(&qei_left,&qei_right,63/2.,63/2.,280);
+        Odometry2 odometry(&qei_left,&qei_right,63/2.,63/2.,255);
         
         odometry.setTheta(PI/2);
         odometry.setX(0);
@@ -112,7 +112,7 @@
         }
     #else
         aserv_planB asserv(odometry,motorL,motorR);
-        asserv.setGoal(-5000,-5000,0);
+        asserv.setGoal(1,-5000,0);
         
         t.start();
         t.reset();
@@ -122,9 +122,9 @@
             //Parametrage des coef par bluetooth
             while(logger.readable()) {
                 char c = logger.getc();
-                if(c=='a') asserv.Kp += 0.001;
-                else if(c=='z') asserv.Kp -= 0.001;
-                //logger.printf("%f\n\r",asserv.Kp);
+                if(c=='a') asserv.Kd += 0.001;
+                else if(c=='z') asserv.Kd -= 0.001;
+                logger.printf("%f\n\r",asserv.Kd);
             }
             
             //Asservissement :
@@ -133,7 +133,7 @@
             odometry.update(dt);
             asserv.update(dt);
             
-            wait(0.1);             
+            wait_ms(100);            
         }
     #endif