Sooner Competitive Robotics / Mbed 2 deprecated IEEE_14_Freescale

Dependencies:   mbed

Fork of IEEE_14_Freescale by IEEE 2014 Mbed

Committer:
soonerbot
Date:
Wed Feb 12 06:41:29 2014 +0000
Revision:
12:925f52da3ba9
Parent:
11:967469d7e01c
Child:
13:c2d14bf733a5
Added gyro heading tracking during absController movements.

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 9:aff48e331147 9 right(bigenc,0,1,PTA5), left(bigenc,2,3,PTA4), motors(spi,PTD0) {
soonerbot 1:c28fac16a109 10
soonerbot 11:967469d7e01c 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 11:967469d7e01c 15 //set our set point in memory to match the current set point of the encoders
soonerbot 11:967469d7e01c 16 const int *referenceCounts = bigenc.getReferences();
soonerbot 11:967469d7e01c 17 motors.setSetPoint(referenceCounts[0],referenceCounts[1]);
soonerbot 11:967469d7e01c 18
soonerbot 7:3b2cf7efe5d1 19 //control system constants
soonerbot 4:adc885f4ab75 20 pfac=0.00035;
soonerbot 4:adc885f4ab75 21 ifac=0.00000001;
soonerbot 4:adc885f4ab75 22 dfac=0.000001;
soonerbot 4:adc885f4ab75 23
soonerbot 5:74c8ce39334b 24 angfac=0.0000016;
soonerbot 1:c28fac16a109 25 }
soonerbot 1:c28fac16a109 26
soonerbot 10:926f142f16a3 27 //driveforward, but set up so that
soonerbot 10:926f142f16a3 28 int robot::absDriveForward(double desangle, int distance){
soonerbot 10:926f142f16a3 29 Timer tim;
soonerbot 11:967469d7e01c 30 int dir=1;
soonerbot 12:925f52da3ba9 31 // if we are traveling forward a negative distance, go backwards
soonerbot 11:967469d7e01c 32 if(distance < 0){
soonerbot 12:925f52da3ba9 33 dir = -1; //is multiplied by the final output
soonerbot 11:967469d7e01c 34 distance = -distance;
soonerbot 11:967469d7e01c 35 }
soonerbot 10:926f142f16a3 36 int i,move;
soonerbot 10:926f142f16a3 37 int maxSpeed=41;
soonerbot 10:926f142f16a3 38 int stepsPerInc=3;
soonerbot 10:926f142f16a3 39 int stepsToMax=(maxSpeed-1)*stepsPerInc;
soonerbot 10:926f142f16a3 40 int distToMax=(maxSpeed*(maxSpeed-1)*stepsPerInc)/2;
soonerbot 10:926f142f16a3 41 int stopRaise,startFall;
soonerbot 10:926f142f16a3 42 if(distance<distToMax*2){
soonerbot 12:925f52da3ba9 43 // can't get up to full speed before needing to slow down
soonerbot 12:925f52da3ba9 44 //find new max speed, time to get there, and distance there
soonerbot 10:926f142f16a3 45 maxSpeed = ((2*stepsPerInc)+sqrt((double)(2*stepsPerInc)*((2*stepsPerInc)+8*distance)))/(4*stepsPerInc);
soonerbot 10:926f142f16a3 46 stepsToMax=(maxSpeed-1)*stepsPerInc;
soonerbot 10:926f142f16a3 47 distToMax=(maxSpeed*(maxSpeed-1)*stepsPerInc)/2;
soonerbot 10:926f142f16a3 48 stopRaise = stepsToMax;
soonerbot 10:926f142f16a3 49 startFall = stopRaise+(distance-distToMax*2)/(maxSpeed)+1;
soonerbot 10:926f142f16a3 50 DBGPRINT("Insufficent Ramp-Up\r\n",1);
soonerbot 10:926f142f16a3 51 } else {
soonerbot 12:925f52da3ba9 52 // can get up to full speed, so we will
soonerbot 10:926f142f16a3 53 stopRaise=stepsToMax;
soonerbot 12:925f52da3ba9 54 startFall=stopRaise+(distance-distToMax*2)/maxSpeed+1;
soonerbot 10:926f142f16a3 55 DBGPRINT("Sufficent Ramp-Up\r\n",1);
soonerbot 10:926f142f16a3 56 }
soonerbot 10:926f142f16a3 57 DBGPRINT("[%d %d %d] {%d, %d}\n\r",maxSpeed,stepsToMax,distToMax,stopRaise,startFall);
soonerbot 10:926f142f16a3 58 tim.start();
soonerbot 10:926f142f16a3 59 move = 0;
soonerbot 10:926f142f16a3 60 int totalMove=0;
soonerbot 12:925f52da3ba9 61 gyro.stop();
soonerbot 10:926f142f16a3 62 for(i=0;i<startFall+stepsToMax;i++){
soonerbot 12:925f52da3ba9 63 //start clock for this frame
soonerbot 10:926f142f16a3 64 tim.reset();
soonerbot 10:926f142f16a3 65 if(i<=stopRaise && i%stepsPerInc==0){
soonerbot 12:925f52da3ba9 66 //increase speed every (stepsPerInc) steps up to maxSpeed
soonerbot 10:926f142f16a3 67 move++;
soonerbot 10:926f142f16a3 68 }
soonerbot 10:926f142f16a3 69 if(i==startFall-1){
soonerbot 12:925f52da3ba9 70 //calibration step before we start falling to get an exact result
soonerbot 10:926f142f16a3 71 move = distance-totalMove-distToMax;
soonerbot 10:926f142f16a3 72 }
soonerbot 10:926f142f16a3 73 if(i>=startFall && (i-startFall)%stepsPerInc==0){
soonerbot 12:925f52da3ba9 74 if(i==startFall) //reset move after calibration step
soonerbot 10:926f142f16a3 75 move=maxSpeed;
soonerbot 12:925f52da3ba9 76
soonerbot 12:925f52da3ba9 77 //decrement every stepsPerInc steps until stopped
soonerbot 10:926f142f16a3 78 move--;
soonerbot 10:926f142f16a3 79 }
soonerbot 10:926f142f16a3 80 totalMove+=move;
soonerbot 11:967469d7e01c 81 motors.moveForward(move*dir);
soonerbot 11:967469d7e01c 82 //DBGPRINT("%d: %d\t%d\r\n",i,move,totalMove);
soonerbot 12:925f52da3ba9 83 while(tim.read_ms()<5);
soonerbot 12:925f52da3ba9 84 gyro.gyroUpkeep();
soonerbot 12:925f52da3ba9 85 addforward(double(move*dir)*0.0035362);
soonerbot 12:925f52da3ba9 86 //waits until 10ms have passed for the 100hz timing
soonerbot 10:926f142f16a3 87 while(tim.read_ms()<10);
soonerbot 10:926f142f16a3 88 }
soonerbot 12:925f52da3ba9 89 gyro.start();
soonerbot 12:925f52da3ba9 90 return totalMove*dir;
soonerbot 10:926f142f16a3 91 }
soonerbot 10:926f142f16a3 92
soonerbot 7:3b2cf7efe5d1 93 //this is the main thing that both turns and goes forward
soonerbot 8:c23cd84befa2 94 // desangle is a angle in degrees to head towards (this is relative to the direction the robot starts pointing in
soonerbot 8:c23cd84befa2 95 // distance is a distance to head in that direction in units of encoder ticks
soonerbot 4:adc885f4ab75 96 int robot::driveForward(double desangle, int distance){
soonerbot 1:c28fac16a109 97 bigenc.resetAll();
soonerbot 1:c28fac16a109 98 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 99 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 100 int distTraveled=0, i;
soonerbot 6:62d498ee97cf 101 double maxPow=0.4;
soonerbot 4:adc885f4ab75 102 int loopcount=0;
soonerbot 4:adc885f4ab75 103 double minmain=0.05;
soonerbot 4:adc885f4ab75 104 double minalt=0.05;
soonerbot 4:adc885f4ab75 105
soonerbot 7:3b2cf7efe5d1 106 //find a point in front of where we're heading
soonerbot 4:adc885f4ab75 107 int targetang = desangle*4050000.0/360.0;//gyro.getZ();
soonerbot 4:adc885f4ab75 108 int startang = targetang;
soonerbot 4:adc885f4ab75 109 double angle=double(startang)*2*3.14159/4050000.0;
soonerbot 6:62d498ee97cf 110 double targx = x + double((distance==0)?10000:distance)*0.0035362*cos(angle)*1.5;
soonerbot 6:62d498ee97cf 111 double targy = y + double((distance==0)?10000:distance)*0.0035362*sin(angle)*1.5;
soonerbot 4:adc885f4ab75 112 int invfactor = 0;
soonerbot 7:3b2cf7efe5d1 113
soonerbot 7:3b2cf7efe5d1 114 //if going backwards, point away from the point
soonerbot 6:62d498ee97cf 115 if(distance<0) {
soonerbot 4:adc885f4ab75 116 invfactor = 2025000;
soonerbot 4:adc885f4ab75 117 }
soonerbot 6:62d498ee97cf 118 double realfac=0.1;
soonerbot 4:adc885f4ab75 119
soonerbot 4:adc885f4ab75 120 int pmain=distance;
soonerbot 4:adc885f4ab75 121 int imain=0;
soonerbot 4:adc885f4ab75 122 int dmain=0;
soonerbot 4:adc885f4ab75 123
soonerbot 4:adc885f4ab75 124 int dterm=0;
soonerbot 4:adc885f4ab75 125 const int ptol = 75;
soonerbot 4:adc885f4ab75 126 const int dtol = 10;
soonerbot 8:c23cd84befa2 127 while((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 8:c23cd84befa2 128
soonerbot 4:adc885f4ab75 129 //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 130 for(i=0;i<4;i++)
soonerbot 1:c28fac16a109 131 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 132 //wait(0.05);
soonerbot 1:c28fac16a109 133 constbuf = bigenc.getVals();
soonerbot 4:adc885f4ab75 134
soonerbot 7:3b2cf7efe5d1 135 //control system (Proportional, Derivative, Integral)
soonerbot 5:74c8ce39334b 136 pmain = distance - (constbuf[0]+constbuf[1])/2;
soonerbot 5:74c8ce39334b 137 dmain = ((constbuf[0]+constbuf[1]) - (prev[0]+prev[1]))/2;
soonerbot 4:adc885f4ab75 138 imain += pmain;
soonerbot 4:adc885f4ab75 139
soonerbot 6:62d498ee97cf 140 //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 141
soonerbot 7:3b2cf7efe5d1 142 //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 143 realfac = (gyro.compZ(invfactor+atan2(targy-y,targx-x)*4050000.0/(2*3.14159)))*angfac;
soonerbot 7:3b2cf7efe5d1 144 realfac = MAX(MIN(realfac,0.3),-0.3); // limits how much the motors can turn to fix the angle
soonerbot 4:adc885f4ab75 145
soonerbot 7:3b2cf7efe5d1 146 //uses PID control for the forward/back motions and adds in the angular component
soonerbot 7:3b2cf7efe5d1 147 //the forward/back motions is limited to a certain speed
soonerbot 5:74c8ce39334b 148 double leftpow = MAX(MIN(pfac*pmain+ifac*imain+dfac*dmain,maxPow),-maxPow)-realfac;
soonerbot 5:74c8ce39334b 149 double rightpow = MAX(MIN(pfac*pmain+ifac*imain+dfac*dmain,maxPow),-maxPow)+realfac;
soonerbot 7:3b2cf7efe5d1 150
soonerbot 7:3b2cf7efe5d1 151 //if we haven't settled, but also aren't moving, then speed up until it moves
soonerbot 7:3b2cf7efe5d1 152 if((pmain <= -ptol || pmain >= ptol) || (dmain <= -dtol || dmain >= dtol) || (realfac <= -0.02 || realfac >= 0.02) ){
soonerbot 4:adc885f4ab75 153 if (leftpow>0){
soonerbot 4:adc885f4ab75 154 if (leftpow<minalt){
soonerbot 4:adc885f4ab75 155 leftpow=minalt;
soonerbot 4:adc885f4ab75 156 }
soonerbot 4:adc885f4ab75 157 }else if (leftpow>-minalt){
soonerbot 4:adc885f4ab75 158 leftpow=-minalt;
soonerbot 4:adc885f4ab75 159 }
soonerbot 4:adc885f4ab75 160 if (rightpow>0){
soonerbot 4:adc885f4ab75 161 if (rightpow<minmain){
soonerbot 4:adc885f4ab75 162 rightpow=minmain;
soonerbot 4:adc885f4ab75 163 }
soonerbot 4:adc885f4ab75 164 }else if (rightpow>-minmain){
soonerbot 4:adc885f4ab75 165 rightpow=-minmain;
soonerbot 4:adc885f4ab75 166 }
soonerbot 4:adc885f4ab75 167 }
soonerbot 4:adc885f4ab75 168 left.setPower(leftpow);
soonerbot 4:adc885f4ab75 169 right.setPower(rightpow);
soonerbot 7:3b2cf7efe5d1 170
soonerbot 7:3b2cf7efe5d1 171 //how far we've moved in the last timestep
soonerbot 4:adc885f4ab75 172 int deltaTraveled=(constbuf[0]-prev[0]+constbuf[1]-prev[1])/2;
soonerbot 4:adc885f4ab75 173 //DBGPRINT("\t %d\r\n",deltaTraveled);
soonerbot 7:3b2cf7efe5d1 174 addforward(double(deltaTraveled)*0.0035362); //update our position
soonerbot 1:c28fac16a109 175 distTraveled+=deltaTraveled;
soonerbot 4:adc885f4ab75 176 loopcount++;
soonerbot 7:3b2cf7efe5d1 177
soonerbot 7:3b2cf7efe5d1 178 //increase min speed so that it will actually move
soonerbot 4:adc885f4ab75 179 if((dmain<5&&dmain>-5)&&minmain<0.2){
soonerbot 5:74c8ce39334b 180 minmain+=0.003;
soonerbot 4:adc885f4ab75 181 } else if (minmain>=0.05) {
soonerbot 5:74c8ce39334b 182 minmain-=0.003;
soonerbot 4:adc885f4ab75 183 }
soonerbot 4:adc885f4ab75 184 if((dterm<5&&dterm>-5)&&minalt<0.2){
soonerbot 5:74c8ce39334b 185 minalt+=0.003;
soonerbot 4:adc885f4ab75 186 } else if (minalt>=0.05) {
soonerbot 5:74c8ce39334b 187 minalt-=0.003;
soonerbot 4:adc885f4ab75 188 }
soonerbot 1:c28fac16a109 189 }
soonerbot 1:c28fac16a109 190 left.brake();
soonerbot 1:c28fac16a109 191 right.brake();
soonerbot 6:62d498ee97cf 192 DBGPRINT("Loops: %d\r\n",loopcount);
soonerbot 7:3b2cf7efe5d1 193
soonerbot 7:3b2cf7efe5d1 194 //catch the slowdown movement
soonerbot 6:62d498ee97cf 195 wait(0.2);
soonerbot 5:74c8ce39334b 196 for(i=0;i<4;i++)
soonerbot 5:74c8ce39334b 197 prev[i]=constbuf[i];
soonerbot 5:74c8ce39334b 198 //wait(0.05);
soonerbot 5:74c8ce39334b 199 constbuf = bigenc.getVals();
soonerbot 6:62d498ee97cf 200 addforward(double(constbuf[0]-prev[0]+constbuf[1]-prev[1])*0.0035362/2.0);
soonerbot 5:74c8ce39334b 201 DBGPRINT("loss of %d and %d\n\r",constbuf[0]-prev[0],constbuf[1]-prev[1]);
soonerbot 1:c28fac16a109 202 return 0;
soonerbot 1:c28fac16a109 203 }
soonerbot 1:c28fac16a109 204
soonerbot 7:3b2cf7efe5d1 205 //add the motion in the direction that the robot is facing
soonerbot 4:adc885f4ab75 206 void robot::addforward(double dist){
soonerbot 4:adc885f4ab75 207 double angle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 208 x+=dist*cos(angle);
soonerbot 1:c28fac16a109 209 y+=dist*sin(angle);
soonerbot 1:c28fac16a109 210 rot=angle;
soonerbot 1:c28fac16a109 211 }
soonerbot 1:c28fac16a109 212
soonerbot 7:3b2cf7efe5d1 213 //doesn't work yet
soonerbot 1:c28fac16a109 214 int robot::moveTo(double xInches, double yInches){
soonerbot 1:c28fac16a109 215 double power=.2;
soonerbot 1:c28fac16a109 216 turntowards(xInches,yInches);
soonerbot 1:c28fac16a109 217 double distance=sqrt(pow(xInches-x,2)+pow(yInches-y,2))/0.0035362;
soonerbot 1:c28fac16a109 218 double angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 4:adc885f4ab75 219 double currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 220 bigenc.resetAll();
soonerbot 1:c28fac16a109 221 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 222 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 223 int distTraveled=0, i;
soonerbot 1:c28fac16a109 224 double maxPow;
soonerbot 1:c28fac16a109 225 DBGPRINT("going %f at angle %f from current of %f\r\n",distance,angle,currangle);
soonerbot 1:c28fac16a109 226 while(distTraveled<distance){
soonerbot 1:c28fac16a109 227 angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 4:adc885f4ab75 228 currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 229 maxPow=MAX(double(distance-distTraveled-2000)/15000.0,0.1);
soonerbot 1:c28fac16a109 230 if(currangle>angle+2.0){ //too far to the right, brake left
soonerbot 1:c28fac16a109 231 left.brake();
soonerbot 1:c28fac16a109 232 } else {
soonerbot 1:c28fac16a109 233 left.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 234 }
soonerbot 1:c28fac16a109 235 if(currangle<angle-2){
soonerbot 1:c28fac16a109 236 right.brake();
soonerbot 1:c28fac16a109 237 } else {
soonerbot 1:c28fac16a109 238 right.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 239 }
soonerbot 1:c28fac16a109 240 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 241 for(i=0;i<4;i++)
soonerbot 1:c28fac16a109 242 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 243 //wait(0.05);
soonerbot 1:c28fac16a109 244 constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 245 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 246 addforward(double(deltaTraveled)*0.0035362);
soonerbot 1:c28fac16a109 247 distTraveled+=deltaTraveled;
soonerbot 1:c28fac16a109 248 //angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 1:c28fac16a109 249 }
soonerbot 1:c28fac16a109 250 left.brake();
soonerbot 1:c28fac16a109 251 right.brake();
soonerbot 1:c28fac16a109 252 return 0;
soonerbot 1:c28fac16a109 253
soonerbot 1:c28fac16a109 254 }
soonerbot 1:c28fac16a109 255
soonerbot 7:3b2cf7efe5d1 256 //also doesn't work
soonerbot 1:c28fac16a109 257 int robot::turntowards(double xInches, double yInches){
soonerbot 4:adc885f4ab75 258 double currangle=double(gyro.getZ())*2*3.14159/4050000.0;
soonerbot 1:c28fac16a109 259 double angle=atan2(xInches-x,yInches-y)*180.0/3.14159;
soonerbot 1:c28fac16a109 260 double finangle=angle;
soonerbot 1:c28fac16a109 261 /*if(int(currangle-angle)%360>180){ //needs to turn positive degrees
soonerbot 1:c28fac16a109 262 finangle=currangle+double(int(angle-currangle)%360);
soonerbot 1:c28fac16a109 263 } else {//negative degrees
soonerbot 1:c28fac16a109 264 finangle=currangle-double(int(currangle-angle)%360);
soonerbot 1:c28fac16a109 265 }*/
soonerbot 1:c28fac16a109 266 double acc=turn(0.4,finangle);
soonerbot 1:c28fac16a109 267 if(acc<-0.75 && acc>0.75){
soonerbot 1:c28fac16a109 268 acc=turn(0.3,finangle);
soonerbot 1:c28fac16a109 269 }
soonerbot 1:c28fac16a109 270
soonerbot 1:c28fac16a109 271
soonerbot 1:c28fac16a109 272 return 1;
soonerbot 1:c28fac16a109 273 }
soonerbot 1:c28fac16a109 274
soonerbot 7:3b2cf7efe5d1 275 //still no
soonerbot 1:c28fac16a109 276 double robot::turn(double power, double degrees){
soonerbot 1:c28fac16a109 277 bigenc.resetAll();
soonerbot 1:c28fac16a109 278 const int* constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 279 int prev[4]={0,0,0,0};
soonerbot 1:c28fac16a109 280 int startz;
soonerbot 4:adc885f4ab75 281 startz=gyro.getZ();
soonerbot 1:c28fac16a109 282 int gyroticks=(degrees*4050000)/360;
soonerbot 1:c28fac16a109 283 double maxPow;
soonerbot 1:c28fac16a109 284 int nowz=startz;
soonerbot 1:c28fac16a109 285 int dir=0;
soonerbot 1:c28fac16a109 286 if(gyroticks>startz){
soonerbot 1:c28fac16a109 287 right.setPower(-power);
soonerbot 1:c28fac16a109 288 left.setPower(power);
soonerbot 1:c28fac16a109 289 dir=1;
soonerbot 1:c28fac16a109 290 } else {
soonerbot 1:c28fac16a109 291 right.setPower(power);
soonerbot 1:c28fac16a109 292 left.setPower(-power);
soonerbot 1:c28fac16a109 293 dir=-1;
soonerbot 1:c28fac16a109 294 }
soonerbot 1:c28fac16a109 295 while((gyroticks-nowz)*dir>0){
soonerbot 1:c28fac16a109 296 maxPow=MAX(double(abs(gyroticks-nowz))/4050000.0,0.25);
soonerbot 1:c28fac16a109 297 if(gyroticks<nowz){
soonerbot 1:c28fac16a109 298 right.setPower(-MIN(power,maxPow));
soonerbot 1:c28fac16a109 299 left.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 300 } else {
soonerbot 1:c28fac16a109 301 right.setPower(MIN(power,maxPow));
soonerbot 1:c28fac16a109 302 left.setPower(-MIN(power,maxPow));
soonerbot 1:c28fac16a109 303 }
soonerbot 1:c28fac16a109 304 DBGPRINT("_%d of %d {%f, %f, %f}\r\n",(gyroticks-nowz)*dir, gyroticks,x,y,rot*180.0/3.14159);
soonerbot 1:c28fac16a109 305 for(int i=0;i<4;i++)
soonerbot 1:c28fac16a109 306 prev[i]=constbuf[i];
soonerbot 1:c28fac16a109 307 constbuf = bigenc.getVals();
soonerbot 1:c28fac16a109 308 int deltaTraveled;
soonerbot 1:c28fac16a109 309 if(gyroticks<nowz){
soonerbot 1:c28fac16a109 310 deltaTraveled=(MIN(-constbuf[0]+prev[0],-constbuf[1]+prev[1])-MIN(-constbuf[2]+prev[2],-constbuf[3]+prev[3]))/2;
soonerbot 1:c28fac16a109 311 } else {
soonerbot 1:c28fac16a109 312 deltaTraveled=(-MIN(constbuf[0]-prev[0],constbuf[1]-prev[1])+MIN(constbuf[2]-prev[2],constbuf[3]-prev[3]))/2;
soonerbot 1:c28fac16a109 313 }
soonerbot 1:c28fac16a109 314 addforward(double(deltaTraveled)*0.0035362);
soonerbot 4:adc885f4ab75 315 nowz=gyro.getZ();
soonerbot 1:c28fac16a109 316 }
soonerbot 1:c28fac16a109 317 right.brake();
soonerbot 1:c28fac16a109 318 left.brake();
soonerbot 1:c28fac16a109 319 return (gyroticks-nowz)*dir;
soonerbot 1:c28fac16a109 320 }