Dependencies:   mbed FatFileSystem

Revision:
1:0c42db451cb9
Parent:
0:75227c386257
--- a/main.cpp	Sun Jun 10 08:44:32 2012 +0000
+++ b/main.cpp	Mon Sep 17 09:39:54 2012 +0000
@@ -54,24 +54,24 @@
 int main(){ 
     
     pc.baud(921600);
-    navi.baud(57600);
+    navi.baud(115200);
     xbee.baud(57600);
     
+    // SD card
     FILE *fp = fopen("/sd/sdtest.txt", "w");
     if(fp == NULL) {
         error("Could not open file for write\n");
         while(1){   led2 = 1;   wait(.5);   led2 = 0;   led3 = 0;    wait(.5);  led3 = 0;   }
     }
     
-    int correct_period  =   100;
+    int correct_period  =   200;
     int navi_period     =   10;
     int xbee_period     =   100;
     int correct_loop    =   0;
     int navi_loop       =   10;
     int xbee_loop       =   100;
         
-    double dt_wait = 0.002;
-    //double dt_wait = 0.01;
+    double dt_wait = 0.002;      // 100Hz
     double dt =   0.01;
     double t  = 0;
 
@@ -108,33 +108,47 @@
 
     // Optimal regulator
     double state[L];
-    
-
+/*    
     // Gain (q1=100, q2=100, q3=50, q4=50, q5=1)
-
-    // Gain (q1=100, q2=100, q3=50, q4=50, q5=5)
-
+    double Kr[M][L] = {{ 0, 5.774,     0, 4.168, 0.408},
+                       {-5, 2.887,-3.610, 2.084,-0.408},
+                       {-5,-2.887,-3.610,-2.084, 0.408},
+                       { 0,-5.774,     0,-4.168,-0.408},
+                       { 5,-2.887, 3.610,-2.084, 0.408},
+                       { 5, 2.887, 3.610, 2.084,-0.408}};
+*//*
     // Gain (q1=100, q2=100, q3=50, q4=50, q5=10)
-
-    // Gain (q1=100, q2=100, q3=50, q4=50, q5=20)
-
-    // Gain (q1=100, q2=100, q3=50, q4=50, q5=30)
-    double Kr[M][L] = {{ 0,	5.774,     0, 4.168, 0.408},
-                       {-5, 2.887,-3.610, 2.084,-0.408},
-                       {-5,-2.887,-3.610,-2.084,-0.408},
-                       { 0,-5.774,     0,-4.168, 0.408},
-                       { 5,-2.887, 3.610,-2.084,-0.408},
-                       { 5, 2.887, 3.610, 2.084, 0.408}};
-
-    // Coefficient for moving control
-    double Ccom_r   =   0.2;
-    double Ccom_p   =   0.2;
+    double Kr[M][L] = {{ 0, 5.774,     0, 4.168, 0.9129},
+                       {-5, 2.887,-3.610, 2.084,-0.9129},
+                       {-5,-2.887,-3.610,-2.084, 0.9129},
+                       { 0,-5.774,     0,-4.168,-0.9129},
+                       { 5,-2.887, 3.610,-2.084, 0.9129},
+                       { 5, 2.887, 3.610, 2.084,-0.9129}};
+*/
+    double Kr[M][L] = {{ 0, 5.774,     0, 4.168, 17},
+                       {-5, 2.887,-3.610, 2.084,-17},
+                       {-5,-2.887,-3.610,-2.084, 17},
+                       { 0,-5.774,     0,-4.168,-17},
+                       { 5,-2.887, 3.610,-2.084, 17},
+                       { 5, 2.887, 3.610, 2.084,-17}};
+/*    
+    // Gain (q1=100, q2=100, q3=50, q4=50, q5=10)
+    double Kr[M][L] = {{ 0, 5.774,     0, 4.168, 1.291},
+                       {-5, 2.887,-3.610, 2.084,-1.291},
+                       {-5,-2.887,-3.610,-2.084, 1.291},
+                       { 0,-5.774,     0,-4.168,-1.291},
+                       { 5,-2.887, 3.610,-2.084, 1.291},
+                       { 5, 2.887, 3.610, 2.084,-1.291}};
+*/
+    // Coefficient for position control
+    double Ccom_r   =   0.3;
+    double Ccom_p   =   0.3;
     double Ccom_y   =   0.1;
     
-    double motor[M]             =   {0};
-    double motor_control[M]     =   {0};    // Pulth width generated by the transmitter
-    double motor_attitude[M]    =   {0};    // Pulth width generated by the attitude control 
-
+    double motor_control[M]     =   {0};    // Pulth width generated by the transmitter [s]
+    double motor_attitude[M]    =   {0};    // Pulth width generated by the attitude control [s]
+    double motor[M]             =   {0};    // motor_control + motor_attitude [s]
+    
     // Coefficient of transfering Force to Puls
     double Cfp      =   2*pow(10.0, -7);
     
@@ -192,6 +206,12 @@
     // Wait some time for ESC (about 10s)
     wait(5);
 
+    // *** Calibration routine ***
+    p_calib = calib();
+    for( int i=0;i<3;i++ ){     calib_acc[i]    =   *p_calib;   p_calib = p_calib+1;    }
+    for( int i=3;i<6;i++ ){     calib_gyro[i-3] =   *p_calib;   p_calib = p_calib+1;    }
+    //compass_basis_rad   =   *p_calib;
+    
     // *** Setting up navigator ***
     //pc.printf("Setting up navigator\r\n");
     xbee.printf("Setting up navigator\r\n");
@@ -199,21 +219,17 @@
         navi_flag   =   1;
         for( int i=0;i<chan_buf;i++ ){
             navi.scanf("%c",&command_buf1[i]);
+            //pc.printf("%c",command_buf1[i]);
             if(command_buf1[i]=='a'){
                 set_navi_flag=1;
+                //pc.printf("\r\nbreak!!\r\n");
                 break;
             }
         }
         navi_flag   =   0;
         wait(.1);
     }
