
Endelig kildekode med rettelser.
Fork of EndeligKildekode by
odometry.h
- Committer:
- kimnielsen
- Date:
- 2016-11-23
- Revision:
- 4:62a6681510d6
- Child:
- 5:cf033e9d4468
File content as of revision 4:62a6681510d6:
#ifndef ODOMETRY_H #define ODOMETRY_H #include "mbed.h" #include "hack_motor.h" #include "math.h" // ODOMETRY VALUES #define N 20 // ticks on wheel #define R 32.5 // radius = 32.5 mm #define L 133 // 133 mm distance between wheels #define PI 3.141592 int tickL = 0; // tick on left wheel int tickR = 0; // tick on right wheel // PID VALUES #define P_TERM 1.0 #define I_TERM 0.1 #define D_TERM 0 #define MAX 1.0 #define MIN 0 // GLOBAL DEFINITIONS double right,left; double speed=0.5; // ANALOG POWER AnalogIn ain(PC_4); DigitalOut dout(PB_13); DigitalOut greenout(PB_12); int stop=0; //DigitalOut DEFINITION OF RED LED!! // COORDINATES TO REACH const double xPosition [] = { [0] = 0, [1] = 1000, [2] = 2000, [3] = 3000, [4] = 4000, [5] = 5000, [6] = 4000, [7] = 3000, [8] = 2000, [9] = 1000, [10] = 2000, [11] = 3000, [12] = 4000, [13] = 5000, [14] = 1000 }; const double yPosition [] = { [0] = 0, [1] = 2000, [2] = 3000, [3] = 4000, [4] = 5000, [5] = 2000, [6] = 4000, [7] = 3000, [8] = 2000, [9] = 1000, [10] = 3000, [11] = 2000, [12] = 1000, [13] = 2000, [14] = 3000 }; const double THETA [] = { [0] = 0.785, [1] = 1.047, [2] = 0.698, [3] = 0.524, [4] = 1.047, [5] = 0.698, [6] = 0.785, [7] = 0.873, [8] = 0.349, [9] = 0.349, [10] = 0.611, [11] = 0.611, [12] = 0.436, [13] = 0.96 }; //INCLUDE ANGLE TO HEAD BACK TO ORIGIN POSITION!!!!! const double DISTANCES [] = { [0] = sqrt(pow((xPosition[1] - xPosition[0]), 2) + pow((yPosition[1] - yPosition[0]), 2)), [1] = sqrt(pow((xPosition[2] - xPosition[1]), 2) + pow((yPosition[2] - yPosition[1]), 2)), [2] = sqrt(pow((xPosition[3] - xPosition[2]), 2) + pow((yPosition[3] - yPosition[2]), 2)), [3] = sqrt(pow((xPosition[4] - xPosition[3]), 2) + pow((yPosition[4] - yPosition[3]), 2)), [4] = sqrt(pow((xPosition[5] - xPosition[4]), 2) + pow((yPosition[5] - yPosition[4]), 2)), [5] = sqrt(pow((xPosition[6] - xPosition[5]), 2) + pow((yPosition[6] - yPosition[5]), 2)), [6] = sqrt(pow((xPosition[7] - xPosition[6]), 2) + pow((yPosition[7] - yPosition[6]), 2)), [7] = sqrt(pow((xPosition[8] - xPosition[7]), 2) + pow((yPosition[8] - yPosition[7]), 2)), [8] = sqrt(pow((xPosition[9] - xPosition[8]), 2) + pow((yPosition[9] - yPosition[8]), 2)), [9] = sqrt(pow((xPosition[10] - xPosition[9]), 2) + pow((yPosition[10] - yPosition[9]), 2)), [10] = sqrt(pow((xPosition[11] - xPosition[10]), 2) + pow((yPosition[11] - yPosition[10]), 2)), [11] = sqrt(pow((xPosition[12] - xPosition[11]), 2) + pow((yPosition[12] - yPosition[11]), 2)), [12] = sqrt(pow((xPosition[13] - xPosition[12]), 2) + pow((yPosition[13] - yPosition[12]), 2)), [13] = sqrt(pow((xPosition[14] - xPosition[13]), 2) + pow((yPosition[14] - yPosition[13]), 2)) }; //REMEMBER TO INCLUDE DISTANCE FOR TRAVELLING BACK AGAIN /* ============================================================================= TIMER, TACHO'S AND ATTACHED PINS TO H-BRIDGE =============================================================================*/ Timer t; // DEFINE A TIMER T Serial pc(USBTX, USBRX); // not used here because we only have one serial // connection InterruptIn tacho_left(PC_3); // Set PC_2 to be interupt in for tacho left - Ledningsfarve: Hvid InterruptIn tacho_right(PC_2);// Set PC_3 to be interupt in for tacho right - Ledningsfarve: Grå Wheel robot(PB_2, PB_1, PB_15, PB_14); //PB_15: grøn PB_14: blå PB_2: orange PB_1: gul // create an object of robot H-bridge. ---(M1A, M1B, M2A, M2B)--- /* USED FUNCTIONS IN ROBOT.CPP*/ void read_analog() // comes here every second in this case // could be flagged with global variables like "stop" { if(ain > 0.6f) { // 60% power, time for recharge dout = 1; stop=0; } else { dout = not dout; stop=1; // flash red led } if (ain==1.0f) greenout = 1; // full power else greenout = 0; } // INIT YOUR PARAMETERS void init() { tickL=0; tickR=0; } // SENSOR INFO FROM TACO SENSORS void tickLeft() // UPDATE LEFT TICK ON INTERRUPT { tickL++; } void tickRight() // UPDATE RIGHT TICK ON INTERRUPT { tickR++; } float Dleft() // DISTANCE FOR LEFT WHEEL { return 2*PI*R*tickL/N; } float Dright() // DISTANCE FOR RIGHT WHEEL { return 2*PI*R*tickR/N; } float Dcenter() // DISTANCE FOR CENTER { return (Dleft()+Dright())/2; } float DeltaTHETA() //UPDATE ON ANGLE { return (Dright()-Dleft())/2*L; } // X POSITIONS float DeltaX_1() // 1. X POSITION { return Dcenter()*cos(THETA[0]+DeltaTHETA()/2); } // Y POSITIONS float DeltaY_1() //1. Y POSITION { return Dcenter()*sin(THETA[0]+DeltaTHETA()/2); } // DISTANCES TRAVELLED float Dtravel_1() // 1. DISTANCE { return sqrt(pow(DeltaX_1(), 2) + pow(DeltaY_1(), 2)); } // PID REGULATOR void get_to_goal ( ) // FUNCTION TO REACH GOAL WITH ERROR CONSIDERATION { double e = 0; // angle error double THETA_D1 = atan((yPosition[1]-yPosition[0])/(xPosition[1]-xPosition[0])); // THETA DESIRED CALCULATED double output = 0; double derivative = 0; double proportional = 0; double integral = 0; double e_old = 0; while (Dtravel_1() <= DISTANCES[0]) // INDSTIL TIL RIGTIGE PUNKTER!!! SKER I ET PARALLELT TIDSFORLØB MED KØRSEL AF ROBOT TIL PUNKTER { if(THETA_D1 < -PI) // EVALUATES IF THE ANGLE IS LESS THAN -3.14 { THETA_D1 = -PI; } else if(THETA_D1 > PI) // EVALUATES IF THE ANGLE IS MORE THAN 3.14 { THETA_D1 = PI; } e = THETA_D1 - THETA[0]; // ERROR VALUE // Compute the proportional proportional = e; // get the error // Compute the integral integral += proportional; // Compute the derivative derivative = e - e_old; // Remember the last error. e_old = e; // Compute the output output = (proportional * (P_TERM)) + (integral * (I_TERM)) + (derivative * (D_TERM)); // Compute new speeds of both wheels right = speed - output;//if power is 0, no error and same speed on wheels left = speed + output; // limit checks if (right < MIN) right = MIN; else if (right > MAX) right = MAX; if (left < MIN) left = MIN; else if (left > MAX) left = MAX; robot.FW(right,left); // set new positions printf("\n\r Dcenter = %3.2f tickL= %4d tickR = %4d left %3.2f right %3.2f", Dcenter(),tickL,tickR,left,right); printf("\n\r Error: %.2lf", e); // HUSK DETTE! wait_ms(20); // should be adjusted to your context. Give the motor time // to do something before you react } t.stop(); // stop timer } #endif