Sooner Competitive Robotics / Mbed 2 deprecated IEEE_14_Freescale

Dependencies:   mbed

Fork of IEEE_14_Freescale by IEEE 2014 Mbed

Committer:
soonerbot
Date:
Fri Nov 22 18:00:18 2013 +0000
Revision:
7:3b2cf7efe5d1
Parent:
6:62d498ee97cf
Child:
8:c23cd84befa2
Commented most things

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soonerbot 1:c28fac16a109 1 #include "robot.h"
soonerbot 1:c28fac16a109 2
soonerbot 1:c28fac16a109 3 #define MIN(a,b) ((b<a)?(b):(a))
soonerbot 1:c28fac16a109 4 #define MAX(a,b) ((b>a)?(b):(a))
soonerbot 1:c28fac16a109 5
soonerbot 7:3b2cf7efe5d1 6 //this is the main place pinouts are put
soonerbot 7:3b2cf7efe5d1 7 //also sets up the control system constants
soonerbot 3:a223b0bf8256 8 robot::robot() : spi(PTD2, PTD3, PTD1), bigenc(spi,PTD0), gyro(PTE0, PTE1),
soonerbot 2:7c6b494f9005 9 right(bigenc,0,1,PTA5), left(bigenc,2,3,PTA4){
soonerbot 1:c28fac16a109 10
soonerbot 1:c28fac16a109 11 bigenc.setDirections(1,-1,1,1);
soonerbot 1:c28fac16a109 12 left.setReversed(1);
soonerbot 1:c28fac16a109 13 x=y=rot=0;
soonerbot 7:3b2cf7efe5d1 14
soonerbot 7:3b2cf7efe5d1 15 //control system constants
soonerbot 4:adc885f4ab75 16 pfac=0.00035;
soonerbot 4:adc885f4ab75 17 ifac=0.00000001;
soonerbot 4:adc885f4ab75 18 dfac=0.000001;
soonerbot 4:adc885f4ab75 19
soonerbot 5:74c8ce39334b 20 angfac=0.0000016;
soonerbot 1:c28fac16a109 21 }
soonerbot 1:c28fac16a109 22
soonerbot 7:3b2cf7efe5d1 23 //this is the main thing that both turns and goes forward
soonerbot 4:adc885f4ab75 24 int robot::driveForward(double desangle, int distance){
soonerbot 1:c28fac16a109 25 bigenc.resetAll();
soonerbot 1:c28fac16a109 26 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 27 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 28 int distTraveled=0, i;
soonerbot 6:62d498ee97cf 29 double maxPow=0.4;
soonerbot 4:adc885f4ab75 30 int loopcount=0;
soonerbot 4:adc885f4ab75 31 double minmain=0.05;
soonerbot 4:adc885f4ab75 32 double minalt=0.05;
soonerbot 4:adc885f4ab75 33
soonerbot 7:3b2cf7efe5d1 34 //find a point in front of where we're heading
soonerbot 4:adc885f4ab75 35 int targetang = desangle*4050000.0/360.0;//gyro.getZ();
soonerbot 4:adc885f4ab75 36 int startang = targetang;
soonerbot 4:adc885f4ab75 37 double angle=double(startang)*2*3.14159/4050000.0;
soonerbot 6:62d498ee97cf 38 double targx = x + double((distance==0)?10000:distance)*0.0035362*cos(angle)*1.5;
soonerbot 6:62d498ee97cf 39 double targy = y + double((distance==0)?10000:distance)*0.0035362*sin(angle)*1.5;
soonerbot 4:adc885f4ab75 40 int invfactor = 0;
soonerbot 7:3b2cf7efe5d1 41
soonerbot 7:3b2cf7efe5d1 42 //if going backwards, point away from the point
soonerbot 6:62d498ee97cf 43 if(distance<0) {
soonerbot 4:adc885f4ab75 44 invfactor = 2025000;
soonerbot 4:adc885f4ab75 45 }
soonerbot 6:62d498ee97cf 46 double realfac=0.1;
soonerbot 4:adc885f4ab75 47
soonerbot 4:adc885f4ab75 48 int pmain=distance;
soonerbot 4:adc885f4ab75 49 int imain=0;
soonerbot 4:adc885f4ab75 50 int dmain=0;
soonerbot 4:adc885f4ab75 51 int plast=distance;
soonerbot 4:adc885f4ab75 52
soonerbot 4:adc885f4ab75 53 int pterm=distance;
soonerbot 4:adc885f4ab75 54 int iterm=0;
soonerbot 4:adc885f4ab75 55 int dterm=0;
soonerbot 4:adc885f4ab75 56 const int ptol = 75;
soonerbot 4:adc885f4ab75 57 const int dtol = 10;
soonerbot 6:62d498ee97cf 58 while(/*(pterm+pmain <= -ptol || pterm >= ptol) || (dterm <= -dtol || dterm >= dtol) || */(pmain <= -ptol || pmain >= ptol) || (dmain <= -dtol || dmain >= dtol)|| (realfac <= -0.03 || realfac >= 0.03) /*|| (fmod(rot*180.0/3.14159-desangle+3600000.0,360.0) >= 1 && fmod(rot*180.0/3.14159-desangle+3600000.0,360.0) <= 359)*/){
soonerbot 4:adc885f4ab75 59 //maxPow=MAX(double(distance-distTraveled-2000)/15000.0,minspeed);
soonerbot 4:adc885f4ab75 60 //left.setPower(MIN(power,maxPow));
soonerbot 4:adc885f4ab75 61 //right.setPower(MIN(power,maxPow));
soonerbot 4:adc885f4ab75 62 //DBGPRINT("=%d of %d [%f] (%d, %d) \t{%f,\t%f,/t%f}",distTraveled,distance, maxPow, constbuf[0], constbuf[1],x,y,rot*180.0/3.14159);
soonerbot 1:c28fac16a109 63 for(i=0;i<4;i++)
soonerbot 1:c28fac16a109 64 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 65 //wait(0.05);
soonerbot 1:c28fac16a109 66 constbuf = bigenc.getVals();
soonerbot 4:adc885f4ab75 67
soonerbot 7:3b2cf7efe5d1 68 //control system (Proportional, Derivative, Integral)
soonerbot 5:74c8ce39334b 69 pmain = distance - (constbuf[0]+constbuf[1])/2;
soonerbot 5:74c8ce39334b 70 dmain = ((constbuf[0]+constbuf[1]) - (prev[0]+prev[1]))/2;
soonerbot 4:adc885f4ab75 71 imain += pmain;
soonerbot 4:adc885f4ab75 72
soonerbot 5:74c8ce39334b 73 //pterm = distance - constbuf[1];
soonerbot 5:74c8ce39334b 74 //dterm = constbuf[1] - prev[1];
soonerbot 5:74c8ce39334b 75 //iterm += pterm;
soonerbot 4:adc885f4ab75 76
soonerbot 4:adc885f4ab75 77 //pterm = constbuf[0] - constbuf[1];
soonerbot 4:adc885f4ab75 78 //dterm = pterm - (prev[0] - prev[1]);
soonerbot 4:adc885f4ab75 79 //iterm += pterm;
soonerbot 4:adc885f4ab75 80
soonerbot 6:62d498ee97cf 81 //DBGPRINT("%f like %f [%f] {%d,%d,%f,%f}\n\r", gyro.compZ(invfactor+atan2(targy-y,targx-x)*4050000.0/(2*3.14159))*360.0/4050000.0,angle*180/3.14159,rot,pmain,dmain,fmod(rot*180.0/3.14159-desangle+3600000.0,360.0), realfac);\
soonerbot 5:74c8ce39334b 82
soonerbot 7:3b2cf7efe5d1 83 //finds the difference between the angle to the imaginary point we're headed to and the current angle and turns it into a power level
soonerbot 5:74c8ce39334b 84 realfac = (gyro.compZ(invfactor+atan2(targy-y,targx-x)*4050000.0/(2*3.14159)))*angfac;
soonerbot 7:3b2cf7efe5d1 85 realfac = MAX(MIN(realfac,0.3),-0.3); // limits how much the motors can turn to fix the angle
soonerbot 4:adc885f4ab75 86
soonerbot 7:3b2cf7efe5d1 87 //uses PID control for the forward/back motions and adds in the angular component
soonerbot 7:3b2cf7efe5d1 88 //the forward/back motions is limited to a certain speed
soonerbot 5:74c8ce39334b 89 double leftpow = MAX(MIN(pfac*pmain+ifac*imain+dfac*dmain,maxPow),-maxPow)-realfac;
soonerbot 5:74c8ce39334b 90 double rightpow = MAX(MIN(pfac*pmain+ifac*imain+dfac*dmain,maxPow),-maxPow)+realfac;
soonerbot 7:3b2cf7efe5d1 91
soonerbot 7:3b2cf7efe5d1 92 //if we haven't settled, but also aren't moving, then speed up until it moves
soonerbot 7:3b2cf7efe5d1 93 if((pmain <= -ptol || pmain >= ptol) || (dmain <= -dtol || dmain >= dtol) || (realfac <= -0.02 || realfac >= 0.02) ){
soonerbot 4:adc885f4ab75 94 if (leftpow>0){
soonerbot 4:adc885f4ab75 95 if (leftpow<minalt){
soonerbot 4:adc885f4ab75 96 leftpow=minalt;
soonerbot 4:adc885f4ab75 97 }
soonerbot 4:adc885f4ab75 98 }else if (leftpow>-minalt){
soonerbot 4:adc885f4ab75 99 leftpow=-minalt;
soonerbot 4:adc885f4ab75 100 }
soonerbot 4:adc885f4ab75 101 if (rightpow>0){
soonerbot 4:adc885f4ab75 102 if (rightpow<minmain){
soonerbot 4:adc885f4ab75 103 rightpow=minmain;
soonerbot 4:adc885f4ab75 104 }
soonerbot 4:adc885f4ab75 105 }else if (rightpow>-minmain){
soonerbot 4:adc885f4ab75 106 rightpow=-minmain;
soonerbot 4:adc885f4ab75 107 }
soonerbot 4:adc885f4ab75 108 }
soonerbot 4:adc885f4ab75 109 left.setPower(leftpow);
soonerbot 4:adc885f4ab75 110 right.setPower(rightpow);
soonerbot 1:c28fac16a109 111 //int deltaTraveled=MAX(MIN(MIN(-constbuf[0]+prev[0],-constbuf[1]+prev[1]),MIN(constbuf[2]-prev[2],constbuf[3]-prev[3])),0);
soonerbot 7:3b2cf7efe5d1 112
soonerbot 7:3b2cf7efe5d1 113 //how far we've moved in the last timestep
soonerbot 4:adc885f4ab75 114 int deltaTraveled=(constbuf[0]-prev[0]+constbuf[1]-prev[1])/2;
soonerbot 4:adc885f4ab75 115 //DBGPRINT("\t %d\r\n",deltaTraveled);
soonerbot 7:3b2cf7efe5d1 116 addforward(double(deltaTraveled)*0.0035362); //update our position
soonerbot 1:c28fac16a109 117 distTraveled+=deltaTraveled;
soonerbot 4:adc885f4ab75 118 loopcount++;
soonerbot 7:3b2cf7efe5d1 119
soonerbot 7:3b2cf7efe5d1 120 //increase min speed so that it will actually move
soonerbot 4:adc885f4ab75 121 if((dmain<5&&dmain>-5)&&minmain<0.2){
soonerbot 5:74c8ce39334b 122 minmain+=0.003;
soonerbot 4:adc885f4ab75 123 } else if (minmain>=0.05) {
soonerbot 5:74c8ce39334b 124 minmain-=0.003;
soonerbot 4:adc885f4ab75 125 }
soonerbot 4:adc885f4ab75 126 if((dterm<5&&dterm>-5)&&minalt<0.2){
soonerbot 5:74c8ce39334b 127 minalt+=0.003;
soonerbot 4:adc885f4ab75 128 } else if (minalt>=0.05) {
soonerbot 5:74c8ce39334b 129 minalt-=0.003;
soonerbot 4:adc885f4ab75 130 }
soonerbot 1:c28fac16a109 131 }
soonerbot 1:c28fac16a109 132 left.brake();
soonerbot 1:c28fac16a109 133 right.brake();
soonerbot 6:62d498ee97cf 134 DBGPRINT("Loops: %d\r\n",loopcount);
soonerbot 7:3b2cf7efe5d1 135
soonerbot 7:3b2cf7efe5d1 136 //catch the slowdown movement
soonerbot 6:62d498ee97cf 137 wait(0.2);
soonerbot 5:74c8ce39334b 138 for(i=0;i<4;i++)
soonerbot 5:74c8ce39334b 139 prev[i]=constbuf[i];
soonerbot 5:74c8ce39334b 140 //wait(0.05);
soonerbot 5:74c8ce39334b 141 constbuf = bigenc.getVals();
soonerbot 6:62d498ee97cf 142 addforward(double(constbuf[0]-prev[0]+constbuf[1]-prev[1])*0.0035362/2.0);
soonerbot 5:74c8ce39334b 143 DBGPRINT("loss of %d and %d\n\r",constbuf[0]-prev[0],constbuf[1]-prev[1]);
soonerbot 1:c28fac16a109 144 return 0;
soonerbot 1:c28fac16a109 145 }
soonerbot 1:c28fac16a109 146
soonerbot 7:3b2cf7efe5d1 147 //add the motion in the direction that the robot is facing
soonerbot 4:adc885f4ab75 148 void robot::addforward(double dist){
soonerbot 4:adc885f4ab75 149 double angle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 150 x+=dist*cos(angle);
soonerbot 1:c28fac16a109 151 y+=dist*sin(angle);
soonerbot 1:c28fac16a109 152 rot=angle;
soonerbot 1:c28fac16a109 153 }
soonerbot 1:c28fac16a109 154
soonerbot 7:3b2cf7efe5d1 155 //doesn't work yet
soonerbot 1:c28fac16a109 156 int robot::moveTo(double xInches, double yInches){
soonerbot 1:c28fac16a109 157 double power=.2;
soonerbot 1:c28fac16a109 158 turntowards(xInches,yInches);
soonerbot 1:c28fac16a109 159 double distance=sqrt(pow(xInches-x,2)+pow(yInches-y,2))/0.0035362;
soonerbot 1:c28fac16a109 160 double angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 4:adc885f4ab75 161 double currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 162 bigenc.resetAll();
soonerbot 1:c28fac16a109 163 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 164 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 165 int distTraveled=0, i;
soonerbot 1:c28fac16a109 166 double maxPow;
soonerbot 1:c28fac16a109 167 DBGPRINT("going %f at angle %f from current of %f\r\n",distance,angle,currangle);
soonerbot 1:c28fac16a109 168 while(distTraveled<distance){
soonerbot 1:c28fac16a109 169 angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 4:adc885f4ab75 170 currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 171 maxPow=MAX(double(distance-distTraveled-2000)/15000.0,0.1);
soonerbot 1:c28fac16a109 172 if(currangle>angle+2.0){ //too far to the right, brake left
soonerbot 1:c28fac16a109 173 left.brake();
soonerbot 1:c28fac16a109 174 } else {
soonerbot 1:c28fac16a109 175 left.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 176 }
soonerbot 1:c28fac16a109 177 if(currangle<angle-2){
soonerbot 1:c28fac16a109 178 right.brake();
soonerbot 1:c28fac16a109 179 } else {
soonerbot 1:c28fac16a109 180 right.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 181 }
soonerbot 1:c28fac16a109 182 DBGPRINT("=%d of %d [%f] (%d, %d, %d, %d) \t{%f,\t%f,\t%f}\r\n",distTraveled,distance, maxPow, constbuf[0], constbuf[1], constbuf[2], constbuf[3],x,y,rot*180.0/3.14159);
soonerbot 1:c28fac16a109 183 for(i=0;i<4;i++)
soonerbot 1:c28fac16a109 184 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 185 //wait(0.05);
soonerbot 1:c28fac16a109 186 constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 187 int deltaTraveled=MAX((MIN(-constbuf[0]+prev[0],-constbuf[1]+prev[1])+MIN(constbuf[2]-prev[2],constbuf[3]-prev[3]))/2,0);
soonerbot 1:c28fac16a109 188 addforward(double(deltaTraveled)*0.0035362);
soonerbot 1:c28fac16a109 189 distTraveled+=deltaTraveled;
soonerbot 1:c28fac16a109 190 //angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 1:c28fac16a109 191 }
soonerbot 1:c28fac16a109 192 left.brake();
soonerbot 1:c28fac16a109 193 right.brake();
soonerbot 1:c28fac16a109 194 return 0;
soonerbot 1:c28fac16a109 195
soonerbot 1:c28fac16a109 196 }
soonerbot 1:c28fac16a109 197
soonerbot 7:3b2cf7efe5d1 198 //also doesn't work
soonerbot 1:c28fac16a109 199 int robot::turntowards(double xInches, double yInches){
soonerbot 4:adc885f4ab75 200 double currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 201 double angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 1:c28fac16a109 202 double finangle=angle;
soonerbot 1:c28fac16a109 203 /*if(int(currangle-angle)%360>180){ //needs to turn positive degrees
soonerbot 1:c28fac16a109 204 finangle=currangle+double(int(angle-currangle)%360);
soonerbot 1:c28fac16a109 205 } else {//negative degrees
soonerbot 1:c28fac16a109 206 finangle=currangle-double(int(currangle-angle)%360);
soonerbot 1:c28fac16a109 207 }*/
soonerbot 1:c28fac16a109 208 double acc=turn(0.4,finangle);
soonerbot 1:c28fac16a109 209 if(acc<-0.75 && acc>0.75){
soonerbot 1:c28fac16a109 210 acc=turn(0.3,finangle);
soonerbot 1:c28fac16a109 211 }
soonerbot 1:c28fac16a109 212
soonerbot 1:c28fac16a109 213
soonerbot 1:c28fac16a109 214 return 1;
soonerbot 1:c28fac16a109 215 }
soonerbot 1:c28fac16a109 216
soonerbot 7:3b2cf7efe5d1 217 //still no
soonerbot 1:c28fac16a109 218 double robot::turn(double power, double degrees){
soonerbot 1:c28fac16a109 219 bigenc.resetAll();
soonerbot 1:c28fac16a109 220 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 221 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 222 int startz;
soonerbot 4:adc885f4ab75 223 startz=gyro.getZ();
soonerbot 1:c28fac16a109 224 int gyroticks=(degrees*4050000)/360;
soonerbot 1:c28fac16a109 225 double maxPow;
soonerbot 1:c28fac16a109 226 int nowz=startz;
soonerbot 1:c28fac16a109 227 int dir=0;
soonerbot 1:c28fac16a109 228 if(gyroticks>startz){
soonerbot 1:c28fac16a109 229 right.setPower(-power);
soonerbot 1:c28fac16a109 230 left.setPower(power);
soonerbot 1:c28fac16a109 231 dir=1;
soonerbot 1:c28fac16a109 232 } else {
soonerbot 1:c28fac16a109 233 right.setPower(power);
soonerbot 1:c28fac16a109 234 left.setPower(-power);
soonerbot 1:c28fac16a109 235 dir=-1;
soonerbot 1:c28fac16a109 236 }
soonerbot 1:c28fac16a109 237 while((gyroticks-nowz)*dir>0){
soonerbot 1:c28fac16a109 238 maxPow=MAX(double(abs(gyroticks-nowz))/4050000.0,0.25);
soonerbot 1:c28fac16a109 239 if(gyroticks<nowz){
soonerbot 1:c28fac16a109 240 right.setPower(-MIN(power,maxPow));
soonerbot 1:c28fac16a109 241 left.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 242 } else {
soonerbot 1:c28fac16a109 243 right.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 244 left.setPower(-MIN(power,maxPow));
soonerbot 1:c28fac16a109 245 }
soonerbot 1:c28fac16a109 246 DBGPRINT("_%d of %d {%f, %f, %f}\r\n",(gyroticks-nowz)*dir, gyroticks,x,y,rot*180.0/3.14159);
soonerbot 1:c28fac16a109 247 for(int i=0;i<4;i++)
soonerbot 1:c28fac16a109 248 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 249 constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 250 int deltaTraveled;
soonerbot 1:c28fac16a109 251 if(gyroticks<nowz){
soonerbot 1:c28fac16a109 252 deltaTraveled=(MIN(-constbuf[0]+prev[0],-constbuf[1]+prev[1])-MIN(-constbuf[2]+prev[2],-constbuf[3]+prev[3]))/2;
soonerbot 1:c28fac16a109 253 } else {
soonerbot 1:c28fac16a109 254 deltaTraveled=(-MIN(constbuf[0]-prev[0],constbuf[1]-prev[1])+MIN(constbuf[2]-prev[2],constbuf[3]-prev[3]))/2;
soonerbot 1:c28fac16a109 255 }
soonerbot 1:c28fac16a109 256 addforward(double(deltaTraveled)*0.0035362);
soonerbot 4:adc885f4ab75 257 nowz=gyro.getZ();
soonerbot 1:c28fac16a109 258 }
soonerbot 1:c28fac16a109 259 right.brake();
soonerbot 1:c28fac16a109 260 left.brake();
soonerbot 1:c28fac16a109 261 return (gyroticks-nowz)*dir;
soonerbot 1:c28fac16a109 262 }