-
-    // *** Calibration routine ***
-    p_calib = calib();
-    for( int i=0;i<3;i++ ){     calib_acc[i]    =   *p_calib;   p_calib = p_calib+1;    }
-    for( int i=3;i<6;i++ ){     calib_gyro[i-3] =   *p_calib;   p_calib = p_calib+1;    }
-    //compass_basis_rad   =   *p_calib;
-
+    
     led1 = 1;    led2 = 1;  led3 = 1;   led4 = 1;
     
     //pc.printf("Starting IMU unit\n\r");
@@ -221,7 +237,6 @@
     //pc.printf("   time      phi      the        P        Q        R     accX     accY     accZ    LWMAX    LWMAY    LWMAZ      alt      T1      T2      T3      T4      T5      T6    thro    roll   pitch     yaw\n\r");
     xbee.printf("   time      phi      the        P        Q        R     accX     accY     accZ    LWMAX    LWMAY    LWMAZ      T1      T2      T3      T4      T5      T6    thro    roll   pitch     yaw\n\r");
     
-    //while(1){
     while( stop==0 ){
         
         // Navigation 
@@ -233,8 +248,8 @@
             for( int i=0;i<chan_buf;i++ ){  
                 command_buf2[i] = (int)command_buf1[i]-48;
                 if( command_buf2[i]==-16 ){     command_buf2[i]=0;      }
+                //pc.printf("%d",command_buf2[i]);
             }
-            //for( int i=0;i<chan;i++ ){  command[i]  =   0.0001*command_buf2[1+i*4]+0.00001*command_buf2[2+i*4]+0.000001*command_buf2[3+i*4]+0.001;  }
             command[0]  =   0.0001*command_buf2[1]+0.00001*command_buf2[2]+0.000001*command_buf2[3]+0.001;
             for( int i=1;i<chan;i++ ){  command[i]  =   0.0001*command_buf2[1+i*4]+0.00001*command_buf2[2+i*4]+0.000001*command_buf2[3+i*4]-0.0005;     }
             
@@ -243,7 +258,6 @@
         
         }
         navi_loop++;
-        //command[0]    =   0.0016;         // Shiyougo comentout surukoto!!
         
         // Updating accelerometer and compass
         accelerometer.getOutput(bit_acc);
@@ -253,23 +267,23 @@
         acc[0]      =  (((int16_t)bit_acc[0]-calib_acc[0])-((int16_t)bit_acc[1]-calib_acc[1]))*0.004/sqrt(2.0);
         acc[1]      =  (((int16_t)bit_acc[0]-calib_acc[0])+((int16_t)bit_acc[1]-calib_acc[1]))*0.004/sqrt(2.0);
         acc[2]      =  ((int16_t)bit_acc[2]-calib_acc[2])*0.004+1;
-
+        
         gyro_deg[0] = ((gyro.getGyroX()-calib_gyro[0])-(gyro.getGyroY()-calib_gyro[1]))/14.375/sqrt(2.0);
         gyro_deg[1] = (-(gyro.getGyroX()-calib_gyro[0])-(gyro.getGyroY()-calib_gyro[1]))/14.375/sqrt(2.0);          // Modify the differencial of the sensor axis 
         gyro_deg[2] = -(gyro.getGyroZ()-calib_gyro[2])/14.375;
