Algorithmus

Dependencies:   mbed

Committer:
Helvis
Date:
Tue Apr 24 15:35:24 2018 +0000
Revision:
6:4868f789c223
Parent:
5:e2c0a4388d85
Child:
7:22392ed60534
v0.9.5 Funktionierende Suchfahrt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helvis 1:2b5f79285a3e 1
Helvis 1:2b5f79285a3e 2 #include <cmath>
Helvis 1:2b5f79285a3e 3 #include "Motion.h"
Helvis 1:2b5f79285a3e 4
Helvis 1:2b5f79285a3e 5 using namespace std;
Helvis 1:2b5f79285a3e 6
Helvis 6:4868f789c223 7 const float Motion::LEFT_MID_VAL = 41.73f; //44.73
Helvis 6:4868f789c223 8 const float Motion::RIGHT_MID_VAL = 44.03f; //47.03
Helvis 6:4868f789c223 9 const float Motion::KP = 2.5;
Helvis 5:e2c0a4388d85 10 const float Motion::KD = 0.0f;
Helvis 6:4868f789c223 11 const int Motion::MOVE_DIST = 1605;
Helvis 6:4868f789c223 12 const float Motion::MOVE_SPEED = 50.0f;
Helvis 1:2b5f79285a3e 13
Helvis 1:2b5f79285a3e 14
Helvis 1:2b5f79285a3e 15 Motion::Motion(Controller& controller, EncoderCounter& counterLeft,
Helvis 1:2b5f79285a3e 16 EncoderCounter& counterRight, IRSensor& irSensorL,
Helvis 1:2b5f79285a3e 17 IRSensor& irSensorC, IRSensor& irSensorR, AnalogIn& lineSensor,
Helvis 1:2b5f79285a3e 18 DigitalOut& enableMotorDriver) :
Helvis 1:2b5f79285a3e 19 controller(controller), counterLeft(counterLeft),
Helvis 1:2b5f79285a3e 20 counterRight(counterRight), irSensorL(irSensorL),
Helvis 1:2b5f79285a3e 21 irSensorC(irSensorC), irSensorR(irSensorR), lineSensor(lineSensor),
Helvis 1:2b5f79285a3e 22 enableMotorDriver(enableMotorDriver) {}
Helvis 1:2b5f79285a3e 23
Helvis 1:2b5f79285a3e 24 Motion::~Motion() {}
Helvis 1:2b5f79285a3e 25
Helvis 1:2b5f79285a3e 26 /**
Helvis 1:2b5f79285a3e 27 * Eine Feldstrecke druchführen
Helvis 1:2b5f79285a3e 28 */
Helvis 1:2b5f79285a3e 29 void Motion::move() {
Helvis 1:2b5f79285a3e 30
Helvis 1:2b5f79285a3e 31 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 32 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 33 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 34 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 35
Helvis 1:2b5f79285a3e 36 speedLeft = 50.0f;
Helvis 1:2b5f79285a3e 37 speedRight = -50.0f;
Helvis 1:2b5f79285a3e 38
Helvis 6:4868f789c223 39 controller.setDesiredSpeedLeft(MOVE_SPEED);
Helvis 6:4868f789c223 40 controller.setDesiredSpeedRight(-MOVE_SPEED);
Helvis 1:2b5f79285a3e 41
Helvis 6:4868f789c223 42 while ((countsL - countsLOld) < MOVE_DIST || (countsR - countsROld) > -MOVE_DIST) {
Helvis 1:2b5f79285a3e 43
Helvis 1:2b5f79285a3e 44 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 45 countsR = counterRight.read();
Helvis 5:e2c0a4388d85 46 distanceC = irSensorC.readC();
Helvis 1:2b5f79285a3e 47
Helvis 1:2b5f79285a3e 48 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 1:2b5f79285a3e 49
Helvis 5:e2c0a4388d85 50 control();
Helvis 5:e2c0a4388d85 51
Helvis 5:e2c0a4388d85 52 if ((distanceC) < 40.0f) {
Helvis 5:e2c0a4388d85 53 countsLOld = countsL;
Helvis 5:e2c0a4388d85 54 countsROld = countsR;
Helvis 5:e2c0a4388d85 55 while ((countsL - countsLOld) < 70 || (countsR - countsROld) > -70) {
Helvis 5:e2c0a4388d85 56 countsL = counterLeft.read();
Helvis 5:e2c0a4388d85 57 countsR = counterRight.read();
Helvis 5:e2c0a4388d85 58 }
Helvis 5:e2c0a4388d85 59 stop();
Helvis 5:e2c0a4388d85 60 break;
Helvis 6:4868f789c223 61 }else if ( ((countsL - countsLOld) >= MOVE_DIST || (countsR - countsROld) <= -MOVE_DIST) && (distanceC < 100.0f) && (distanceC > 40.0f)) {
Helvis 5:e2c0a4388d85 62 countsLOld += 500;
Helvis 5:e2c0a4388d85 63 countsROld += 500;
Helvis 5:e2c0a4388d85 64 }
Helvis 1:2b5f79285a3e 65
Helvis 1:2b5f79285a3e 66 }
Helvis 1:2b5f79285a3e 67 }
Helvis 1:2b5f79285a3e 68 /**
Helvis 1:2b5f79285a3e 69 * Eine Feldstrecke mit höherer Geschwindigkeit fahren
Helvis 1:2b5f79285a3e 70 */
Helvis 1:2b5f79285a3e 71 void Motion::moveFast() {
Helvis 1:2b5f79285a3e 72
Helvis 1:2b5f79285a3e 73 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 74 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 75 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 76 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 77
Helvis 1:2b5f79285a3e 78 speedLeft = 100.0f;
Helvis 1:2b5f79285a3e 79 speedRight = -100.0f;
Helvis 1:2b5f79285a3e 80
Helvis 1:2b5f79285a3e 81 controller.setDesiredSpeedLeft(speedLeft);
Helvis 1:2b5f79285a3e 82 controller.setDesiredSpeedRight(speedRight);
Helvis 1:2b5f79285a3e 83
Helvis 1:2b5f79285a3e 84 while ((countsL - countsLOld) < 1647 || (countsR - countsROld) > -1647) {
Helvis 1:2b5f79285a3e 85
Helvis 1:2b5f79285a3e 86 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 87 countsR = counterRight.read();
Helvis 5:e2c0a4388d85 88 distanceC = irSensorC.readC();
Helvis 1:2b5f79285a3e 89
Helvis 1:2b5f79285a3e 90 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 1:2b5f79285a3e 91
Helvis 1:2b5f79285a3e 92 control();
Helvis 1:2b5f79285a3e 93
Helvis 5:e2c0a4388d85 94 if (distanceC < 40.0f) {
Helvis 5:e2c0a4388d85 95 stop();
Helvis 5:e2c0a4388d85 96 break;
Helvis 5:e2c0a4388d85 97 }
Helvis 1:2b5f79285a3e 98 }
Helvis 1:2b5f79285a3e 99 }
Helvis 1:2b5f79285a3e 100 /**
Helvis 1:2b5f79285a3e 101 * Eine Feldstrecke mit überprüfung der Ziellinie fahren
Helvis 1:2b5f79285a3e 102 */
Helvis 1:2b5f79285a3e 103 void Motion::scanMove() {
Helvis 1:2b5f79285a3e 104
Helvis 1:2b5f79285a3e 105 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 106 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 107 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 108 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 109
Helvis 1:2b5f79285a3e 110 speedLeft = 50.0f;
Helvis 1:2b5f79285a3e 111 speedRight = -50.0f;
Helvis 1:2b5f79285a3e 112
Helvis 6:4868f789c223 113 controller.setDesiredSpeedLeft(MOVE_SPEED);
Helvis 6:4868f789c223 114 controller.setDesiredSpeedRight(-MOVE_SPEED);
Helvis 1:2b5f79285a3e 115
Helvis 5:e2c0a4388d85 116 distanceC = irSensorC.readC();
Helvis 5:e2c0a4388d85 117
Helvis 6:4868f789c223 118 while ((countsL - countsLOld) < MOVE_DIST || (countsR - countsROld) > -MOVE_DIST) {
Helvis 1:2b5f79285a3e 119
Helvis 1:2b5f79285a3e 120 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 121 countsR = counterRight.read();
Helvis 3:076dd7ec7eb4 122 distanceC = irSensorC.readC();
Helvis 1:2b5f79285a3e 123
Helvis 1:2b5f79285a3e 124 if (enableMotorDriver == 0) {
Helvis 1:2b5f79285a3e 125 enableMotorDriver = 1;
Helvis 1:2b5f79285a3e 126 }
Helvis 1:2b5f79285a3e 127
Helvis 3:076dd7ec7eb4 128 if (lineSensor.read() == 1.0f) {
Helvis 1:2b5f79285a3e 129 line = 1;
Helvis 1:2b5f79285a3e 130 }
Helvis 1:2b5f79285a3e 131
Helvis 5:e2c0a4388d85 132 control();
Helvis 1:2b5f79285a3e 133
Helvis 5:e2c0a4388d85 134 if ((distanceC) < 40.0f) {
Helvis 5:e2c0a4388d85 135 countsLOld = countsL;
Helvis 5:e2c0a4388d85 136 countsROld = countsR;
Helvis 5:e2c0a4388d85 137 while ((countsL - countsLOld) < 70 || (countsR - countsROld) > -70) {
Helvis 5:e2c0a4388d85 138 countsL = counterLeft.read();
Helvis 5:e2c0a4388d85 139 countsR = counterRight.read();
Helvis 5:e2c0a4388d85 140 }
Helvis 3:076dd7ec7eb4 141 stop();
Helvis 3:076dd7ec7eb4 142 break;
Helvis 6:4868f789c223 143 }else if ( ((countsL - countsLOld) >= MOVE_DIST || (countsR - countsROld) <= -MOVE_DIST) && (distanceC < 100.0f) && (distanceC > 40.0f)) {
Helvis 5:e2c0a4388d85 144 countsLOld += 500;
Helvis 5:e2c0a4388d85 145 countsROld += 500;
Helvis 3:076dd7ec7eb4 146 }
Helvis 5:e2c0a4388d85 147 }
Helvis 1:2b5f79285a3e 148 }
Helvis 1:2b5f79285a3e 149 /**
Helvis 1:2b5f79285a3e 150 * 90° Rotation nach Links
Helvis 1:2b5f79285a3e 151 */
Helvis 1:2b5f79285a3e 152 void Motion::rotateL() {
Helvis 1:2b5f79285a3e 153
Helvis 1:2b5f79285a3e 154 stop();
Helvis 1:2b5f79285a3e 155 controller.counterReset();
Helvis 1:2b5f79285a3e 156 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 157 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 158 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 159 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 160
Helvis 1:2b5f79285a3e 161 controller.setDesiredSpeedLeft(-20.0f);
Helvis 1:2b5f79285a3e 162 controller.setDesiredSpeedRight(-20.0f);
Helvis 1:2b5f79285a3e 163
Helvis 1:2b5f79285a3e 164 while ((countsL - countsLOld) > -862 || (countsR - countsROld) > -862) {
Helvis 1:2b5f79285a3e 165
Helvis 1:2b5f79285a3e 166 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 167 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 168
Helvis 1:2b5f79285a3e 169 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 1:2b5f79285a3e 170 }
Helvis 1:2b5f79285a3e 171
Helvis 1:2b5f79285a3e 172 stop();
Helvis 1:2b5f79285a3e 173 }
Helvis 1:2b5f79285a3e 174
Helvis 1:2b5f79285a3e 175 /**
Helvis 1:2b5f79285a3e 176 * 90° Rotation nach Rechts
Helvis 1:2b5f79285a3e 177 */
Helvis 1:2b5f79285a3e 178 void Motion::rotateR() {
Helvis 1:2b5f79285a3e 179
Helvis 1:2b5f79285a3e 180 stop();
Helvis 1:2b5f79285a3e 181 controller.counterReset();
Helvis 1:2b5f79285a3e 182 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 183 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 184 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 185 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 186
Helvis 1:2b5f79285a3e 187 controller.setDesiredSpeedLeft(20.0f);
Helvis 1:2b5f79285a3e 188 controller.setDesiredSpeedRight(20.0f);
Helvis 1:2b5f79285a3e 189
Helvis 1:2b5f79285a3e 190 while ((countsL - countsLOld) < 862 || (countsR - countsROld) < 862) {
Helvis 1:2b5f79285a3e 191
Helvis 1:2b5f79285a3e 192 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 193 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 194
Helvis 1:2b5f79285a3e 195 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 1:2b5f79285a3e 196 }
Helvis 1:2b5f79285a3e 197
Helvis 1:2b5f79285a3e 198 stop();
Helvis 1:2b5f79285a3e 199 }
Helvis 2:f898adf2d817 200 /**
Helvis 2:f898adf2d817 201 * Links abbiegen
Helvis 2:f898adf2d817 202 */
Helvis 3:076dd7ec7eb4 203 void Motion::turnL() {
Helvis 2:f898adf2d817 204
Helvis 2:f898adf2d817 205 controller.counterReset();
Helvis 2:f898adf2d817 206 countsLOld = counterLeft.read();
Helvis 2:f898adf2d817 207 countsROld = counterRight.read();
Helvis 2:f898adf2d817 208 countsL = counterLeft.read();
Helvis 2:f898adf2d817 209 countsR = counterRight.read();
Helvis 2:f898adf2d817 210
Helvis 2:f898adf2d817 211 controller.setDesiredSpeedLeft(17.0f);
Helvis 2:f898adf2d817 212 controller.setDesiredSpeedRight(-83.0f);
Helvis 2:f898adf2d817 213
Helvis 2:f898adf2d817 214 while ((countsL - countsLOld) < 440 || (countsR - countsROld) > -2148) {
Helvis 2:f898adf2d817 215
Helvis 2:f898adf2d817 216 countsL = counterLeft.read();
Helvis 2:f898adf2d817 217 countsR = counterRight.read();
Helvis 2:f898adf2d817 218
Helvis 2:f898adf2d817 219 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 2:f898adf2d817 220 }
Helvis 2:f898adf2d817 221 }
Helvis 2:f898adf2d817 222 /**
Helvis 2:f898adf2d817 223 * Rechts abbiegen
Helvis 2:f898adf2d817 224 */
Helvis 3:076dd7ec7eb4 225 void Motion::turnR() {
Helvis 2:f898adf2d817 226
Helvis 2:f898adf2d817 227 controller.counterReset();
Helvis 2:f898adf2d817 228 countsLOld = counterLeft.read();
Helvis 2:f898adf2d817 229 countsROld = counterRight.read();
Helvis 2:f898adf2d817 230 countsL = counterLeft.read();
Helvis 2:f898adf2d817 231 countsR = counterRight.read();
Helvis 2:f898adf2d817 232
Helvis 2:f898adf2d817 233 controller.setDesiredSpeedLeft(83.0f);
Helvis 2:f898adf2d817 234 controller.setDesiredSpeedRight(-17.0f);
Helvis 2:f898adf2d817 235
Helvis 2:f898adf2d817 236 while ((countsL - countsLOld) < 2148 || (countsR - countsROld) > -440) {
Helvis 2:f898adf2d817 237
Helvis 2:f898adf2d817 238 countsL = counterLeft.read();
Helvis 2:f898adf2d817 239 countsR = counterRight.read();
Helvis 2:f898adf2d817 240
Helvis 2:f898adf2d817 241 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 3:076dd7ec7eb4 242 }
Helvis 2:f898adf2d817 243 }
Helvis 1:2b5f79285a3e 244 /**
Helvis 1:2b5f79285a3e 245 * Motor Stop
Helvis 1:2b5f79285a3e 246 */
Helvis 1:2b5f79285a3e 247 void Motion::stop() {
Helvis 1:2b5f79285a3e 248
Helvis 1:2b5f79285a3e 249 controller.setDesiredSpeedLeft(0.0f);
Helvis 1:2b5f79285a3e 250 controller.setDesiredSpeedRight(0.0f);
Helvis 1:2b5f79285a3e 251
Helvis 1:2b5f79285a3e 252 float sL = controller.getSpeedLeft();
Helvis 1:2b5f79285a3e 253 float ticks = 0.08f*sL;
Helvis 1:2b5f79285a3e 254
Helvis 1:2b5f79285a3e 255 waitStop = 0;
Helvis 1:2b5f79285a3e 256 while( waitStop < ticks) {
Helvis 1:2b5f79285a3e 257 waitStop+= 1;
Helvis 1:2b5f79285a3e 258 }
Helvis 1:2b5f79285a3e 259 }
Helvis 1:2b5f79285a3e 260 /**
Helvis 1:2b5f79285a3e 261 * 180° Rotation
Helvis 1:2b5f79285a3e 262 */
Helvis 1:2b5f79285a3e 263 void Motion::rotate180() {
Helvis 1:2b5f79285a3e 264
Helvis 1:2b5f79285a3e 265 stop();
Helvis 1:2b5f79285a3e 266 controller.counterReset();
Helvis 1:2b5f79285a3e 267 countsLOld = counterLeft.read();
Helvis 1:2b5f79285a3e 268 countsROld = counterRight.read();
Helvis 1:2b5f79285a3e 269 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 270 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 271
Helvis 1:2b5f79285a3e 272 controller.setDesiredSpeedLeft(-50.0f);
Helvis 1:2b5f79285a3e 273 controller.setDesiredSpeedRight(-50.0f);
Helvis 1:2b5f79285a3e 274
Helvis 1:2b5f79285a3e 275 while ((countsL - countsLOld) > -1723 || (countsR - countsROld) > -1723) {
Helvis 1:2b5f79285a3e 276
Helvis 1:2b5f79285a3e 277 countsL = counterLeft.read();
Helvis 1:2b5f79285a3e 278 countsR = counterRight.read();
Helvis 1:2b5f79285a3e 279
Helvis 1:2b5f79285a3e 280 if (enableMotorDriver == 0) {enableMotorDriver = 1;}
Helvis 1:2b5f79285a3e 281 }
Helvis 1:2b5f79285a3e 282
Helvis 1:2b5f79285a3e 283 stop();
Helvis 1:2b5f79285a3e 284 }
Helvis 1:2b5f79285a3e 285
Helvis 1:2b5f79285a3e 286
Helvis 1:2b5f79285a3e 287 void Motion::control() {
Helvis 1:2b5f79285a3e 288
Helvis 6:4868f789c223 289 float wallLeft = 48.73f;
Helvis 6:4868f789c223 290 float wallRight = 51.03f;
Helvis 1:2b5f79285a3e 291
Helvis 1:2b5f79285a3e 292 distanceL = irSensorL.readL();
Helvis 1:2b5f79285a3e 293 distanceR = irSensorR.readR();
Helvis 1:2b5f79285a3e 294
Helvis 5:e2c0a4388d85 295
Helvis 4:932eb2d29206 296 if (distanceL < wallLeft && distanceR < wallRight) {
Helvis 1:2b5f79285a3e 297
Helvis 4:932eb2d29206 298 errorP = distanceL - distanceR + 2.30f;
Helvis 6:4868f789c223 299
Helvis 6:4868f789c223 300 }else if (distanceL < LEFT_MID_VAL && distanceR > RIGHT_MID_VAL) {
Helvis 6:4868f789c223 301
Helvis 6:4868f789c223 302 errorP = distanceL - LEFT_MID_VAL;
Helvis 6:4868f789c223 303
Helvis 6:4868f789c223 304 }else if (distanceL > LEFT_MID_VAL && distanceR < RIGHT_MID_VAL) {
Helvis 6:4868f789c223 305
Helvis 6:4868f789c223 306 errorP = RIGHT_MID_VAL - distanceR;
Helvis 6:4868f789c223 307
Helvis 1:2b5f79285a3e 308 }else{
Helvis 1:2b5f79285a3e 309
Helvis 5:e2c0a4388d85 310 errorP = 0;
Helvis 5:e2c0a4388d85 311 errorD = 0;
Helvis 1:2b5f79285a3e 312 }
Helvis 1:2b5f79285a3e 313
Helvis 6:4868f789c223 314 errorD = errorP - oldErrorP;
Helvis 1:2b5f79285a3e 315
Helvis 1:2b5f79285a3e 316 oldErrorP = errorP;
Helvis 1:2b5f79285a3e 317
Helvis 5:e2c0a4388d85 318 if (abs(errorP) < 80.0f) {
Helvis 5:e2c0a4388d85 319 totalError = KP*errorP + KD*errorD;
Helvis 5:e2c0a4388d85 320 }else{
Helvis 5:e2c0a4388d85 321 totalError = 0;
Helvis 5:e2c0a4388d85 322 }
Helvis 1:2b5f79285a3e 323
Helvis 5:e2c0a4388d85 324 controller.setDesiredSpeedLeft(speedLeft - totalError);
Helvis 5:e2c0a4388d85 325 controller.setDesiredSpeedRight(speedRight - totalError);
Helvis 1:2b5f79285a3e 326 }
Helvis 1:2b5f79285a3e 327
Helvis 1:2b5f79285a3e 328 void Motion::runTask(int task) {
Helvis 1:2b5f79285a3e 329
Helvis 1:2b5f79285a3e 330 switch(task) {
Helvis 1:2b5f79285a3e 331
Helvis 1:2b5f79285a3e 332 case 1:
Helvis 1:2b5f79285a3e 333 move();
Helvis 1:2b5f79285a3e 334 break;
Helvis 1:2b5f79285a3e 335 case 2:
Helvis 1:2b5f79285a3e 336 rotateL();
Helvis 1:2b5f79285a3e 337 break;
Helvis 1:2b5f79285a3e 338 case 3:
Helvis 1:2b5f79285a3e 339 rotateR();
Helvis 1:2b5f79285a3e 340 break;
Helvis 1:2b5f79285a3e 341 case 4:
Helvis 1:2b5f79285a3e 342 moveFast();
Helvis 1:2b5f79285a3e 343 break;
Helvis 1:2b5f79285a3e 344 case 5:
Helvis 1:2b5f79285a3e 345 stop();
Helvis 1:2b5f79285a3e 346 break;
Helvis 1:2b5f79285a3e 347 }
Helvis 1:2b5f79285a3e 348 }
Helvis 1:2b5f79285a3e 349
Helvis 1:2b5f79285a3e 350 int Motion::finish() {
Helvis 1:2b5f79285a3e 351
Helvis 1:2b5f79285a3e 352 return line;
Helvis 1:2b5f79285a3e 353 }