hige dura / Mbed 2 deprecated dotHR_EKF_phithe

Dependencies:   mbed FatFileSystem

Committer:
higedura
Date:
Sun Jun 10 08:44:32 2012 +0000
Revision:
0:75227c386257
Child:
1:0c42db451cb9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
higedura 0:75227c386257 1 // dot-HR EKF
higedura 0:75227c386257 2
higedura 0:75227c386257 3 #include "mbed.h"
higedura 0:75227c386257 4 #include "SDFileSystem.h"
higedura 0:75227c386257 5 #include "ADXL345_I2C.h"
higedura 0:75227c386257 6 #include "ITG3200.h"
higedura 0:75227c386257 7 #include "HMC5883L.h"
higedura 0:75227c386257 8
higedura 0:75227c386257 9 Serial pc(USBTX, USBRX);
higedura 0:75227c386257 10 DigitalOut led1(LED1);
higedura 0:75227c386257 11 DigitalOut led2(LED2);
higedura 0:75227c386257 12 DigitalOut led3(LED3);
higedura 0:75227c386257 13 DigitalOut led4(LED4);
higedura 0:75227c386257 14 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
higedura 0:75227c386257 15 ADXL345_I2C accelerometer(p9, p10);
higedura 0:75227c386257 16 ITG3200 gyro(p9, p10);
higedura 0:75227c386257 17 HMC5883L compass(p9, p10);
higedura 0:75227c386257 18 Serial xbee(p13, p14);
higedura 0:75227c386257 19 DigitalIn stop(p20);
higedura 0:75227c386257 20 PwmOut ESC1(p21);
higedura 0:75227c386257 21 PwmOut ESC2(p22);
higedura 0:75227c386257 22 PwmOut ESC3(p23);
higedura 0:75227c386257 23 PwmOut ESC4(p24);
higedura 0:75227c386257 24 PwmOut ESC5(p25);
higedura 0:75227c386257 25 PwmOut ESC6(p26);
higedura 0:75227c386257 26 Serial navi(p28, p27); // tx, rx
higedura 0:75227c386257 27 DigitalOut navi_flag(p29);
higedura 0:75227c386257 28
higedura 0:75227c386257 29 #define pi 3.14159265
higedura 0:75227c386257 30
higedura 0:75227c386257 31 #define N 3 // gyro, acc
higedura 0:75227c386257 32 #define N_2 2 // phi, the
higedura 0:75227c386257 33 #define M 6 // The numbers of rotors
higedura 0:75227c386257 34 #define L 5 // The numbers of state quantities (optimal regulator)
higedura 0:75227c386257 35 #define chan 4 // The numbers of channels
higedura 0:75227c386257 36 #define chan_buf 17
higedura 0:75227c386257 37 #define N_LWMA 100
higedura 0:75227c386257 38
higedura 0:75227c386257 39 double* calib();
higedura 0:75227c386257 40 double* RK4( double, double[N_2], double[N_2] );
higedura 0:75227c386257 41 double* func( double[N_2], double[N_2] );
higedura 0:75227c386257 42 double* LWMA( double[N] );
higedura 0:75227c386257 43 double* EKF_predict( double[N_2], double[N_2] );
higedura 0:75227c386257 44 double* EKF_correct( double[N_2], double[N_2], double[N_2] );
higedura 0:75227c386257 45
higedura 0:75227c386257 46 // 0 1 2
higedura 0:75227c386257 47 // [ accXn-1 accXn-2 ... ] 0
higedura 0:75227c386257 48 // zBuf = [ accYn-1 accYn-2 ... ] 1
higedura 0:75227c386257 49 // [ accZn-1 accZn-2 ... ] 2
higedura 0:75227c386257 50 double z_buf[N][N_LWMA] = {0}; // For LWMA
higedura 0:75227c386257 51
higedura 0:75227c386257 52 double P[N_2][N_2] = {{1,0},{0,1}}; // For EKF
higedura 0:75227c386257 53
higedura 0:75227c386257 54 int main(){
higedura 0:75227c386257 55
higedura 0:75227c386257 56 pc.baud(921600);
higedura 0:75227c386257 57 navi.baud(57600);
higedura 0:75227c386257 58 xbee.baud(57600);
higedura 0:75227c386257 59
higedura 0:75227c386257 60 FILE *fp = fopen("/sd/sdtest.txt", "w");
higedura 0:75227c386257 61 if(fp == NULL) {
higedura 0:75227c386257 62 error("Could not open file for write\n");
higedura 0:75227c386257 63 while(1){ led2 = 1; wait(.5); led2 = 0; led3 = 0; wait(.5); led3 = 0; }
higedura 0:75227c386257 64 }
higedura 0:75227c386257 65
higedura 0:75227c386257 66 int correct_period = 100;
higedura 0:75227c386257 67 int navi_period = 10;
higedura 0:75227c386257 68 int xbee_period = 100;
higedura 0:75227c386257 69 int correct_loop = 0;
higedura 0:75227c386257 70 int navi_loop = 10;
higedura 0:75227c386257 71 int xbee_loop = 100;
higedura 0:75227c386257 72
higedura 0:75227c386257 73 double dt_wait = 0.002;
higedura 0:75227c386257 74 //double dt_wait = 0.01;
higedura 0:75227c386257 75 double dt = 0.01;
higedura 0:75227c386257 76 double t = 0;
higedura 0:75227c386257 77
higedura 0:75227c386257 78 int bit_acc[N] = {0}; // Buffer of the accelerometer
higedura 0:75227c386257 79 int get_mag[N] = {0}; // Buffer of the compass
higedura 0:75227c386257 80
higedura 0:75227c386257 81 // Calibration routine
higedura 0:75227c386257 82 double calib_acc[N] = {0};
higedura 0:75227c386257 83 double calib_gyro[N] = {0};
higedura 0:75227c386257 84 //double compass_basis_rad = 0;
higedura 0:75227c386257 85
higedura 0:75227c386257 86 // Getting data
higedura 0:75227c386257 87 double acc[N] = {0, 0, 1};
higedura 0:75227c386257 88 double acc_pre[N] = {0, 0, 1};
higedura 0:75227c386257 89 double d_acc[N] = {0};
higedura 0:75227c386257 90 double gyro_deg[N] = {0};
higedura 0:75227c386257 91 //double gyro_deg_pre[N] = {0};
higedura 0:75227c386257 92 double gyro_rad[N_2] = {0};
higedura 0:75227c386257 93
higedura 0:75227c386257 94 // Measurement algorithm
higedura 0:75227c386257 95 double angle_deg[N_2] = {0};
higedura 0:75227c386257 96 double angle_rad[N_2] = {0};
higedura 0:75227c386257 97 double angle_rad_pre[N_2] = {0};
higedura 0:75227c386257 98 double zLWMA[N] = {0};
higedura 0:75227c386257 99 double zLWMA_2[N_2] = {0};
higedura 0:75227c386257 100
higedura 0:75227c386257 101 // Gravity z
higedura 0:75227c386257 102 for( int i=0;i<N_LWMA;i++ ){ z_buf[2][i] = 1; }
higedura 0:75227c386257 103
higedura 0:75227c386257 104 double* p_calib;
higedura 0:75227c386257 105 double* p_RK4;
higedura 0:75227c386257 106 double* p_EKF;
higedura 0:75227c386257 107 double* p_zLWMA;
higedura 0:75227c386257 108
higedura 0:75227c386257 109 // Optimal regulator
higedura 0:75227c386257 110 double state[L];
higedura 0:75227c386257 111
higedura 0:75227c386257 112
higedura 0:75227c386257 113 // Gain (q1=100, q2=100, q3=50, q4=50, q5=1)
higedura 0:75227c386257 114
higedura 0:75227c386257 115 // Gain (q1=100, q2=100, q3=50, q4=50, q5=5)
higedura 0:75227c386257 116
higedura 0:75227c386257 117 // Gain (q1=100, q2=100, q3=50, q4=50, q5=10)
higedura 0:75227c386257 118
higedura 0:75227c386257 119 // Gain (q1=100, q2=100, q3=50, q4=50, q5=20)
higedura 0:75227c386257 120
higedura 0:75227c386257 121 // Gain (q1=100, q2=100, q3=50, q4=50, q5=30)
higedura 0:75227c386257 122 double Kr[M][L] = {{ 0, 5.774, 0, 4.168, 0.408},
higedura 0:75227c386257 123 {-5, 2.887,-3.610, 2.084,-0.408},
higedura 0:75227c386257 124 {-5,-2.887,-3.610,-2.084,-0.408},
higedura 0:75227c386257 125 { 0,-5.774, 0,-4.168, 0.408},
higedura 0:75227c386257 126 { 5,-2.887, 3.610,-2.084,-0.408},
higedura 0:75227c386257 127 { 5, 2.887, 3.610, 2.084, 0.408}};
higedura 0:75227c386257 128
higedura 0:75227c386257 129 // Coefficient for moving control
higedura 0:75227c386257 130 double Ccom_r = 0.2;
higedura 0:75227c386257 131 double Ccom_p = 0.2;
higedura 0:75227c386257 132 double Ccom_y = 0.1;
higedura 0:75227c386257 133
higedura 0:75227c386257 134 double motor[M] = {0};
higedura 0:75227c386257 135 double motor_control[M] = {0}; // Pulth width generated by the transmitter
higedura 0:75227c386257 136 double motor_attitude[M] = {0}; // Pulth width generated by the attitude control
higedura 0:75227c386257 137
higedura 0:75227c386257 138 // Coefficient of transfering Force to Puls
higedura 0:75227c386257 139 double Cfp = 2*pow(10.0, -7);
higedura 0:75227c386257 140
higedura 0:75227c386257 141 // Navigation
higedura 0:75227c386257 142 char command_buf1[chan_buf] = {0};
higedura 0:75227c386257 143 int command_buf2[chan_buf] = {0};
higedura 0:75227c386257 144 double command[chan] = {0};
higedura 0:75227c386257 145 int set_navi_flag = 0;
higedura 0:75227c386257 146
higedura 0:75227c386257 147 // *** Setting up sensors ***
higedura 0:75227c386257 148 //pc.printf("\r\n\r\nSetting up sensors\r\n");
higedura 0:75227c386257 149 xbee.printf("\r\n\r\nSetting up sensors\r\n");
higedura 0:75227c386257 150
higedura 0:75227c386257 151 // These are here to test whether any of the initialization fails. It will print the failure.
higedura 0:75227c386257 152 if (accelerometer.setPowerControl(0x00)){
higedura 0:75227c386257 153 //pc.printf("didn't intitialize power control\n\r");
higedura 0:75227c386257 154 xbee.printf("didn't intitialize power control\n\r");
higedura 0:75227c386257 155 return 0;
higedura 0:75227c386257 156 }
higedura 0:75227c386257 157 // Full resolution, +/-16g, 4mg/LSB.
higedura 0:75227c386257 158 wait(.1);
higedura 0:75227c386257 159
higedura 0:75227c386257 160 if(accelerometer.setDataFormatControl(0x0B)){
higedura 0:75227c386257 161 //pc.printf("didn't set data format\n\r");
higedura 0:75227c386257 162 xbee.printf("didn't set data format\n\r");
higedura 0:75227c386257 163 return 0;
higedura 0:75227c386257 164 }
higedura 0:75227c386257 165 wait(.1);
higedura 0:75227c386257 166
higedura 0:75227c386257 167 // 3.2kHz data rate.
higedura 0:75227c386257 168 if(accelerometer.setDataRate(ADXL345_3200HZ)){
higedura 0:75227c386257 169 //pc.printf("didn't set data rate\n\r");
higedura 0:75227c386257 170 xbee.printf("didn't set data rate\n\r");
higedura 0:75227c386257 171 return 0;
higedura 0:75227c386257 172 }
higedura 0:75227c386257 173 wait(.1);
higedura 0:75227c386257 174
higedura 0:75227c386257 175 if(accelerometer.setPowerControl(MeasurementMode)) {
higedura 0:75227c386257 176 //pc.printf("didn't set the power control to measurement\n\r");
higedura 0:75227c386257 177 xbee.printf("didn't set the power control to measurement\n\r");
higedura 0:75227c386257 178 return 0;
higedura 0:75227c386257 179 }
higedura 0:75227c386257 180 wait(.1);
higedura 0:75227c386257 181
higedura 0:75227c386257 182 gyro.setLpBandwidth(LPFBW_42HZ);
higedura 0:75227c386257 183 compass.setDefault();
higedura 0:75227c386257 184 wait(.1); // Wait some time for all sensors (Need at least 5ms)
higedura 0:75227c386257 185
higedura 0:75227c386257 186 // *** Setting up motors ***
higedura 0:75227c386257 187 //pc.printf("Setting up motors\r\n");
higedura 0:75227c386257 188 xbee.printf("Setting up motors\r\n");
higedura 0:75227c386257 189 ESC1.period(0.016044); ESC2.period(0.016044); ESC3.period(0.016044); ESC4.period(0.016044); ESC5.period(0.016044); ESC6.period(0.016044);
higedura 0:75227c386257 190 // pulsewidth 0.0011~0.00195
higedura 0:75227c386257 191 ESC1.pulsewidth(0.001); ESC2.pulsewidth(0.001); ESC3.pulsewidth(0.001); ESC4.pulsewidth(0.001); ESC5.pulsewidth(0.001); ESC6.pulsewidth(0.001);
higedura 0:75227c386257 192 // Wait some time for ESC (about 10s)
higedura 0:75227c386257 193 wait(5);
higedura 0:75227c386257 194
higedura 0:75227c386257 195 // *** Setting up navigator ***
higedura 0:75227c386257 196 //pc.printf("Setting up navigator\r\n");
higedura 0:75227c386257 197 xbee.printf("Setting up navigator\r\n");
higedura 0:75227c386257 198 while( set_navi_flag==0 ){
higedura 0:75227c386257 199 navi_flag = 1;
higedura 0:75227c386257 200 for( int i=0;i<chan_buf;i++ ){
higedura 0:75227c386257 201 navi.scanf("%c",&command_buf1[i]);
higedura 0:75227c386257 202 if(command_buf1[i]=='a'){
higedura 0:75227c386257 203 set_navi_flag=1;
higedura 0:75227c386257 204 break;
higedura 0:75227c386257 205 }
higedura 0:75227c386257 206 }
higedura 0:75227c386257 207 navi_flag = 0;
higedura 0:75227c386257 208 wait(.1);
higedura 0:75227c386257 209 }
higedura 0:75227c386257 210
higedura 0:75227c386257 211 // *** Calibration routine ***
higedura 0:75227c386257 212 p_calib = calib();
higedura 0:75227c386257 213 for( int i=0;i<3;i++ ){ calib_acc[i] = *p_calib; p_calib = p_calib+1; }
higedura 0:75227c386257 214 for( int i=3;i<6;i++ ){ calib_gyro[i-3] = *p_calib; p_calib = p_calib+1; }
higedura 0:75227c386257 215 //compass_basis_rad = *p_calib;
higedura 0:75227c386257 216
higedura 0:75227c386257 217 led1 = 1; led2 = 1; led3 = 1; led4 = 1;
higedura 0:75227c386257 218
higedura 0:75227c386257 219 //pc.printf("Starting IMU unit\n\r");
higedura 0:75227c386257 220 xbee.printf("Starting IMU unit\n\r");
higedura 0:75227c386257 221 //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");
higedura 0:75227c386257 222 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");
higedura 0:75227c386257 223
higedura 0:75227c386257 224 //while(1){
higedura 0:75227c386257 225 while( stop==0 ){
higedura 0:75227c386257 226
higedura 0:75227c386257 227 // Navigation
higedura 0:75227c386257 228 if( navi_loop>=navi_period ){
higedura 0:75227c386257 229
higedura 0:75227c386257 230 navi_flag = 1;
higedura 0:75227c386257 231
higedura 0:75227c386257 232 for( int i=0;i<chan_buf;i++ ){ navi.scanf("%c",&command_buf1[i]); }
higedura 0:75227c386257 233 for( int i=0;i<chan_buf;i++ ){
higedura 0:75227c386257 234 command_buf2[i] = (int)command_buf1[i]-48;
higedura 0:75227c386257 235 if( command_buf2[i]==-16 ){ command_buf2[i]=0; }
higedura 0:75227c386257 236 }
higedura 0:75227c386257 237 //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; }
higedura 0:75227c386257 238 command[0] = 0.0001*command_buf2[1]+0.00001*command_buf2[2]+0.000001*command_buf2[3]+0.001;
higedura 0:75227c386257 239 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; }
higedura 0:75227c386257 240
higedura 0:75227c386257 241 navi_flag = 0;
higedura 0:75227c386257 242 navi_loop = 0;
higedura 0:75227c386257 243
higedura 0:75227c386257 244 }
higedura 0:75227c386257 245 navi_loop++;
higedura 0:75227c386257 246 //command[0] = 0.0016; // Shiyougo comentout surukoto!!
higedura 0:75227c386257 247
higedura 0:75227c386257 248 // Updating accelerometer and compass
higedura 0:75227c386257 249 accelerometer.getOutput(bit_acc);
higedura 0:75227c386257 250 compass.readData(get_mag);
higedura 0:75227c386257 251
higedura 0:75227c386257 252 // Transfering units and Coordinate transform
higedura 0:75227c386257 253 acc[0] = (((int16_t)bit_acc[0]-calib_acc[0])-((int16_t)bit_acc[1]-calib_acc[1]))*0.004/sqrt(2.0);
higedura 0:75227c386257 254 acc[1] = (((int16_t)bit_acc[0]-calib_acc[0])+((int16_t)bit_acc[1]-calib_acc[1]))*0.004/sqrt(2.0);
higedura 0:75227c386257 255 acc[2] = ((int16_t)bit_acc[2]-calib_acc[2])*0.004+1;
higedura 0:75227c386257 256
higedura 0:75227c386257 257 gyro_deg[0] = ((gyro.getGyroX()-calib_gyro[0])-(gyro.getGyroY()-calib_gyro[1]))/14.375/sqrt(2.0);
higedura 0:75227c386257 258 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
higedura 0:75227c386257 259 gyro_deg[2] = -(gyro.getGyroZ()-calib_gyro[2])/14.375;
higedura 0:75227c386257 260
higedura 0:75227c386257 261 // Limitter for acc
higedura 0:75227c386257 262 if( acc[0]<-1 ){ acc[0] = -1; } if( 1<acc[0] ){ acc[0] = 1; }
higedura 0:75227c386257 263 if( acc[1]<-1 ){ acc[1] = -1; } if( 1<acc[1] ){ acc[1] = 1; }
higedura 0:75227c386257 264 if( acc[2]<-0 ){ acc[2] = -0; } if( 2<acc[2] ){ acc[2] = 2; }
higedura 0:75227c386257 265
higedura 0:75227c386257 266 for( int i=0;i<N;i++ ){ d_acc[i] = acc[i]-acc_pre[i]; }
higedura 0:75227c386257 267 if( abs(d_acc[0])>=0.5 && abs(acc[0])>=0.3 ){ acc[0] = acc_pre[0]; }
higedura 0:75227c386257 268 if( abs(d_acc[1])>=0.5 && abs(acc[1])>=0.3 ){ acc[1] = acc_pre[1]; }
higedura 0:75227c386257 269 if( abs(d_acc[2])>=0.5 ){ acc[2] = acc_pre[2]; }
higedura 0:75227c386257 270
higedura 0:75227c386257 271 for( int i=0;i<N_2;i++ ){ gyro_rad[i] = gyro_deg[i]*pi/180; }
higedura 0:75227c386257 272
higedura 0:75227c386257 273 // LWMA (Observation)
higedura 0:75227c386257 274 p_zLWMA = LWMA(acc);
higedura 0:75227c386257 275 for( int i=0;i<N;i++ ){ zLWMA[i] = *p_zLWMA; p_zLWMA = p_zLWMA+1; }
higedura 0:75227c386257 276
higedura 0:75227c386257 277 for( int i=0;i<N_2;i++ ){ zLWMA_2[i] = zLWMA[i]; }
higedura 0:75227c386257 278
higedura 0:75227c386257 279 // RK4 (Prediction)
higedura 0:75227c386257 280 p_RK4 = RK4(dt,angle_rad,gyro_rad);
higedura 0:75227c386257 281 for( int i=0;i<N_2;i++ ){ angle_rad[i] = *p_RK4; p_RK4 = p_RK4+1; }
higedura 0:75227c386257 282
higedura 0:75227c386257 283 // EKF (Correction)
higedura 0:75227c386257 284 EKF_predict(angle_rad,gyro_rad);
higedura 0:75227c386257 285 if ( correct_loop>=correct_period ){
higedura 0:75227c386257 286 p_EKF = EKF_correct(angle_rad,gyro_rad,zLWMA_2);
higedura 0:75227c386257 287 for ( int i=0;i<N_2;i++ ){ angle_rad[i] = *p_EKF; p_EKF = p_EKF+1; }
higedura 0:75227c386257 288 correct_loop = 0;
higedura 0:75227c386257 289 }
higedura 0:75227c386257 290 correct_loop++;
higedura 0:75227c386257 291
higedura 0:75227c386257 292 // Limitter for angle
higedura 0:75227c386257 293 for( int i=0;i<N_2;i++ ){ if( abs(angle_rad[i])>=1.05 ){ angle_rad[i] = angle_rad_pre[i]; } }
higedura 0:75227c386257 294
higedura 0:75227c386257 295 for( int i=0;i<N_2;i++ ){ angle_deg[i] = angle_rad[i]*180/pi; }
higedura 0:75227c386257 296
higedura 0:75227c386257 297 state[0] = angle_deg[0]; state[1] = angle_deg[1];
higedura 0:75227c386257 298 state[2] = gyro_deg[0]; state[3] = gyro_deg[1]; state[4] = gyro_deg[2];
higedura 0:75227c386257 299
higedura 0:75227c386257 300 for( int i=0;i<M;i++ ){
higedura 0:75227c386257 301 motor_attitude[i] = 0;
higedura 0:75227c386257 302 for( int j=0;j<L;j++ ){ motor_attitude[i] += -Kr[i][j]*state[j]; }
higedura 0:75227c386257 303 }
higedura 0:75227c386257 304
higedura 0:75227c386257 305 motor_control[0] = command[0]+0*Ccom_r*command[1]+2*Ccom_p*command[2]+1*Ccom_y*command[3];
higedura 0:75227c386257 306 motor_control[1] = command[0]-1*Ccom_r*command[1]-1*Ccom_p*command[2]-1*Ccom_y*command[3];
higedura 0:75227c386257 307 motor_control[2] = command[0]+1*Ccom_r*command[1]-1*Ccom_p*command[2]+1*Ccom_y*command[3];
higedura 0:75227c386257 308 motor_control[3] = command[0]+0*Ccom_r*command[1]+2*Ccom_p*command[2]-1*Ccom_y*command[3];
higedura 0:75227c386257 309 motor_control[4] = command[0]-1*Ccom_r*command[1]-1*Ccom_p*command[2]+1*Ccom_y*command[3];
higedura 0:75227c386257 310 motor_control[5] = command[0]+1*Ccom_r*command[1]-1*Ccom_p*command[2]-1*Ccom_y*command[3];
higedura 0:75227c386257 311
higedura 0:75227c386257 312 for( int i=0;i<M;i++ ){ motor[i] = motor_control[i]+motor_attitude[i]*Cfp; }
higedura 0:75227c386257 313 //for( int i=0;i<M;i++ ){ motor[i] = command[0]; }
higedura 0:75227c386257 314
higedura 0:75227c386257 315 // pulsewidth 0.0011~0.0019 (0.001~0.002?)
higedura 0:75227c386257 316 for( int i=0;i<M;i++ ){
higedura 0:75227c386257 317 if( motor[i]>0.00195 ){ motor[i]=0.00195; }
higedura 0:75227c386257 318 if( motor[i]<0.0012 ){ motor[i]=0.00105; }
higedura 0:75227c386257 319 if( command[0]<0.0011 ){ motor[i]=0.00105; }
higedura 0:75227c386257 320 }
higedura 0:75227c386257 321
higedura 0:75227c386257 322 ESC1.pulsewidth(motor[0]); ESC2.pulsewidth(motor[1]); ESC3.pulsewidth(motor[2]); ESC4.pulsewidth(motor[3]); ESC5.pulsewidth(motor[4]); ESC6.pulsewidth(motor[5]);
higedura 0:75227c386257 323
higedura 0:75227c386257 324 //for( int i=0;i<M;i++ ){ thrust[i] = 630000.0*motor[i]*motor[i]-700.0*motor[i]; }
higedura 0:75227c386257 325
higedura 0:75227c386257 326 //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]);
higedura 0:75227c386257 327 //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);
higedura 0:75227c386257 328 //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);
higedura 0:75227c386257 329 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);
higedura 0:75227c386257 330 if( xbee_loop>=xbee_period ){
higedura 0:75227c386257 331 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);
higedura 0:75227c386257 332 xbee_loop = 0;
higedura 0:75227c386257 333 }
higedura 0:75227c386257 334
higedura 0:75227c386257 335 for( int i=0;i<N;i++ ){ acc_pre[i] = acc[i]; }
higedura 0:75227c386257 336 //for( int i=0;i<N;i++ ){ gyro_deg_pre[i] = gyro_deg[i]; }
higedura 0:75227c386257 337 for( int i=0;i<N_2;i++ ){ angle_rad_pre[i] = angle_rad[i]; }
higedura 0:75227c386257 338
higedura 0:75227c386257 339 xbee_loop++;
higedura 0:75227c386257 340 wait(dt_wait);
higedura 0:75227c386257 341 t += dt;
higedura 0:75227c386257 342
higedura 0:75227c386257 343 }
higedura 0:75227c386257 344
higedura 0:75227c386257 345 // pulsewidth 0.0011~0.00195
higedura 0:75227c386257 346 ESC1.pulsewidth(0.001); ESC2.pulsewidth(0.001); ESC3.pulsewidth(0.001); ESC4.pulsewidth(0.001); ESC5.pulsewidth(0.001); ESC6.pulsewidth(0.001);
higedura 0:75227c386257 347 led1 = 0; led2 = 0; led3 = 0; led4 = 0;
higedura 0:75227c386257 348 fclose(fp);
higedura 0:75227c386257 349
higedura 0:75227c386257 350 }
higedura 0:75227c386257 351
higedura 0:75227c386257 352 double* EKF_predict( double y[N_2], double x[N_2] ){
higedura 0:75227c386257 353 // x = F * x;
higedura 0:75227c386257 354 // P = F * P * F' + G * Q * G';
higedura 0:75227c386257 355
higedura 0:75227c386257 356 //double Q[N][N] = { {0.1, 0, 0}, {0, 0.1, 0}, {0, 0, 0.1} };
higedura 0:75227c386257 357 double Q[N_2][N_2] = { {5198, 0}, {0, 5518} };
higedura 0:75227c386257 358
higedura 0:75227c386257 359 double Fjac[N_2][N_2] = { {x[1]*cos(y[0])*tan(y[1]), x[1]*sin(y[0])/(cos(y[1])*cos(y[1]))}, {-x[1]*sin(y[0]), 0} };
higedura 0:75227c386257 360 double Fjac_t[N_2][N_2] = { {x[1]*cos(y[0])*tan(y[1]), -x[1]*sin(y[0])}, {x[1]*sin(y[0])/(cos(y[1])*cos(y[1])), 0} };
higedura 0:75227c386257 361 double Gjac[N_2][N_2] = { {1, sin(y[0])*tan(y[1])}, {0, cos(y[0])} };
higedura 0:75227c386257 362 double Gjac_t[N_2][N_2] = { {1, 0}, {sin(y[0])*tan(y[1]), cos(y[0])} };
higedura 0:75227c386257 363
higedura 0:75227c386257 364 double FPF[N_2][N_2] = {0};
higedura 0:75227c386257 365 double GQG[N_2][N_2] = {0};
higedura 0:75227c386257 366
higedura 0:75227c386257 367 double FP[N_2][N_2] = {0};
higedura 0:75227c386257 368 double GQ[N_2][N_2] = {0};
higedura 0:75227c386257 369
higedura 0:75227c386257 370 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 371 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 372 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 373 FP[i][j] += Fjac[i][k]*P[k][j];
higedura 0:75227c386257 374 GQ[i][j] += Gjac[i][k]*Q[k][j];
higedura 0:75227c386257 375
higedura 0:75227c386257 376 }
higedura 0:75227c386257 377 }
higedura 0:75227c386257 378 }
higedura 0:75227c386257 379
higedura 0:75227c386257 380 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 381 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 382 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 383 FPF[i][j] += FP[i][k]*Fjac_t[k][j];
higedura 0:75227c386257 384 GQG[i][j] += GQ[i][k]*Gjac_t[k][j];
higedura 0:75227c386257 385 }
higedura 0:75227c386257 386 }
higedura 0:75227c386257 387 }
higedura 0:75227c386257 388 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 389 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 390 P[i][j] = FPF[i][j]+GQG[i][j];
higedura 0:75227c386257 391 }
higedura 0:75227c386257 392 }
higedura 0:75227c386257 393
higedura 0:75227c386257 394 return 0;
higedura 0:75227c386257 395
higedura 0:75227c386257 396 }
higedura 0:75227c386257 397
higedura 0:75227c386257 398 double* EKF_correct( double y[N_2], double x[N_2], double z[N_2] ){
higedura 0:75227c386257 399 // K = P * H' / ( H * P * H' + R )
higedura 0:75227c386257 400 // x = x + K * ( yobs(t) - H * x )
higedura 0:75227c386257 401 // P = P - K * H * P
higedura 0:75227c386257 402
higedura 0:75227c386257 403 //double R[N][N] = { {0.15, 0, 0}, {0, 0.15, 0}, {0, 0, 0.15} };
higedura 0:75227c386257 404 //double R[N][N] = { {0.00015, 0, 0}, {0, 0.00016, 0}, {0, 0, 0.00032} };
higedura 0:75227c386257 405 double R[N_2][N_2] = { {272528, 0}, {0, 295812} };
higedura 0:75227c386257 406
higedura 0:75227c386257 407 double Hjac[N_2][N_2] = { {0, cos(y[1])}, {cos(y[0]), 0} };
higedura 0:75227c386257 408 double Hjac_t[N_2][N_2] = { {0, cos(y[0])}, {cos(y[1]), 0} };
higedura 0:75227c386257 409 double K[N_2][N_2] = {0}; // Kalman gain
higedura 0:75227c386257 410 double K_deno[N_2][N_2] = {0}; // Denominator of the kalman gain
higedura 0:75227c386257 411 double det_K_deno_inv = 0;
higedura 0:75227c386257 412 double K_deno_inv[N_2][N_2] = {0};
higedura 0:75227c386257 413 double HPH[N_2][N_2] = {0};
higedura 0:75227c386257 414 double HP[N_2][N_2] = {0};
higedura 0:75227c386257 415 double PH[N_2][N_2] = {0};
higedura 0:75227c386257 416 double KHP[N_2][N_2] = {0};
higedura 0:75227c386257 417
higedura 0:75227c386257 418 double Hx[N_2] = {0};
higedura 0:75227c386257 419 double z_Hx[N_2] = {0};
higedura 0:75227c386257 420 double Kz_Hx[N_2] = {0};
higedura 0:75227c386257 421
higedura 0:75227c386257 422 double* py = y;
higedura 0:75227c386257 423
higedura 0:75227c386257 424 // Kalman gain
higedura 0:75227c386257 425 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 426 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 427 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 428 HP[i][j] += Hjac[i][k]*P[k][j];
higedura 0:75227c386257 429 PH[i][j] += P[i][k]*Hjac_t[k][j];
higedura 0:75227c386257 430 }
higedura 0:75227c386257 431 }
higedura 0:75227c386257 432 }
higedura 0:75227c386257 433 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 434 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 435 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 436 HPH[i][j] += HP[i][k]*Hjac_t[k][j];
higedura 0:75227c386257 437 }
higedura 0:75227c386257 438 }
higedura 0:75227c386257 439 }
higedura 0:75227c386257 440 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 441 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 442 K_deno[i][j] = HPH[i][j]+R[i][j];
higedura 0:75227c386257 443 }
higedura 0:75227c386257 444 }
higedura 0:75227c386257 445 // Inverce matrix
higedura 0:75227c386257 446 det_K_deno_inv = K_deno[0][0]*K_deno[1][1]-K_deno[1][0]*K_deno[0][1];
higedura 0:75227c386257 447 K_deno_inv[0][0] = K_deno[1][1]/det_K_deno_inv;
higedura 0:75227c386257 448 K_deno_inv[0][1] = -K_deno[0][1]/det_K_deno_inv;
higedura 0:75227c386257 449 K_deno_inv[1][0] = -K_deno[1][0]/det_K_deno_inv;
higedura 0:75227c386257 450 K_deno_inv[1][1] = K_deno[0][0]/det_K_deno_inv;
higedura 0:75227c386257 451
higedura 0:75227c386257 452 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 453 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 454 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 455 K[i][j] += PH[i][k]*K_deno_inv[k][j];
higedura 0:75227c386257 456 }
higedura 0:75227c386257 457 }
higedura 0:75227c386257 458 }
higedura 0:75227c386257 459
higedura 0:75227c386257 460 // Filtering
higedura 0:75227c386257 461 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 462 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 463 Hx[i] += Hjac[i][j]*y[j];
higedura 0:75227c386257 464 }
higedura 0:75227c386257 465 }
higedura 0:75227c386257 466 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 467 z_Hx[i] = z[i]-Hx[i];
higedura 0:75227c386257 468 }
higedura 0:75227c386257 469 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 470 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 471 Kz_Hx[i] += K[i][j]*z_Hx[j];
higedura 0:75227c386257 472 }
higedura 0:75227c386257 473 }
higedura 0:75227c386257 474 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 475 y[i] = y[i]+Kz_Hx[i];
higedura 0:75227c386257 476 }
higedura 0:75227c386257 477
higedura 0:75227c386257 478 // Covarience
higedura 0:75227c386257 479 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 480 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 481 for( int k=0;k<N_2;k++ ){
higedura 0:75227c386257 482 KHP[i][j] += K[i][k]*HP[k][j];
higedura 0:75227c386257 483 }
higedura 0:75227c386257 484 }
higedura 0:75227c386257 485 }
higedura 0:75227c386257 486 for( int i=0;i<N_2;i++ ){
higedura 0:75227c386257 487 for( int j=0;j<N_2;j++ ){
higedura 0:75227c386257 488 P[i][j] = P[i][j]-KHP[i][j];
higedura 0:75227c386257 489 }
higedura 0:75227c386257 490 }
higedura 0:75227c386257 491
higedura 0:75227c386257 492 return py;
higedura 0:75227c386257 493
higedura 0:75227c386257 494 }
higedura 0:75227c386257 495
higedura 0:75227c386257 496 double* LWMA( double z[N] ){
higedura 0:75227c386257 497
higedura 0:75227c386257 498 double zLWMA[N] = {0};
higedura 0:75227c386257 499 double zLWMA_num[N] = {0};
higedura 0:75227c386257 500 double zLWMA_den = 0;
higedura 0:75227c386257 501
higedura 0:75227c386257 502 double* pzLWMA = zLWMA;
higedura 0:75227c386257 503
higedura 0:75227c386257 504 for( int i=1;i<N_LWMA;i++ ){
higedura 0:75227c386257 505 for( int j=0;j<N;j++ ){
higedura 0:75227c386257 506 z_buf[j][N_LWMA-i] = z_buf[j][N_LWMA-i-1];
higedura 0:75227c386257 507 }
higedura 0:75227c386257 508 }
higedura 0:75227c386257 509 for( int i=0;i<N;i++ ){
higedura 0:75227c386257 510 z_buf[i][0] = z[i];
higedura 0:75227c386257 511 }
higedura 0:75227c386257 512
higedura 0:75227c386257 513 for( int i=0;i<N_LWMA;i++ ){
higedura 0:75227c386257 514 for( int j=0;j<N;j++ ){
higedura 0:75227c386257 515 zLWMA_num[j] += (N_LWMA-i)*z_buf[j][i];
higedura 0:75227c386257 516 }
higedura 0:75227c386257 517 zLWMA_den += N_LWMA-i;
higedura 0:75227c386257 518 }
higedura 0:75227c386257 519 for( int i=0;i<N;i++ ){
higedura 0:75227c386257 520 zLWMA[i] = zLWMA_num[i]/zLWMA_den;
higedura 0:75227c386257 521 }
higedura 0:75227c386257 522
higedura 0:75227c386257 523 return pzLWMA;
higedura 0:75227c386257 524
higedura 0:75227c386257 525 }
higedura 0:75227c386257 526
higedura 0:75227c386257 527 double* RK4( double dt, double y[N_2], double x[N_2] ){
higedura 0:75227c386257 528
higedura 0:75227c386257 529 double yBuf[N_2] = {0};
higedura 0:75227c386257 530 double k[N_2][4] = {0};
higedura 0:75227c386257 531
higedura 0:75227c386257 532 double* p_y = y;
higedura 0:75227c386257 533
higedura 0:75227c386257 534 double* pk1;
higedura 0:75227c386257 535 double* pk2;
higedura 0:75227c386257 536 double* pk3;
higedura 0:75227c386257 537 double* pk4;
higedura 0:75227c386257 538
higedura 0:75227c386257 539 for( int i=0;i<N_2;i++){ yBuf[i] = y[i]; }
higedura 0:75227c386257 540 pk1 = func (yBuf,x);
higedura 0:75227c386257 541 for( int i=0;i<N_2;i++ ){ k[i][0] = *pk1; pk1 = pk1+1; }
higedura 0:75227c386257 542
higedura 0:75227c386257 543 for( int i=0;i<N_2;i++){ yBuf[i] = y[i]+0.5*dt*k[i][1]; }
higedura 0:75227c386257 544 pk2 = func (yBuf,x);
higedura 0:75227c386257 545 for( int i=0;i<N_2;i++ ){ k[i][1] = *pk2; pk2 = pk2+1; }
higedura 0:75227c386257 546
higedura 0:75227c386257 547 for( int i=0;i<N_2;i++){ yBuf[i] = y[i]+0.5*dt*k[i][2]; }
higedura 0:75227c386257 548 pk3 = func (yBuf,x);
higedura 0:75227c386257 549 for( int i=0;i<N_2;i++ ){ k[i][2] = *pk3; pk3 = pk3+1; }
higedura 0:75227c386257 550
higedura 0:75227c386257 551 for( int i=0;i<N_2;i++){ yBuf[i] = y[i]+dt*k[i][3]; }
higedura 0:75227c386257 552 pk4 = func (yBuf,x);
higedura 0:75227c386257 553 for( int i=0;i<N_2;i++ ){ k[i][3] = *pk4; pk4 = pk4+1; }
higedura 0:75227c386257 554
higedura 0:75227c386257 555 for( int i=0;i<N_2;i++){ y[i] = y[i]+dt*(k[i][0]+2.0*k[i][1]+2.0*k[i][2]+k[i][3])/6.0; }
higedura 0:75227c386257 556
higedura 0:75227c386257 557 return p_y;
higedura 0:75227c386257 558
higedura 0:75227c386257 559 }
higedura 0:75227c386257 560
higedura 0:75227c386257 561 double* func( double y[N_2], double x[N_2] ){
higedura 0:75227c386257 562
higedura 0:75227c386257 563 double f[N_2] = {0};
higedura 0:75227c386257 564 double* p_f = f;
higedura 0:75227c386257 565 double a;
higedura 0:75227c386257 566 double b;
higedura 0:75227c386257 567
higedura 0:75227c386257 568 f[0] = x[0]+x[1]*sin(y[0])*tan(y[1]);
higedura 0:75227c386257 569 f[1] = x[1]*cos(y[0]);
higedura 0:75227c386257 570 a = sin(b);
higedura 0:75227c386257 571
higedura 0:75227c386257 572 return p_f;
higedura 0:75227c386257 573
higedura 0:75227c386257 574 }
higedura 0:75227c386257 575
higedura 0:75227c386257 576 double* calib(){
higedura 0:75227c386257 577
higedura 0:75227c386257 578 int calib_loop = 1000;
higedura 0:75227c386257 579
higedura 0:75227c386257 580 int bit_acc[N] = {0}; // Buffer of the accelerometer
higedura 0:75227c386257 581 int get_mag[N] = {0}; // Buffer of the compass
higedura 0:75227c386257 582
higedura 0:75227c386257 583 double calib_acc[N] = {0};
higedura 0:75227c386257 584 double calib_gyro_buf[N] = {0};
higedura 0:75227c386257 585 double calib_gyro[N] = {0};
higedura 0:75227c386257 586 double compass_basis_buf[N] = {0};
higedura 0:75227c386257 587 double compass_basis_rad = 0;
higedura 0:75227c386257 588 double calib_result[7] = {0};
higedura 0:75227c386257 589
higedura 0:75227c386257 590 double* p_calib_result = calib_result;
higedura 0:75227c386257 591
higedura 0:75227c386257 592 pc.printf("Don't touch... Calibrating now!!\n\r");
higedura 0:75227c386257 593 xbee.printf("Don't touch... Calibrating now!!\n\r");
higedura 0:75227c386257 594 led1 = 1;
higedura 0:75227c386257 595
higedura 0:75227c386257 596 for( int i=0;i<calib_loop;i++ ){
higedura 0:75227c386257 597
higedura 0:75227c386257 598 accelerometer.getOutput(bit_acc);
higedura 0:75227c386257 599 compass.readData(get_mag);
higedura 0:75227c386257 600
higedura 0:75227c386257 601 calib_gyro_buf[0] = gyro.getGyroX();
higedura 0:75227c386257 602 calib_gyro_buf[1] = gyro.getGyroY();
higedura 0:75227c386257 603 calib_gyro_buf[2] = gyro.getGyroZ();
higedura 0:75227c386257 604
higedura 0:75227c386257 605 for( int j=0;j<N;j++ ){
higedura 0:75227c386257 606 calib_acc[j] += (int16_t)bit_acc[j];
higedura 0:75227c386257 607 calib_gyro[j] += calib_gyro_buf[j];
higedura 0:75227c386257 608 compass_basis_buf[j] += (int16_t)get_mag[j];
higedura 0:75227c386257 609 }
higedura 0:75227c386257 610
higedura 0:75227c386257 611 if( i>calib_loop*3/4 ){
higedura 0:75227c386257 612 led4 = 1;
higedura 0:75227c386257 613 }else if( i>calib_loop/2 ){
higedura 0:75227c386257 614 led3 = 1;
higedura 0:75227c386257 615 }else if( i>calib_loop/4 ){
higedura 0:75227c386257 616 led2 = 1;
higedura 0:75227c386257 617 }
higedura 0:75227c386257 618
higedura 0:75227c386257 619 }
higedura 0:75227c386257 620
higedura 0:75227c386257 621 for( int i=0;i<N;i++ ){
higedura 0:75227c386257 622 calib_acc[i] = calib_acc[i]/calib_loop;
higedura 0:75227c386257 623 calib_gyro[i] = calib_gyro[i]/calib_loop;
higedura 0:75227c386257 624 compass_basis_buf[i] = compass_basis_buf[i]/calib_loop;
higedura 0:75227c386257 625 }
higedura 0:75227c386257 626
higedura 0:75227c386257 627 compass_basis_rad = compass_basis_buf[1]/compass_basis_buf[0];
higedura 0:75227c386257 628 compass_basis_rad = atan(compass_basis_rad);
higedura 0:75227c386257 629 led1 = 0; led2 = 0; led3 = 0; led4 = 0;
higedura 0:75227c386257 630
higedura 0:75227c386257 631 pc.printf(" accX accY accZ gyroX gyroY gyroZ yaw_basis\n\r");
higedura 0:75227c386257 632 xbee.printf(" accX accY accZ gyroX gyroY gyroZ yaw_basis\n\r");
higedura 0:75227c386257 633 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);
higedura 0:75227c386257 634 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);
higedura 0:75227c386257 635
higedura 0:75227c386257 636 for( int i=0;i<3;i++ ){ calib_result[i] = calib_acc[i]; }
higedura 0:75227c386257 637 for( int i=3;i<6;i++ ){ calib_result[i] = calib_gyro[i-3]; }
higedura 0:75227c386257 638 calib_result[6] = compass_basis_rad;
higedura 0:75227c386257 639
higedura 0:75227c386257 640 if( calib_result[0]==0 && calib_result[1]==0 && calib_result[2]==0 ){
higedura 0:75227c386257 641 pc.printf("Accelerometer is not available.\r\n");
higedura 0:75227c386257 642 xbee.printf("Accelerometer is not available.\r\n");
higedura 0:75227c386257 643 }
higedura 0:75227c386257 644
higedura 0:75227c386257 645 for( int i=0;i<3;i++ ){
higedura 0:75227c386257 646 wait(.5);
higedura 0:75227c386257 647 led1 = 1; led2 = 1; led3 = 1; led4 = 1;
higedura 0:75227c386257 648 wait(.5);
higedura 0:75227c386257 649 led1 = 0; led2 = 0; led3 = 0; led4 = 0;
higedura 0:75227c386257 650 }
higedura 0:75227c386257 651
higedura 0:75227c386257 652 return p_calib_result;
higedura 0:75227c386257 653
higedura 0:75227c386257 654 }