-
+        
         // Limitter for acc
         if( acc[0]<-1 ){  acc[0] = -1;    }  if( 1<acc[0] ){  acc[0] = 1;    }
         if( acc[1]<-1 ){  acc[1] = -1;    }  if( 1<acc[1] ){  acc[1] = 1;    }
         if( acc[2]<-0 ){  acc[2] = -0;    }  if( 2<acc[2] ){  acc[2] = 2;    }
-
+        
         for( int i=0;i<N;i++ ){     d_acc[i] = acc[i]-acc_pre[i];      }
         if( abs(d_acc[0])>=0.5 && abs(acc[0])>=0.3 ){     acc[0] = acc_pre[0];    }
         if( abs(d_acc[1])>=0.5 && abs(acc[1])>=0.3 ){     acc[1] = acc_pre[1];    }
         if( abs(d_acc[2])>=0.5 ){     acc[2] = acc_pre[2];    }
-
+        
         for( int i=0;i<N_2;i++ ){    gyro_rad[i] = gyro_deg[i]*pi/180;    }
-
+        
         // LWMA (Observation)
         p_zLWMA = LWMA(acc);
         for( int i=0;i<N;i++ ){     zLWMA[i] = *p_zLWMA;    p_zLWMA = p_zLWMA+1;    }
@@ -293,7 +307,7 @@
         for( int i=0;i<N_2;i++ ){   if( abs(angle_rad[i])>=1.05 ){  angle_rad[i] = angle_rad_pre[i];    }   }
         
         for( int i=0;i<N_2;i++ ){    angle_deg[i] = angle_rad[i]*180/pi;    }
-
+        
         state[0]    =   angle_deg[0];   state[1]    =   angle_deg[1];
         state[2]    =   gyro_deg[0];    state[3]    =   gyro_deg[1];    state[4]    =   gyro_deg[2];
         
@@ -310,39 +324,36 @@
         motor_control[5]    =   command[0]+1*Ccom_r*command[1]-1*Ccom_p*command[2]-1*Ccom_y*command[3];
         
         for( int i=0;i<M;i++ ){     motor[i] = motor_control[i]+motor_attitude[i]*Cfp;     }
-        //for( int i=0;i<M;i++ ){     motor[i] = command[0];     }
-        
-        // pulsewidth 0.0011~0.0019 (0.001~0.002?)
+                
+        // pulsewidth 0.0011~0.0019 [s] (0.001~0.002?)
         for( int i=0;i<M;i++ ){
-            if( motor[i]>0.00195 ){     motor[i]=0.00195;     }
-            if( motor[i]<0.0012 ){     motor[i]=0.00105;      }
+            if( motor[i]>0.00195 ){     motor[i]=0.00195;     }     // Notice! If motor inputs are too large, motors and ESCs may burst.
+            if( motor[i]<0.0012 ){     motor[i]=0.0012;      }      // Notice! If motor inputs are about 0.0011 [s] for some time, motors and ESCs may burst.
             if( command[0]<0.0011 ){     motor[i]=0.00105;      }
         }
-
+        
+        // Updating ESC pulse width
         ESC1.pulsewidth(motor[0]);  ESC2.pulsewidth(motor[1]);  ESC3.pulsewidth(motor[2]);  ESC4.pulsewidth(motor[3]);  ESC5.pulsewidth(motor[4]);  ESC6.pulsewidth(motor[5]);
         
         //for( int i=0;i<M;i++ ){    thrust[i] = 630000.0*motor[i]*motor[i]-700.0*motor[i];  }
         
