Robot's source code

Dependencies:   mbed

Revision:
94:5c37bcf73d14
Parent:
81:08eacb6179d8
Child:
100:a827a645d6c2
--- a/Asservissement/Asserv.h	Fri Apr 24 11:12:44 2015 +0000
+++ b/Asservissement/Asserv.h	Thu Apr 30 16:03:55 2015 +0000
@@ -1,7 +1,9 @@
 /*KalmanFilter*/
 #include "EKF.h"
 #include "Odometry.h"
-#define debugAsserv
+//#define debugAsserv
+#define verboseGOAL
+
 /*
 template<typename T>
 Mat<T> motion_bicycle3( Mat<T> state, Mat<T> command, T dt = (T)0.5);
@@ -51,14 +53,26 @@
     r.set( r.get(2,1) + v*sin(r.get(3,1))*dt, 2,1);
     
     T angle = (r.get(3,1) + dt*w);
-    if( angle < -PI)
+    
+    while(angle > (T)PI)
     {
-        angle = angle - PI*ceil(angle/PI);
+         angle -= 2.0f*(T)PI;                 
+    }
+    while(angle <= -(T)PI)
+    {
+        angle += 2.0f*(T)PI;                
     }
-    else if( angle > PI)
+    
+    /*
+    if( angle < -(T)PI)
     {
-        angle = angle - PI*floor(angle/PI);
+        angle = angle - (T)PI*ceil(angle/PI);
     }
+    else if( angle > (T)PI)
+    {
+        angle = angle - (T)PI*floor(angle/PI);
+    }
+    */
     
     r.set( angle, 3,1);
     
@@ -227,6 +241,7 @@
     bool isarrived;
     bool isarrivedalpha;
     bool isarrivedrho;  
+    int behaviour;
     
     Asserv(Odometry* odometry)
     {        
@@ -260,12 +275,7 @@
         instanceEKF->initJSensor(jsensor_bicycle3);
         
         /*desired State : (x y theta phiright phileft)*/
-        dX = Mat<T>((T)0, nbrstate, 1);
-        dX.set( (T)0, 1,1);
-        dX.set( (T)0, 2,1);
-        dX.set( (T)0, 3,1);
-        dX.set( (T)0, 4,1);
-        dX.set( (T)0, 5,1);
+        dX = Mat<T>((T)0, nbrstate, 1);        
         
         dXalpha = dX;
         dXrho = dX;
@@ -299,6 +309,7 @@
         isarrivedalpha = true;
         isarrivedrho = true;
         execution = false;
+        behaviour = 0; //alpha : 1 : rho : 2 : dX (beta)
             
     }
     
