20160814

Dependencies:   CURRENT_CONTROL IIR LSM9DS0 MEDIAN_FILTER PID QEI RF24 SENSOR_FUSION mbed

Files at this revision

API Documentation at this revision

Comitter:
adam_z
Date:
Sun Aug 14 13:29:50 2016 +0000
Parent:
9:a91135551be1
Commit message:
20160814

Changed in this revision

IIR.lib Show annotated file Show diff for this revision Revisions of this file
LSM9DS0.lib Show annotated file Show diff for this revision Revisions of this file
RF24.lib 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
diff -r a91135551be1 -r 2dc43cd59ff0 IIR.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IIR.lib	Sun Aug 14 13:29:50 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/LDSC_Robotics_TAs/code/IIR/#3d8226c5abfe
diff -r a91135551be1 -r 2dc43cd59ff0 LSM9DS0.lib
--- a/LSM9DS0.lib	Thu Jul 28 08:17:30 2016 +0000
+++ b/LSM9DS0.lib	Sun Aug 14 13:29:50 2016 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/teams/LDSC_Robotics_TAs/code/LSM9DS0/#56ff956c499e
+https://developer.mbed.org/users/adam_z/code/LSM9DS0/#56ff956c499e
diff -r a91135551be1 -r 2dc43cd59ff0 RF24.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RF24.lib	Sun Aug 14 13:29:50 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/LDSC_Robotics_TAs/code/RF24/#6827b6f0283b
diff -r a91135551be1 -r 2dc43cd59ff0 main.cpp
--- a/main.cpp	Thu Jul 28 08:17:30 2016 +0000
+++ b/main.cpp	Sun Aug 14 13:29:50 2016 +0000
@@ -7,6 +7,10 @@
 #include "MEDIAN_FILTER.h"
 #include <algorithm>
 
+#include "nRF24L01.h"
+#include "RF24.h"
+
+
 #define Ts 0.001
 #define pi 3.14159
 
@@ -19,6 +23,9 @@
 DigitalOut debugLed_l(A4);
 DigitalOut debugLed_r(A5);
 
+DigitalIn BrokenIO(D13);
+
+
 InterruptIn SCEnable(USER_BUTTON);
 
 
@@ -28,8 +35,19 @@
 //void SensorAcquisition(float * data, float samplingTime);
 
 void bluetoothRx();
-void RXIrqLeft();
-void RXIrqRight();
+//void RXIrqLeft();
+//void RXIrqRight();
+
+
+// Set up nRF24L01 radio on SPI bus, and pins 9 (D6) & 10 (A2) on the Shield Shield
+RF24 radio(PB_15, PB_14, PB_13, PB_1, PB_2);//*****MOSI MISO SCK CE CS******
+
+RF24 radio_r(PB_15, PB_14, PB_13, PB_12, PA_11);
+
+const uint64_t left_pipe  = 0xF0F0F0F0AA;//These are just arbitrary 64bit numbers to use as pipe identifiers
+const uint64_t right_pipe = 0xF0F0F0F066;//They must be the same on both ends of the communciations
+
+
 
 void SCEnableFunc();
 bool SCEnalbeIndicator;
@@ -38,7 +56,7 @@
 CURRENT_CONTROL motorCur_L(PC_3, D8,  A3,CURRENT_CONTROL::PWM2,400, 900.0,0.0,Ts);
 CURRENT_CONTROL motorCur_R(PC_2, D7, D11,CURRENT_CONTROL::PWM1,400, 900.0,0.0,Ts);
 
-QEI wheel_L(D13, D12, NC, 280, 250, Ts, QEI::X4_ENCODING);
+QEI wheel_L(PC_9, D12, NC, 280, 250, Ts, QEI::X4_ENCODING);
 QEI wheel_R(A1,  A2,  NC, 280, 250, Ts, QEI::X4_ENCODING);
 
 
@@ -67,8 +85,8 @@
 float ref[4] = {0.0, 0.0, 0.0, 0.0};
 
 float torque_L = 0.0, torque_R = 0.0;
-float KL[4] = {-1.9483 ,  -0.1317 ,   0.0006*2  , -0.0112*2};//{-0.7057 ,  -0.0733 ,  -0.0085 ,  -0.0300};
-float KR[4] = {-1.9483,   -0.1317 ,  -0.0112*2 ,   0.0006*2};//{-0.7057 ,  -0.0733 ,  -0.0300 ,  -0.0085};
+float KL[4] = {-0.9666  , -0.1093*0.5  ,0.0,0.0};//-0.0177/2 ,  -0.0641/2};//{-0.7057 ,  -0.0733 ,  -0.0085 ,  -0.0300};
+float KR[4] = {-0.9666  , -0.1093*0.5 ,0.0,0.0};// -0.0641/2  , -0.0177/2};//{-0.7057 ,  -0.0733 ,  -0.0300 ,  -0.0085};
 
 //********simulated states and multiplying matrices***********************
 float z1_prime[4] = {0.0, 0.0, 0.0, 0.0};