-        //pc.printf("%7.2f, %7.3f, %7.3f, %7.3f, %7.1f, %7.1f, %7.1f, %5d, %5d, %5d\n\r", t, acc[0], acc[1], acc[2], gyro_deg[0], gyro_deg[1], gyro_deg[2], mag[0], mag[1], mag[2]);
-        //pc.printf("%7.2f, %7.1f, %7.1f, %7.1f, %7.1f, %7.1f, %7.3f, %7.3f, %7.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f\n\r", t, state[0], state[1], state[2], state[3], state[4], zLWMA[0], zLWMA[1], zLWMA[2], motor[0]*1000, motor[1]*1000, motor[2]*1000, motor[3]*1000, motor[4]*1000, motor[5]*1000, command[0]*1000, command[1]*1000, command[2]*1000, command[3]*1000);
-        //fprintf(fp,"%7.2f, %7.3f, %7.3f, %7.3f, %7.1f, %7.1f, %7.1f, %6.3f\r", t, acc[0], acc[1], acc[2], gyro_deg[0], gyro_deg[1], gyro_deg[2], command[0]*1000);
         fprintf(fp,"%7.2f, %7.1f, %7.1f, %7.1f, %7.1f, %7.1f, %7.3f, %7.3f, %7.3f, %7.3f, %7.3f, %7.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f\n", t, state[0], state[1], state[2], state[3], state[4], acc[0], acc[1], acc[2], zLWMA[0], zLWMA[1], zLWMA[2], motor[0]*1000, motor[1]*1000, motor[2]*1000, motor[3]*1000, motor[4]*1000, motor[5]*1000, command[0]*1000, command[1]*1000, command[2]*1000, command[3]*1000);
         if( xbee_loop>=xbee_period ){
             xbee.printf("%7.2f, %7.1f, %7.1f, %7.1f, %7.1f, %7.1f, %7.3f, %7.3f, %7.3f, %7.3f, %7.3f, %7.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f, %6.3f\n\r", t, state[0], state[1], state[2], state[3], state[4], acc[0], acc[1], acc[2], zLWMA[0], zLWMA[1], zLWMA[2], motor[0]*1000, motor[1]*1000, motor[2]*1000, motor[3]*1000, motor[4]*1000, motor[5]*1000, command[0]*1000, command[1]*1000, command[2]*1000, command[3]*1000);
             xbee_loop   =   0;
         }
-
+        
         for( int i=0;i<N;i++ ){     acc_pre[i] = acc[i];   }
         //for( int i=0;i<N;i++ ){     gyro_deg_pre[i] = gyro_deg[i];  }
         for( int i=0;i<N_2;i++ ){     angle_rad_pre[i] = angle_rad[i];   }
-
+        
         xbee_loop++;
         wait(dt_wait);
         t += dt;
         
     }
     
-    // pulsewidth 0.0011~0.00195
+    // pulsewidth 0.0011~0.00195 [s]
     ESC1.pulsewidth(0.001);   ESC2.pulsewidth(0.001);   ESC3.pulsewidth(0.001);   ESC4.pulsewidth(0.001);   ESC5.pulsewidth(0.001);   ESC6.pulsewidth(0.001);
     led1 = 0;    led2 = 0;  led3 = 0;   led4    =   0;
     fclose(fp);
@@ -567,6 +578,7 @@
     
     f[0]    =   x[0]+x[1]*sin(y[0])*tan(y[1]);
     f[1]    =   x[1]*cos(y[0]);
+    // Without a, f[1] is not passed main function for unknown reason.
     a       =   sin(b);
     
     return p_f;
@@ -589,7 +601,7 @@
 
     double* p_calib_result      =   calib_result;
 
-    pc.printf("Don't touch... Calibrating now!!\n\r");
+    //pc.printf("Don't touch... Calibrating now!!\n\r");
     xbee.printf("Don't touch... Calibrating now!!\n\r");
     led1    =   1;
     
@@ -628,9 +640,9 @@
     compass_basis_rad   =   atan(compass_basis_rad);
     led1 = 0;    led2 = 0;  led3 = 0;   led4    =   0;
     
-    pc.printf("  accX    accY    accZ   gyroX   gyroY   gyroZ    yaw_basis\n\r");
+    //pc.printf("  accX    accY    accZ   gyroX   gyroY   gyroZ    yaw_basis\n\r");
     xbee.printf("  accX    accY    accZ   gyroX   gyroY   gyroZ    yaw_basis\n\r");
-    pc.printf("%6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f\n\r",calib_acc[0],calib_acc[1],calib_acc[2],calib_gyro[0],calib_gyro[1],calib_gyro[2],compass_basis_rad*180/pi);
+    //pc.printf("%6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f\n\r",calib_acc[0],calib_acc[1],calib_acc[2],calib_gyro[0],calib_gyro[1],calib_gyro[2],compass_basis_rad*180/pi);
     xbee.printf("%6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f, %6.1f\n\r",calib_acc[0],calib_acc[1],calib_acc[2],calib_gyro[0],calib_gyro[1],calib_gyro[2],compass_basis_rad*180/pi);
     
     for( int i=0;i<3;i++ ){     calib_result[i] =   calib_acc[i];    }
@@ -638,7 +650,7 @@
     calib_result[6] =  compass_basis_rad;
     
     if( calib_result[0]==0 && calib_result[1]==0 && calib_result[2]==0 ){
-        pc.printf("Accelerometer is not available.\r\n");
+        //pc.printf("Accelerometer is not available.\r\n");
         xbee.printf("Accelerometer is not available.\r\n");
     }