Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Control/drivecontrol.cpp@7:7215adbae3da, 2017-05-14 (annotated)
- Committer:
- kolanery
- Date:
- Sun May 14 19:57:34 2017 +0000
- Revision:
- 7:7215adbae3da
- Parent:
- 6:1bcfda49e146
- Child:
- 8:4a32fc9ee939
- Child:
- 10:e69cb200dc15
refactor code.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kolanery | 0:cb667de3a336 | 1 | #include "drivecontrol.h" |
kolanery | 0:cb667de3a336 | 2 | #include "Cell.h" |
kolanery | 0:cb667de3a336 | 3 | #include "ir_sensor.h" |
kolanery | 2:619b02232144 | 4 | #include "left_motor.h" |
kolanery | 2:619b02232144 | 5 | #include "right_motor.h" |
szh66 | 6:1bcfda49e146 | 6 | #include "pin_assignment.h" |
kolanery | 0:cb667de3a336 | 7 | |
szh66 | 6:1bcfda49e146 | 8 | IRSensor leftIR(PA_8, PC_5); |
szh66 | 6:1bcfda49e146 | 9 | IRSensor rightIR(PB_0, PA_4); |
kolanery | 7:7215adbae3da | 10 | |
kolanery | 0:cb667de3a336 | 11 | // Define states for debugging the mouse hardware |
szh66 | 6:1bcfda49e146 | 12 | const int DRIVE = 0, TURN = 2, STOP = 4; |
kolanery | 7:7215adbae3da | 13 | const int TURN_LEFT = 0, TURN_RIGHT = 1, TURN_AROUND = 2; |
kolanery | 7:7215adbae3da | 14 | |
kolanery | 2:619b02232144 | 15 | LeftMotor * leftMotor; |
kolanery | 2:619b02232144 | 16 | RightMotor * rightMotor; |
kolanery | 0:cb667de3a336 | 17 | Cell * curr_cell; |
szh66 | 6:1bcfda49e146 | 18 | Serial pc(PA_9, PA_10); |
szh66 | 6:1bcfda49e146 | 19 | |
szh66 | 6:1bcfda49e146 | 20 | float motor_speed; |
kolanery | 7:7215adbae3da | 21 | float MOTOR_BASE_SPEED = 15.0f; |
kolanery | 7:7215adbae3da | 22 | |
kolanery | 7:7215adbae3da | 23 | float FRONT_SENSOR_THRESHOLD = 0.90f; |
kolanery | 7:7215adbae3da | 24 | const int SENSOR_THRESHOLD = 12; |
szh66 | 6:1bcfda49e146 | 25 | float LEFT_WALL_THRES = 0.46f, RIGHT_WALL_THRES = 0.21f; |
szh66 | 6:1bcfda49e146 | 26 | float SENSOR_ERROR_OFFSET = 0.0f; |
szh66 | 6:1bcfda49e146 | 27 | |
kolanery | 7:7215adbae3da | 28 | |
szh66 | 6:1bcfda49e146 | 29 | float left_speed; |
szh66 | 6:1bcfda49e146 | 30 | float right_speed; |
szh66 | 6:1bcfda49e146 | 31 | float error_p = 0.0f, old_error_p = 0.0f, old_error_d = 0.0f, error_d = 0.0f; |
szh66 | 6:1bcfda49e146 | 32 | float total_error = 0.0f; |
szh66 | 6:1bcfda49e146 | 33 | float P = 18.0f, D = 3.0f; |
kolanery | 4:73510c7fa316 | 34 | |
kolanery | 7:7215adbae3da | 35 | namespace pid_controller { |
kolanery | 7:7215adbae3da | 36 | void navigate() { |
kolanery | 7:7215adbae3da | 37 | bool has_left_wall = leftDiagonalIR.readIR() > LEFT_WALL_THRES; |
kolanery | 7:7215adbae3da | 38 | bool has_right_wall = rightDiagonalIR.readIR() > RIGHT_WALL_THRES; |
kolanery | 7:7215adbae3da | 39 | |
kolanery | 7:7215adbae3da | 40 | if (has_left_wall && has_right_wall) { |
kolanery | 7:7215adbae3da | 41 | if (rightDiagonalIR - RIGHT_WALL_THRES < 0) { |
kolanery | 7:7215adbae3da | 42 | error_p = rightDiagonalIR - RIGHT_WALL_THRES; |
kolanery | 7:7215adbae3da | 43 | } |
kolanery | 7:7215adbae3da | 44 | else if (leftDiagonalIR - LEFT_WALL_THRES < 0) { |
kolanery | 7:7215adbae3da | 45 | error_p = leftDiagonalIR - LEFT_WALL_THRES; |
kolanery | 7:7215adbae3da | 46 | } |
kolanery | 7:7215adbae3da | 47 | else{ |
kolanery | 7:7215adbae3da | 48 | error_p = rightDiagonalIR - leftDiagonalIR; |
kolanery | 7:7215adbae3da | 49 | } |
kolanery | 7:7215adbae3da | 50 | error_d = error_p - old_error_p; |
kolanery | 7:7215adbae3da | 51 | } |
kolanery | 7:7215adbae3da | 52 | else if (has_left_wall) { |
kolanery | 7:7215adbae3da | 53 | error_p = 2 * (LEFT_WALL_THRES - leftDiagonalIR.readIR()); |
kolanery | 7:7215adbae3da | 54 | error_d = error_p - old_error_p; |
kolanery | 7:7215adbae3da | 55 | } |
kolanery | 7:7215adbae3da | 56 | else if (has_right_wall) { |
kolanery | 7:7215adbae3da | 57 | error_p = 2 * (rightDiagonalIR.readIR() - RIGHT_WALL_THRES); |
kolanery | 7:7215adbae3da | 58 | error_d = error_p - old_error_p; |
kolanery | 7:7215adbae3da | 59 | } |
kolanery | 7:7215adbae3da | 60 | else if (!has_left_wall && !has_right_wall) { |
kolanery | 7:7215adbae3da | 61 | error_p = 0; |
kolanery | 7:7215adbae3da | 62 | error_d = 0; |
kolanery | 7:7215adbae3da | 63 | } |
kolanery | 7:7215adbae3da | 64 | total_error = P * error_p + D * (error_d - old_error_d); |
kolanery | 7:7215adbae3da | 65 | old_error_p = error_p; |
kolanery | 7:7215adbae3da | 66 | old_error_d = error_d; |
kolanery | 7:7215adbae3da | 67 | |
kolanery | 7:7215adbae3da | 68 | |
kolanery | 7:7215adbae3da | 69 | if(total_error < 7.5f){ |
kolanery | 7:7215adbae3da | 70 | leftMotor -> speed(MOTOR_BASE_SPEED - total_error); |
kolanery | 7:7215adbae3da | 71 | rightMotor -> speed(MOTOR_BASE_SPEED + total_error); |
kolanery | 7:7215adbae3da | 72 | } |
kolanery | 7:7215adbae3da | 73 | else{ |
kolanery | 7:7215adbae3da | 74 | leftMotor->speed(MOTOR_BASE_SPEED); |
kolanery | 7:7215adbae3da | 75 | rightMotor->speed(MOTOR_BASE_SPEED); |
kolanery | 7:7215adbae3da | 76 | } |
kolanery | 7:7215adbae3da | 77 | } |
kolanery | 7:7215adbae3da | 78 | |
kolanery | 7:7215adbae3da | 79 | // todo |
kolanery | 7:7215adbae3da | 80 | void turn (int dir) { |
kolanery | 7:7215adbae3da | 81 | // https://github.com/austinxiao-ucsd/Falcon-MicroMouse/blob/master/Micromouse_test/drive_control.h |
kolanery | 7:7215adbae3da | 82 | if (TURN_LEFT) { // Flip motor |
kolanery | 7:7215adbae3da | 83 | } |
kolanery | 7:7215adbae3da | 84 | else { // TODO: ... |
kolanery | 7:7215adbae3da | 85 | } |
kolanery | 7:7215adbae3da | 86 | } |
kolanery | 7:7215adbae3da | 87 | } |
kolanery | 7:7215adbae3da | 88 | |
kolanery | 0:cb667de3a336 | 89 | // Currently only have the x, y position fields for |
kolanery | 0:cb667de3a336 | 90 | // each cell. |
kolanery | 0:cb667de3a336 | 91 | DriveControl::DriveControl (int start_x, int start_y) { |
kolanery | 0:cb667de3a336 | 92 | curr_cell = new Cell (start_x, start_y); |
kolanery | 2:619b02232144 | 93 | leftMotor= new LeftMotor(); |
kolanery | 2:619b02232144 | 94 | rightMotor = new RightMotor(); |
kolanery | 0:cb667de3a336 | 95 | } |
kolanery | 0:cb667de3a336 | 96 | |
kolanery | 0:cb667de3a336 | 97 | // Defines the next cell to traverse. |
kolanery | 0:cb667de3a336 | 98 | Cell * next_cell() { |
kolanery | 0:cb667de3a336 | 99 | return curr_cell; |
kolanery | 0:cb667de3a336 | 100 | } |
kolanery | 0:cb667de3a336 | 101 | |
kolanery | 0:cb667de3a336 | 102 | void DriveControl::turn_left() { |
kolanery | 0:cb667de3a336 | 103 | // TODO: Add PID Control |
kolanery | 7:7215adbae3da | 104 | pid_controller::turn(TURN_LEFT); |
kolanery | 0:cb667de3a336 | 105 | } |
kolanery | 0:cb667de3a336 | 106 | |
kolanery | 0:cb667de3a336 | 107 | int DriveControl::get_next_direction() { |
kolanery | 0:cb667de3a336 | 108 | // TODO: Define the direction based on heuristic eval. |
kolanery | 0:cb667de3a336 | 109 | return 1; |
kolanery | 0:cb667de3a336 | 110 | } |
kolanery | 0:cb667de3a336 | 111 | |
kolanery | 0:cb667de3a336 | 112 | int DriveControl::get_next_state(int state) { |
kolanery | 2:619b02232144 | 113 | // Simply drives the mouse for testing |
kolanery | 2:619b02232144 | 114 | return DRIVE; |
kolanery | 0:cb667de3a336 | 115 | } |
kolanery | 0:cb667de3a336 | 116 | |
kolanery | 0:cb667de3a336 | 117 | void DriveControl::turn_right() { |
kolanery | 4:73510c7fa316 | 118 | // TODO: Add PID Control |
kolanery | 7:7215adbae3da | 119 | pid_controller::turn(TURN_RIGHT); |
kolanery | 7:7215adbae3da | 120 | } |
kolanery | 7:7215adbae3da | 121 | |
kolanery | 7:7215adbae3da | 122 | void DriveControl::turn_around() { |
kolanery | 7:7215adbae3da | 123 | // TODO: Add PID Control |
kolanery | 7:7215adbae3da | 124 | pid_controller::turn(TURN_AROUND); |
kolanery | 0:cb667de3a336 | 125 | } |
kolanery | 0:cb667de3a336 | 126 | |
kolanery | 0:cb667de3a336 | 127 | void DriveControl::stop() { |
kolanery | 2:619b02232144 | 128 | leftMotor->stop(); |
kolanery | 2:619b02232144 | 129 | rightMotor->stop(); |
kolanery | 0:cb667de3a336 | 130 | } |
kolanery | 0:cb667de3a336 | 131 | |
kolanery | 7:7215adbae3da | 132 | void DriveControl::drive_forward() { |
kolanery | 7:7215adbae3da | 133 | pid_controller::navigate(); |
kolanery | 4:73510c7fa316 | 134 | } |
kolanery | 4:73510c7fa316 | 135 | |
kolanery | 0:cb667de3a336 | 136 | |
kolanery | 7:7215adbae3da | 137 | // TODO: Test top right ir sensor |
kolanery | 0:cb667de3a336 | 138 | bool DriveControl::has_front_wall() { |
kolanery | 7:7215adbae3da | 139 | return rightFrontIR > FRONT_SENSOR_THRESHOLD; |
kolanery | 0:cb667de3a336 | 140 | } |
kolanery | 0:cb667de3a336 | 141 | |
kolanery | 0:cb667de3a336 | 142 | bool DriveControl::has_left_wall() { |
kolanery | 0:cb667de3a336 | 143 | return leftIR < SENSOR_THRESHOLD; |
kolanery | 0:cb667de3a336 | 144 | } |
kolanery | 0:cb667de3a336 | 145 | |
kolanery | 0:cb667de3a336 | 146 | bool DriveControl::has_right_wall() { |
kolanery | 0:cb667de3a336 | 147 | return rightIR < SENSOR_THRESHOLD; |
kolanery | 0:cb667de3a336 | 148 | } |