@@ -87,6 +105,7 @@
 float Km_R = 1.187*0.137;
 
 float yawRate = 0.0;
+float yawFeedback = 0.0;
 
 float velocityCmd[2] = {0.0, 0.0};
 unsigned int accelerateFlag = 0, decelerationFlag = 0;
@@ -108,19 +127,50 @@
 bool sent_flag = 1;
 uint8_t data_sent[18];
 
-int delay_num = 37;
-float fifo_array[37];
+int delay_num = 3;
+float fifo_array[3];
 float a_vehicle_fifo;
 int fifo_i = 0;
 
 
+int16_t recv_l = 0, recv_r = 0;
+
+float slipVelocity[2] = {0,0};
+
+
+
+int16_t rawData_array[6];
+float data_array[6];
+
+
+
+
 int main()
 {
 
     pc.baud(230400);
     blueTooth.baud(230400);
-    LeftSerial.baud(230400); //uart commu with photon left
-    RightSerial.baud(230400); //uart commu with photon right
+
+
+    radio.begin();//Start up the radio object
+    radio.setRetries(15,15);//This will improve reliability of the module if it encounters interference
+    radio.setPALevel(RF24_PA_LOW);//This sets the power low. This will reduce the range. RF24_PA_MAX would increase the range
+    radio.setPayloadSize(8);
+    radio.setChannel(76);
+    radio.openReadingPipe(1,left_pipe);
+    radio.startListening();//Give the module a kick
+  
+    
+    radio_r.begin();//Start up the radio object
+    radio_r.setRetries(15,15);//This will improve reliability of the module if it encounters interference
+    radio_r.setPALevel(RF24_PA_LOW);//This sets the power low. This will reduce the range. RF24_PA_MAX would increase the range
+    radio_r.setPayloadSize(8);
+    radio_r.setChannel(90);//choose a channel different from left channel=76
+    radio_r.openReadingPipe(1,right_pipe);
+    radio_r.startListening();//Give the module a kick
+
+
+
 
     if( sensor.begin() != 0 ) {
         pc.printf("Problem starting the sensor with CS @ Pin D6.\r\n");
@@ -135,62 +185,70 @@
 
     WIPVTimer.attach_us(WIPVTimerInterrupt, Ts*1000.0*1000.0);
     blueTooth.attach(&bluetoothRx, Serial::RxIrq);
-    LeftSerial.attach(&RXIrqLeft, Serial::RxIrq);
-    RightSerial.attach(&RXIrqRight, Serial::RxIrq);
+//    LeftSerial.attach(&RXIrqLeft, Serial::RxIrq);
+//    RightSerial.attach(&RXIrqRight, Serial::RxIrq);
 
     SCEnable.rise(&SCEnableFunc);
     SCEnalbeIndicator = 0;
 
     while(true) {
+        //pc.printf("%d, ", rawData_array[0]);
+//        pc.printf("%d, ", rawData_array[1]);
+////        pc.printf("%d, ", data_array[2]);
+////        pc.printf("%d, ", data_array[3]);
+//        pc.printf("%d, ", rawData_array[4]);
+//        pc.printf("%d;\r\n ", rawData_array[5]);
+
+        
         //pc.printf("%5.4f\t", 10*pitch_angle);
 //        pc.printf("%5.3f\n", 10*sensor.pitch*3.14159/180);
 //        pc.printf("%5.3f\r\n", 10*curCmd_L);
-
+        
 
-        //if(sent_flag == 0) {///
-//            pc.putc(data_sent[send_i]);
-//            send_i++;
-//            if(send_i >= 18) {
-//                send_i = 0;
-//                sent_flag = 1;
-//            }
-//        }///
-    pc.printf("%5.4f\t",a_vehicle);
-        pc.printf("%5.4f\t",a_vehicle_fifo);
-//        pc.printf("%5.4f\t", slipAcceleration_L);
-        pc.printf("%5.4f\r\n",slipAcceleration_L);
-//    pc.printf("%5.4f\t",yc[0]);
-//    pc.printf("%5.4f\r\n",yc[1]);
+        pc.printf("%5.4f\t", state[0]);// pitch angle
+        pc.printf("%5.4f\t", state[1]);//pitch angle rate
+        pc.printf("%5.4f\t", state[2]);//left wheel velocity
+        pc.printf("%5.4f\t", state[3]);//right wheel velocity
+        pc.printf("%5.4f\t",    a_slip_L);// left wheel slip acceleration
+        pc.printf("%5.4f\r\n",a_slip_R);// right wheel slip acceleration
+    }
 
-    }
 }
 