@@ -309,6 +320,7 @@
     
     void setGoal(T x, T y, T theta)
     {
+        instanceEKF->resetPID();
         dX.set(x,1,1);
         dX.set(y,2,1);
         dX.set(theta,3,1);
@@ -318,11 +330,25 @@
         isarrived = false;
         isarrivedalpha = false;
         isarrivedrho = false;
+        behaviour = 0;
         
-        T alpha = atan21((dX.get(2,1)-X.get(2,1)),( dX.get(1,1) - X.get(1,1)));                        
-        alpha = alpha - atan21(sin(X.get(3,1)),cos(X.get(3,1)));            
-        //alpha = atan21( sin(alpha), cos(alpha));            
+        T alpha = atan2((dX.get(2,1)-X.get(2,1)),( dX.get(1,1) - X.get(1,1)));                        
+        alpha = alpha - X.get(3,1);//atan2(sin(X.get(3,1)),cos(X.get(3,1)));            
+        
+        while(alpha > (T)PI)
+        {
+             alpha -= 2.0f*(T)PI;                 
+        }
+        while(alpha <= -(T)PI)
+        {
+            alpha += 2.0f*(T)PI;                
+        }
+        
+        dXalpha.set( X.get(1,1), 1,1);
+        dXalpha.set( X.get(2,1), 2,1);
         dXalpha.set( alpha, 3,1);
+        dXalpha.set((T)0, 4,1);
+        dXalpha.set((T)0, 5,1);
         
         dXrho = dX;
         dXrho.set( alpha, 3,1);
@@ -350,14 +376,13 @@
             
             /*Gestion des comportements : alpha --> rho --> beta --> isarrived = true;*/
             /*------------------------------------------------------------------------*/
-            
-            int behaviour = 0; //alpha : 1 : rho : 2 : dX (beta)
-            Mat<T> dXbehaviour(dX);
-            if(isarrivedalpha &&  && phi_l+phi_r <= phi_max/10)
+                        
+            Mat<T> dXbehaviour(dX);            
+            if(isarrivedalpha && phi_l+phi_r <= phi_max/20 && behaviour == 0)
             {
                 behaviour=1;
             }
-            if(isarrivedalpha && isarrivedrho &&  && phi_l+phi_r <= phi_max/10)
+            if(isarrivedalpha && isarrivedrho && phi_l+phi_r <= phi_max/20 && behaviour == 1)
             {
                 behaviour = 2;
             }
@@ -365,7 +390,7 @@
             switch(behaviour)
             {
                 case 0:
-                if(fabs_(dXalpha.get(3,1)-X.get(3,1) ) <= (T)0.02)
+                if(fabs_(dXalpha.get(3,1)-X.get(3,1) ) <= (T)0.1)
                 {
                     behaviour = 1;
                     dXbehaviour = dXrho;
@@ -394,7 +419,7 @@
                 break;
                 
                 default:
-                if(norme2(dX-X) <=10)
+                if(norme2(dX-X) <=5)
                 {
                     isarrived = true;
                 }
@@ -405,19 +430,40 @@
                 dXbehaviour = dX;
                 break;
             }
+            
+#ifdef verboseGOAL
+            logger.printf("GOAL : ");
+            transpose(dXbehaviour).afficherMblue();
+            logger.printf("\r\nPOSE : ");
+            transpose(X).afficherMblue();
+#endif            
             /*------------------------------------------------*/
-            if( norme2( extract( dX-X,1,1,2,1)) <= 10 )
-                isarrivedrho = true;
+            //if( norme2( extract( dX-X,1,1,2,1)) <= 10 )
+            //    isarrivedrho = true;
                 
 #ifdef debugAsserv
-            logger.printf("BEHAVIOUR ASSERV : %d\r\n", behabiour);
+            logger.printf("BEHAVIOUR ASSERV : %d\r\n", behaviour);
 #endif 
-            instanceEKF->measurement_Callback( z, dXbehaviour, true );            
+            instanceEKF->measurement_Callback( z, dXbehaviour, true );  
+            
+#ifdef debugAsserv            
+            logger.printf("MEASUREMENT CALLBACK : DONE.\r\n");          
+#endif            
             //instanceEKF->state_Callback();
             instanceEKF->setX(z);
-            X = instanceEKF->getX();            
+            X = instanceEKF->getX();
             
-            instanceEKF->computeCommand(dXbehaviour, (T)dt, -1);                    
+#ifdef debugAsserv            
+            logger.printf("STATE CALLBACK : DONE. \r\n");
+            transpose(X).afficherMblue();
+            transpose(z).afficherMblue();
+#endif            
+            
+            //instanceEKF->computeCommand(dXbehaviour, (T)dt, -1);                    
+            instanceEKF->computeCommand(dXbehaviour, (T)dt, 1);                    
+#ifdef debugAsserv            
+            logger.printf("COMMAND CALLBACK : DONE. \r\n");
+#endif            
             //instanceEKF->computeCommand(dX, (T)dt, -2);                    
             phi_l = instanceEKF->getCommand().get(1,1);
             phi_r = instanceEKF->getCommand().get(2,1);                
@@ -433,9 +479,12 @@
     {
         z->set( (T)/*conversionUnitée mm */this->odometry->getX(), 1,1);
         z->set( (T)/*conversionUnitée mm*/this->odometry->getY(), 2,1);
+        
         T theta = (T)this->odometry->getTheta();
         theta = atan21(sin(theta),cos(theta));
+        
         z->set( (double)/*conversionUnitée rad*/theta, 3,1);//odometry->getTheta(), 3,1);   
+        
         T vx = (T)this->odometry->getVx();
         T vy = (T)this->odometry->getVy();
         z->set( sqrt(vx*vx+vy*vy),4,1);
@@ -480,4 +529,4 @@
     }
     
     
-};    
+};    
\ No newline at end of file