#include #include #include #include #include #include #include "driver.h" #include "GPSI.h" void main(void) { FILE *out FILE *input_file; int gps(); int gps_process(); int c, comp; int driver[8]; int servo[4]; int outdate[2]; int i; int old_gps, no_gps, comp_old; double X_miss, Y_miss, Z_miss, Xdot_miss, Ydot_miss, Zdot_miss, X_tar[5], Y_tar[5], Z_tar[5]; double alpha_dot, theta_dot, range_sq, k_el, k_throt, k_ail, el_comm, throt_comm; double ctrl_gain, ail_comm, h, hdot; outdate[0] = -1; outdate[1] = -1; x[2] = 0.0; y[2] = 0.0; z[2] = 0.0; dx_dt[1] = 0.0; dy_dt[1] = 0.0; dz_dt[1] = 0.0; /*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ /*//////////////////////////////////////////////////////////////////////*/ #include "INTERI.h" /*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/ el_comm = 0; throt_comm = 0; ail_comm = 0; ctrl_gain = 0; k_throt = 1; k_ail = 1; k_el = 1; no_gps = 0; old_gps = 0; servo[0] = el_comm; servo[1] = throt_comm; servo[2] = ail_comm; servo[3] = ctrl_gain; driver[0] = 1; driver[1] = 0; driver[2] = 0; driver[3] = 0; driver[4] = 0; driver[5] = 0; driver[6] = 0; driver[7] = 0; PutDriverChannel( 3 ); PutDriver( driver[3] ); // Set capacitor drain to off PutDriverChannel( 0 ); PutDriver( driver[0] ); // Set receiver to on PutDriverChannel( 1 ); PutDriver( driver[1] ); // Set servo controller to off i = 0; c = 0; // counter for target number comp = 0; // 1 for onboard control input_file = fopen( "target.dat", "r"); if (input_file == NULL) abort(); while(fscanf(input_file, "%f %f %f", X_tar[i], Y_tar[i], Z_tar[i]!= EOF)){ i++; } fclose(input_file); do{ comp_old = comp; if (gps()) { if ((gps_process() == 1) && (gps_zero == 1)) { driver[2] = (driver[2] == 0); // Toggle LED power PutDriverChannel( 2 ); PutDriver( driver[2] ); if (t[2] != t[1]) { X_miss = x[1] - x[0]; Y_miss = y[1] = y[0]; Z_miss = y[1] = y[0]; if(((Z_miss >= .8*Z_tar[c])&&(comp == 1)) || ((Z_miss >= Z_tar[c]) && (comp == 0))){ comp = 1; Xdot_miss = dx_dt[0]; Ydot_miss = dy_dt[0]; Zdot_miss = dz_dt[0]; range_sq = pow((X_miss - X_tar[c]),2)+pow((Y_miss - Y_tar[c]),2)+pow((Z_miss-Z_tar[c]),2); if (range_sq < 1000){ c = c+1; range_sq = pow((X_miss - X_tar[c]),2)+pow((Y_miss - Y_tar[c]),2); } alpha_dot = ((X_tar[c]-X_miss)*Ydot_miss - (Y_tar[c]-Y_miss)*Xdot_miss)/range_sq; h = sqrt(pow(Y_tar[c]-Y_miss,2)+pow(X_tar[c]-X_miss,2)); hdot = pow(pow(Ydot_miss,2)+pow(Xdot_miss,2),.5); theta_dot = (h*Zdot_miss-(Z_tar[c]-Z_miss)*hdot)/range_sq; el_comm = k_el*theta_dot; ail_comm = k_ail*alpha_dot; throt_comm = k_throt*theta_dot; } else{ comp = 0; } } outdate[0] = outdate[1]; outdate[1] = t[2]; if (outdate[0] == outdate[1]) { old_gps = old_gps + 1; } } else { no_gps = no_gps+1; } if(2*no_gps+old_gps >=2){ comp = 0; } if(comp != comp_old){ if ((driver[0] != driver[1]) && ((driver[0] == 0) || (driver[1] ==0))) { driver[0] = (driver[0] == 0); // Toggle Receiver power driver[1] = (driver[1] == 0); // Toggle controller power PutDriverChannel( 0 ); PutDriver( driver[0] ); PutDriverChannel( 1 ); PutDriver( driver[1] ); if (driver[0]) { for (i = 0; i<4; i++) { PutD2AChannel(i); PutD2A(0); // Turn off servo voltage output } PutDriverChannel( 3 ); PutDriver( 1 ); // Turn on capacitor drain } else { PutDriverChannel( 3 ); PutDriver( 0 ); // Turn off capacitor drain for (i = 0; i <4; i++) { PutD2AChannel(i); PutD2A(servo[i]); // Revert to old servo positions } } } else { driver[0] = 0; driver[1] = 1; PutDriverChannel( 0 ); PutDriver( driver[0] ); // Set receiver to off PutDriverChannel( 3 ); PutDriver( 0 ); // Turn capacitor drain off PutDriverChannel( 1 ); PutDriver( driver[1] ); // Set servo controller to on } } servo[0] = el_comm + 2048; servo[1] = ail_comm + 2048; servo[2] = throt_comm + 2048; for(i=0; i<=2; i++){ if(servo[i] <= 0){ servo[i] = 0; } if(servo[i] > 4096){ servo[i] = 4096; } PutD2AChannel(i); PutD2A (servo[i]); } } if (kbhit()) c = getch(); }while c!=27 }