-
-void WIPVTimerInterrupt()
-{
-    if(tim_counter <100)tim_counter++;
-    else if (tim_counter >= 100 && tim_counter <=109) {
-        motorCur_L.currentOffset += motorCur_L.currentAnalogIn.read();
-        motorCur_R.currentOffset += motorCur_R.currentAnalogIn.read();
-        tim_counter++;
-        if(tim_counter == 110) {
-            motorCur_L.currentOffset = motorCur_L.currentOffset/10;
-            motorCur_R.currentOffset = motorCur_R.currentOffset/10;
-        }
+    void WIPVTimerInterrupt() {
+        if(tim_counter <100)tim_counter++;
+        else if (tim_counter >= 100 && tim_counter <=109) {
+            motorCur_L.currentOffset += motorCur_L.currentAnalogIn.read();
+            motorCur_R.currentOffset += motorCur_R.currentAnalogIn.read();
+            tim_counter++;
+            if(tim_counter == 110) {
+                motorCur_L.currentOffset = motorCur_L.currentOffset/10;
+                motorCur_R.currentOffset = motorCur_R.currentOffset/10;
+            }
 
-    } else {
-
-
-        //int16_t data_array[6];
+        } else {
+            
+            
+            if( radio.available()) { //Keep checking on each loop to see if any data has come in
+                radio.read(&recv_l, sizeof(int16_t));//Stuff the incoming packet into the motor_code variable
+            }
+//            wait_us(100);
+            if( radio_r.available()) { //Keep checking on each loop to see if any data has come in
+                radio_r.read(&recv_r, sizeof(int16_t));//Stuff the incoming packet into the motor_code variable               
+            }
+            
+            
+            //rawData_array[0] = 0;
+//            rawData_array[1] = 0;
 //
-//        data_array[0]  = sensor.readRawAccelX();
-//        data_array[1]  = sensor.readRawAccelY();
-////        data_array[2]  = sensor.readRawAccelZ();
-////        data_array[3]  = sensor.readRawGyroX();
-//        data_array[4]  = sensor.readRawGyroY();
-//        data_array[5]  = sensor.readRawGyroZ();
-//
-//        pc.printf("%d, ", data_array[0]);
+//        rawData_array[0]  = sensor.readRawAccelX();
+//        rawData_array[1]  = sensor.readRawAccelY();
+////        rawData_array[2]  = sensor.readRawAccelZ();
+////        rawData_array[3]  = sensor.readRawGyroX();
+//        rawData_array[4]  = sensor.readRawGyroY();
+//        rawData_array[5]  = sensor.readRawGyroZ();
+
+        //pc.printf("%d, ", data_array[0]);
 //        pc.printf("%d, ", data_array[1]);
 ////        pc.printf("%d, ", data_array[2]);
 ////        pc.printf("%d, ", data_array[3]);
@@ -199,305 +257,302 @@
 
 
 
-        float data_array[6];//Gs and deg/s
-        data_array[0]  = sensor.readFloatAccelX();
-        data_array[1]  = sensor.readFloatAccelY();
+           //float data_array[6];//Gs and deg/s
+            data_array[0]  = sensor.readFloatAccelX();
+            data_array[1]  = sensor.readFloatAccelY();
 //        data_array[2]  = sensor.readFloatAccelZ();
 //        data_array[3]  = sensor.readFloatGyroX();
-        data_array[4]  = sensor.readFloatGyroY();
-        data_array[5]  = sensor.readFloatGyroZ();
+            data_array[4]  = sensor.readFloatGyroY();
+            data_array[5]  = sensor.readFloatGyroZ();
 
-        sensor.complementaryFilter(data_array,Ts);
+            sensor.complementaryFilter(data_array,Ts);
 
 
-        //===============wheel speed calculation============//
-        wheel_L.Calculate();
-        wheel_R.Calculate();
+            //===============wheel speed calculation============//
+            wheel_L.Calculate();
+            wheel_R.Calculate();
 
 
-        /////////////Balancing Control/////////////////////////
-        //SI dimension
-        state[0] = sensor.pitch*3.14159/180.0;
-        state[1] = sensorFilter1.filter(data_array[5]*3.14159/180.0, 6.0);
-        state[2] = sensorFilter2.filter(wheel_L.getAngularSpeed(),80.0);
-        state[3] = -sensorFilter3.filter(wheel_R.getAngularSpeed(),80.0);
+            /////////////Balancing Control/////////////////////////
+            //SI dimension
+            state[0] = sensor.pitch*3.14159/180.0 +0.08;
+            state[1] = sensorFilter1.filter(data_array[5]*3.14159/180.0, 6.0);
+            state[2] = sensorFilter2.filter(wheel_L.getAngularSpeed(),80.0);
+            state[3] = -sensorFilter3.filter(wheel_R.getAngularSpeed(),80.0);
 
-        if(accelerateFlag == 1) {
-            if(velocityCmd[0]>=20 || velocityCmd[1]>=20) {
-                accelerateFlag = 0;
-                decelerationFlag = 1;
-            } else {
-                velocityCmd[0] += 0.010;
-                velocityCmd[1] += 0.010;
+            if(accelerateFlag == 1) {
+                if(velocityCmd[0]>=20 || velocityCmd[1]>=20) {
+                    accelerateFlag = 0;
+                    decelerationFlag = 1;
+                } else {
+                    velocityCmd[0] += 0.010;
+                    velocityCmd[1] += 0.010;
+                }
             }
-        }
 
-        if(decelerationFlag == 1 & velocityCmd[0] > 0.0) {
-            velocityCmd[0] -= 0.015;
-            velocityCmd[1] -= 0.015;
-            if(velocityCmd[0] <= 0.0)decelerationFlag = 0;
-        }
+            if(decelerationFlag == 1 & velocityCmd[0] > 0.0) {
+                velocityCmd[0] -= 0.015;
+                velocityCmd[1] -= 0.015;
+                if(velocityCmd[0] <= 0.0)decelerationFlag = 0;
+            }
 
-        ref[2] = velocityCmd[0];
-        ref[3] = velocityCmd[1];
+            ref[2] = velocityCmd[0];
+            ref[3] = velocityCmd[1];
 
-        yawRate = sensorFilter4.filter(data_array[4],9);
+            yawRate = sensorFilter4.filter(data_array[4],9);
 
 
-        //===============integration of z1_prime=========================
-        z1_prime[0] += z1_prime_dot[0]*Ts;
-        z1_prime[1] += z1_prime_dot[1]*Ts;
-        z1_prime[2] += z1_prime_dot[2]*Ts;
-        z1_prime[3] += z1_prime_dot[3]*Ts;
+            //===============integration of z1_prime=========================
+            z1_prime[0] += z1_prime_dot[0]*Ts;
+            z1_prime[1] += z1_prime_dot[1]*Ts;
+            z1_prime[2] += z1_prime_dot[2]*Ts;
+            z1_prime[3] += z1_prime_dot[3]*Ts;
 
 
-        yc[0] = (KL[0]*(ref[0] - (state[0] - z1_prime[0])) + KL[1]*(ref[1] - (state[1] - z1_prime[1]))\
-                 + KL[2]*(ref[2] - (state[2] - z1_prime[2])) + KL[3]*(ref[3] - (state[3] - z1_prime[3])));
+            yc[0] = (KL[0]*(ref[0] - (state[0] - z1_prime[0])) + KL[1]*(ref[1] - (state[1] - z1_prime[1]))\
+                     + KL[2]*(ref[2] - (state[2] - z1_prime[2])) + KL[3]*(ref[3] - (state[3] - z1_prime[3])));
 
-        yc[1] = (KR[0]*(ref[0] - (state[0] - z1_prime[0])) + KR[1]*(ref[1] - (state[1] - z1_prime[1]))\
-                 + KR[2]*(ref[2] - (state[2] - z1_prime[2])) + KR[3]*(ref[3] - (state[3] - z1_prime[3])));
+            yc[1] = (KR[0]*(ref[0] - (state[0] - z1_prime[0])) + KR[1]*(ref[1] - (state[1] - z1_prime[1]))\
+                     + KR[2]*(ref[2] - (state[2] - z1_prime[2])) + KR[3]*(ref[3] - (state[3] - z1_prime[3])));
 
 
-        //=========================Anti slip control=============================//
-        //***********filtering the slip acceleration of two wheels********************
-        a_vehicle = (data_array[0]*cos(state[0]) - data_array[1]*sin(state[0]))*9.791;//compute acceleration of vehicle using lsm9ds0
-        //fifo delay
-        a_vehicle_fifo = fifo_array[fifo_i];
+            //=========================Anti slip control=============================//
+            //***********filtering the slip acceleration of two wheels********************
+            a_vehicle = (data_array[0]*cos(state[0]) - data_array[1]*sin(state[0]))*9.791;//compute acceleration of vehicle using lsm9ds0
+            //fifo delay
+            a_vehicle_fifo = fifo_array[fifo_i];
 //        delay_num = sizeof(fifo_array);
-        fifo_array[fifo_i] = a_vehicle;
-        fifo_i++;
-        if(fifo_i >= delay_num)fifo_i = 0;
+            fifo_array[fifo_i] = a_vehicle;
+            fifo_i++;
+            if(fifo_i >= delay_num)fifo_i = 0;
 
 
 
 
-        //pc.printf("%5.2f\t", a_vehicle);
+            //pc.printf("%5.2f\t", a_vehicle);
 ////        pc.printf("%5.2f\t",slipAcceleration_L_f);
 //        pc.printf("%5.2f\r\n",slipAcceleration_R_f);
 
-        a_slip_L = slipAcceleration_L - a_vehicle_fifo;
-        a_slip_R = slipAcceleration_R - a_vehicle_fifo;
+            a_slip_L = ((float)recv_l)/1000.0 - a_vehicle_fifo;
+            a_slip_R = -((float)recv_r)/1000.0 - a_vehicle_fifo;
 
-        float alpha = 40.0;//HZ
-        slipAcceleration_L_f = (1 - alpha*2*3.141593*Ts)*slipAcceleration_L_f + alpha*2*3.141593*Ts*a_slip_L;
-        slipAcceleration_R_f = (1 - alpha*2*3.141593*Ts)*slipAcceleration_R_f + alpha*2*3.141593*Ts*a_slip_R;
+            float alpha = 200.0;//HZ
+            slipAcceleration_L_f = (1 - alpha*2*3.141593*Ts)*slipAcceleration_L_f + alpha*2*3.141593*Ts*a_slip_L;
+            slipAcceleration_R_f = (1 - alpha*2*3.141593*Ts)*slipAcceleration_R_f + alpha*2*3.141593*Ts*a_slip_R;
 
-        if(SCEnalbeIndicator == 0) {
-            slipAcceleration_L_f_d = 0;
-            slipAcceleration_R_f_d = 0;
+            if(SCEnalbeIndicator == 0) {
+                slipAcceleration_L_f_d = 0;
+                slipAcceleration_R_f_d = 0;
 
-        } else {
-            //***********dead zone************************//
-            float deadzone = 0.0;
-            if(slipAcceleration_L_f < deadzone & slipAcceleration_L_f > -deadzone)slipAcceleration_L_f_d = 0;
-            else slipAcceleration_L_f_d = slipAcceleration_L_f;
+            } else {
+                //***********dead zone************************//
+                float deadzone = 0.0;
+                if(slipAcceleration_L_f < deadzone & slipAcceleration_L_f > -deadzone)slipAcceleration_L_f_d = 0;
+                else slipAcceleration_L_f_d = slipAcceleration_L_f;
 
-            if(slipAcceleration_R_f < deadzone & slipAcceleration_R_f > -deadzone)slipAcceleration_R_f_d = 0;
-            else slipAcceleration_R_f_d = slipAcceleration_R_f;
+                if(slipAcceleration_R_f < deadzone & slipAcceleration_R_f > -deadzone)slipAcceleration_R_f_d = 0;
+                else slipAcceleration_R_f_d = slipAcceleration_R_f;
 
-        }
+            }
 
 
-        //***************simulated plant feedback**************
-        v1[0] = -(Ks0[0]*z1_prime[0] + Ks0[1]*z1_prime[1] + Ks0[2]*z1_prime[2] + Ks0[3]*z1_prime[3]);
-        v1[1] = -(Ks1[0]*z1_prime[0] + Ks1[1]*z1_prime[1] + Ks1[2]*z1_prime[2] + Ks1[3]*z1_prime[3]);
+            //***************simulated plant feedback**************
+            v1[0] = -(Ks0[0]*z1_prime[0] + Ks0[1]*z1_prime[1] + Ks0[2]*z1_prime[2] + Ks0[3]*z1_prime[3]);
+            v1[1] = -(Ks1[0]*z1_prime[0] + Ks1[1]*z1_prime[1] + Ks1[2]*z1_prime[2] + Ks1[3]*z1_prime[3]);
 
-        //**********simulated dynamics*****************
-        z1_prime_dot[0] =  A1_prime0[0]*z1_prime[0] + A1_prime0[1]*z1_prime[1]+A1_prime0[2]*z1_prime[2]+A1_prime0[3]*z1_prime[3]\
-                           + B11_prime0[0]*v1[0]+ B11_prime0[1]*v1[1]\
-                           + B31_0[0]*slipAcceleration_L_f_d+ B31_0[1]*slipAcceleration_R_f_d;
+            //**********simulated dynamics*****************
+            z1_prime_dot[0] =  A1_prime0[0]*z1_prime[0] + A1_prime0[1]*z1_prime[1]+A1_prime0[2]*z1_prime[2]+A1_prime0[3]*z1_prime[3]\
+                               + B11_prime0[0]*v1[0]+ B11_prime0[1]*v1[1]\
+                               + B31_0[0]*slipAcceleration_L_f_d+ B31_0[1]*slipAcceleration_R_f_d;
+
+            z1_prime_dot[1] =  A1_prime1[0]*z1_prime[0] + A1_prime1[1]*z1_prime[1]+A1_prime1[2]*z1_prime[2]+A1_prime1[3]*z1_prime[3]\
+                               + B11_prime1[0]*v1[0]+ B11_prime1[1]*v1[1]\
+                               + B31_1[0]*slipAcceleration_L_f_d+ B31_1[1]*slipAcceleration_R_f_d;
 
-        z1_prime_dot[1] =  A1_prime1[0]*z1_prime[0] + A1_prime1[1]*z1_prime[1]+A1_prime1[2]*z1_prime[2]+A1_prime1[3]*z1_prime[3]\
-                           + B11_prime1[0]*v1[0]+ B11_prime1[1]*v1[1]\
-                           + B31_1[0]*slipAcceleration_L_f_d+ B31_1[1]*slipAcceleration_R_f_d;
+            z1_prime_dot[2] =  A1_prime2[0]*z1_prime[0] + A1_prime2[1]*z1_prime[1]+A1_prime2[2]*z1_prime[2]+A1_prime2[3]*z1_prime[3]\
+                               + B11_prime2[0]*v1[0]+ B11_prime2[1]*v1[1]\
+                               + B31_2[0]*slipAcceleration_L_f_d+ B31_2[1]*slipAcceleration_R_f_d;
 
-        z1_prime_dot[2] =  A1_prime2[0]*z1_prime[0] + A1_prime2[1]*z1_prime[1]+A1_prime2[2]*z1_prime[2]+A1_prime2[3]*z1_prime[3]\
-                           + B11_prime2[0]*v1[0]+ B11_prime2[1]*v1[1]\
-                           + B31_2[0]*slipAcceleration_L_f_d+ B31_2[1]*slipAcceleration_R_f_d;
+            z1_prime_dot[3] =  A1_prime3[0]*z1_prime[0] + A1_prime3[1]*z1_prime[1]+A1_prime3[2]*z1_prime[2]+A1_prime3[3]*z1_prime[3]\
+                               + B11_prime3[0]*v1[0]+ B11_prime3[1]*v1[1]\
+                               + B31_3[0]*slipAcceleration_L_f_d+ B31_3[1]*slipAcceleration_R_f_d;
+
 
-        z1_prime_dot[3] =  A1_prime3[0]*z1_prime[0] + A1_prime3[1]*z1_prime[1]+A1_prime3[2]*z1_prime[2]+A1_prime3[3]*z1_prime[3]\
-                           + B11_prime3[0]*v1[0]+ B11_prime3[1]*v1[1]\
-                           + B31_3[0]*slipAcceleration_L_f_d+ B31_3[1]*slipAcceleration_R_f_d;
-
-        torque_L = -((yc[0] + v1[0])/Km_L) + 0.015*yawRate;
-        torque_R =  ((yc[1] + v1[1])/Km_R) + 0.015*yawRate;
+            yawFeedback += 0.004*yawRate*Ts;
+            
+            torque_L = -((yc[0] + v1[0])/Km_L) + 0.008*yawRate + yawFeedback;
+            torque_R =  ((yc[1] + v1[1])/Km_R) + 0.008*yawRate + yawFeedback;
 
-        //************motor torque control*****************
-//        motorCur_L.Control(saturation(torque_L,1.3,-1.3), state[2]);
-//        motorCur_R.Control(saturation(torque_R,1.3,-1.3), -state[3]);
+            //************motor torque control*****************
+        motorCur_L.Control(saturation(torque_L,1.3,-1.3), state[2]);
+        motorCur_R.Control(saturation(torque_R,1.3,-1.3), -state[3]);
+        
+            //**************sending data to PC******************
+            if(send_counter < 40)send_counter++;
 
-        //**************sending data to PC******************
-        if(send_counter < 40)send_counter++;
-
-        else if( sent_flag == 1 & send_counter >= 40) {
-            send_counter = 0;
-            int multiplier = 500;
-            data_sent[0] = 0xAA;
-            data_sent[1] = 0x55;
+            else if( sent_flag == 1 & send_counter >= 40) {
+                send_counter = 0;
+                int multiplier = 500;
+                data_sent[0] = 0xAA;
+                data_sent[1] = 0x55;
 
-            data_sent[2] = ((int16_t)((state[0])*multiplier)) >>8;
-            data_sent[3] = ((int16_t)((state[0])*multiplier)) & 0x00FF;
-            data_sent[4] = ((int16_t)(state[1]*multiplier)) >>8;
-            data_sent[5] = ((int16_t)(state[1]*multiplier)) & 0x00FF;
+                data_sent[2] = ((int16_t)((state[0])*multiplier)) >>8;
+                data_sent[3] = ((int16_t)((state[0])*multiplier)) & 0x00FF;
+                data_sent[4] = ((int16_t)(state[1]*multiplier)) >>8;
+                data_sent[5] = ((int16_t)(state[1]*multiplier)) & 0x00FF;
 
-            data_sent[6] = ((int16_t)((v1[0])*multiplier)) >>8;
-            data_sent[7] = ((int16_t)((v1[0])*multiplier)) & 0x00FF;
-            data_sent[8] = ((int16_t)((v1[1])*multiplier)) >>8;
-            data_sent[9] = ((int16_t)((v1[1])*multiplier)) & 0x00FF;
+                data_sent[6] = ((int16_t)((v1[0])*multiplier)) >>8;
+                data_sent[7] = ((int16_t)((v1[0])*multiplier)) & 0x00FF;
+                data_sent[8] = ((int16_t)((v1[1])*multiplier)) >>8;
+                data_sent[9] = ((int16_t)((v1[1])*multiplier)) & 0x00FF;
 
-            data_sent[10] = ((int16_t)((yc[0])*multiplier)) >>8;
-            data_sent[11] = ((int16_t)((yc[0])*multiplier)) & 0x00FF;
-            data_sent[12] = ((int16_t)((yc[1])*multiplier)) >>8;
-            data_sent[13] = ((int16_t)((yc[1])*multiplier)) & 0x00FF;
-            //data_sent[10] = ((int16_t)((-a_vehicle)*multiplier)) >>8;
+                data_sent[10] = ((int16_t)((yc[0])*multiplier)) >>8;
+                data_sent[11] = ((int16_t)((yc[0])*multiplier)) & 0x00FF;
+                data_sent[12] = ((int16_t)((yc[1])*multiplier)) >>8;
+                data_sent[13] = ((int16_t)((yc[1])*multiplier)) & 0x00FF;
+                //data_sent[10] = ((int16_t)((-a_vehicle)*multiplier)) >>8;
 //            data_sent[11] = ((int16_t)((-a_vehicle)*multiplier)) & 0x00FF;
 //            data_sent[12] = ((int16_t)((slipAcceleration_R_m)*multiplier)) >>8;
 //            data_sent[13] = ((int16_t)((slipAcceleration_R_m)*multiplier)) & 0x00FF;
-            data_sent[14] = ((int16_t)((slipAcceleration_L)*multiplier)) >>8;
-            data_sent[15] = ((int16_t)((slipAcceleration_L)*multiplier)) & 0x00FF;
-            data_sent[16] = ((int16_t)((slipAcceleration_R)*multiplier)) >>8;
-            data_sent[17] = ((int16_t)((slipAcceleration_R)*multiplier)) & 0x00FF;
+                data_sent[14] = ((int16_t)((slipAcceleration_L)*multiplier)) >>8;
+                data_sent[15] = ((int16_t)((slipAcceleration_L)*multiplier)) & 0x00FF;
+                data_sent[16] = ((int16_t)((slipAcceleration_R)*multiplier)) >>8;
+                data_sent[17] = ((int16_t)((slipAcceleration_R)*multiplier)) & 0x00FF;
 
 
-            sent_flag = 0;
+                sent_flag = 0;
 
-        }
+            }
 
 
 
 
 
-        /*  //PD Balancing Control
-                balancingPD.Compute(0.0, sensor.pitch*3.14159/180);
-                curCmd_R = sensorFilter.filter(saturation(0.5*( -balancingPD.output + 0.002*data_array[5]),1.0, -1.0),10);
-                //======================current control=========================//
-                tim += Ts;
-                if(tim >= 4*pi/omega)tim = 0.0;
-                //curCmd_R = amp*sin(omega*tim); //current command
-                //curCmd_L = 0.8;
+            /*  //PD Balancing Control
+                    balancingPD.Compute(0.0, sensor.pitch*3.14159/180);
+                    curCmd_R = sensorFilter.filter(saturation(0.5*( -balancingPD.output + 0.002*data_array[5]),1.0, -1.0),10);
+                    //======================current control=========================//
+                    tim += Ts;
+                    if(tim >= 4*pi/omega)tim = 0.0;
+                    //curCmd_R = amp*sin(omega*tim); //current command
+                    //curCmd_L = 0.8;
 
-                motorCur_R.SetPWMDuty(0.75);
+                    motorCur_R.SetPWMDuty(0.75);
 
-                motorCur_L.Control(-curCmd_R + 0.002*data_array[4], wheel_L.getAngularSpeed());
-                motorCur_R.Control(curCmd_R  + 0.002*data_array[4], wheel_R.getAngularSpeed());
-        */
+                    motorCur_L.Control(-curCmd_R + 0.002*data_array[4], wheel_L.getAngularSpeed());
+                    motorCur_R.Control(curCmd_R  + 0.002*data_array[4], wheel_R.getAngularSpeed());
+            */
+
+        }
+
 
     }
 
 
-}
-
-
-void  bluetoothRx()
-{
-    while(pc.readable()) {
-        char charRx = pc.getc();
-        switch(charRx) {
-            case 'w'://forward
-                velocityCmd[0] = 2.5;
-                velocityCmd[1] = 2.5;
-                accelerateFlag = 0;
-                break;
-            case 's'://backward
-                velocityCmd[0] = -3.0;
-                velocityCmd[1] = -3.0;
-                accelerateFlag = 0;
-                break;
-            case 'a'://turn left
-                velocityCmd[0] = -4.0;
-                velocityCmd[1] = 4.0;
-                accelerateFlag = 0;
-                break;
-            case 'd'://turn right
-                velocityCmd[0] = 4.0;
-                velocityCmd[1] = -4.0;
-                accelerateFlag = 0;
-                break;
-            case 'x'://stop
-                velocityCmd[0] = 0.0;
-                velocityCmd[1] = 0.0;
-                accelerateFlag = 0;
-                break;
+    void  bluetoothRx() {
+        while(blueTooth.readable()) {
+            char charRx = blueTooth.getc();
+//            debugLed_l = !debugLed_l;
+            switch(charRx) {
+                case 'w'://forward
+                    ref[0] = 0.30;
+                    break;
+                case 's'://backward
+                    ref[0] = -0.3;
+                    break;
+                //case 'a'://turn left
+//                    velocityCmd[0] = -4.0;
+//                    velocityCmd[1] = 4.0;
+//                    accelerateFlag = 0;
+//                    break;
+//                case 'd'://turn right
+//                    velocityCmd[0] = 4.0;
+//                    velocityCmd[1] = -4.0;
+//                    accelerateFlag = 0;
+//                    break;
+                case 'x'://stop
+                    //velocityCmd[0] = 0.0;
+//                    velocityCmd[1] = 0.0;
+//                    accelerateFlag = 0;
+                    ref[0] = 0.0;
+                    break;
 
-            case 'q'://accelerate
-//                debugLed_l = !debugLed_l;
-                accelerateFlag = 1;
-                break;
-        }
-    }
-}
-
-void RXIrqLeft()
-{
-
-
-    if(LeftSerial.readable()) {
-        debugLed_l = !debugLed_l;
-        uint8_t c = LeftSerial.getc();
-        cLast_l = c;
-
-        if( c == 0xAA) {
-            i_l = 0;
-            headerCaptured_l = 1;
-
-
-        } else if(headerCaptured_l)  {
-            fromPhoton_l[i_l] = c;
-            i_l++;
-            if(i_l == 2) {
-                headerCaptured_l = 0;
-                slipAcceleration_L = (float)((int16_t)(fromPhoton_l[0]*256+fromPhoton_l[1])*0.92)/1000.0;
-
-//                pc.printf("%5.4f\t",(float)slipAcceleration_L_f);
-//                pc.printf("%5.4f\r\n",(float)slipAcceleration_R_f);
+                //case 'q'://accelerate
+////                debugLed_l = !debugLed_l;
+//                    accelerateFlag = 1;
+//                    break;
             }
-
         }
     }
 
-
-}
-
+    //void RXIrqLeft() {
+//
+//
+//        if(LeftSerial.readable()) {
+//            debugLed_l = !debugLed_l;
+//            uint8_t c = LeftSerial.getc();
+//            cLast_l = c;
+//
+//            if( c == 0xAA) {
+//                i_l = 0;
+//                headerCaptured_l = 1;
+//
+//
+//            } else if(headerCaptured_l)  {
+//                fromPhoton_l[i_l] = c;
+//                i_l++;
+//                if(i_l == 2) {
+//                    headerCaptured_l = 0;
+//                    slipAcceleration_L = (float)((int16_t)(fromPhoton_l[0]*256+fromPhoton_l[1])*0.92)/1000.0;
+//
+////                pc.printf("%5.4f\t",(float)slipAcceleration_L_f);
+////                pc.printf("%5.4f\r\n",(float)slipAcceleration_R_f);
+//                }
+//
+//            }
+//        }
+//
+//
+//    }
+//
+//
+//
+//
+//    void RXIrqRight() {
+//
+//        //  slipAcceleration_L += 0.1;
+//        if(RightSerial.readable()) {
+//            debugLed_r = !debugLed_r;
+//            uint8_t c = RightSerial.getc();
+//            cLast_r = c;
+////        pc.printf("%5.4f\r\n",(float)cLast_r);
+//
+//            if( c == 0xAA) {
+//                headerCaptured_r = 1;
+//                i_r = 0;
+//
+//            } else if(headerCaptured_r) {
+//
+//                fromPhoton_r[i_r] = c;
+//                i_r++;
+//                if(i_r == 2) {
+//                    headerCaptured_r = 0;
+//                    slipAcceleration_R = -(float)((int16_t)(fromPhoton_r[0]*256+fromPhoton_r[1])*1.18)/1000.0;
+//
+//                }
+//            }
+//        }
+//    }
 
 
 
-void RXIrqRight()
-{
-
-    //  slipAcceleration_L += 0.1;
-    if(RightSerial.readable()) {
-        debugLed_r = !debugLed_r;
-        uint8_t c = RightSerial.getc();
-        cLast_r = c;
-//        pc.printf("%5.4f\r\n",(float)cLast_r);
-
-        if( c == 0xAA) {
-            headerCaptured_r = 1;
-            i_r = 0;
-
-        } else if(headerCaptured_r) {
-
-            fromPhoton_r[i_r] = c;
-            i_r++;
-            if(i_r == 2) {
-                headerCaptured_r = 0;
-                slipAcceleration_R = -(float)((int16_t)(fromPhoton_r[0]*256+fromPhoton_r[1])*1.18)/1000.0;
-
-            }
-        }
+    float saturation(float input, float limit_H, float limit_L) {
+        float output;
+        if(input >= limit_H)output = limit_H;
+        else if (input <= limit_L)output = limit_L;
+        else output = input;
+        return output;
     }
-}
-
-
-
-float saturation(float input, float limit_H, float limit_L)
-{
-    float output;
-    if(input >= limit_H)output = limit_H;
-    else if (input <= limit_L)output = limit_L;
-    else output = input;
-    return output;
-}
 
 
 //void SensorAcquisition(float * data, float samplingTime)
@@ -526,9 +581,9 @@
 //}
 
 
-void SCEnableFunc()
-{
+    void SCEnableFunc() {
 //    debugLed_l = !debugLed_l;
-    accelerateFlag = 1;
-    SCEnalbeIndicator = !SCEnalbeIndicator;
-}
+//        accelerateFlag = 1;
+//        ref[0] = 0.2;
+        SCEnalbeIndicator = !SCEnalbeIndicator;
+    }