Navigate to a given point using the OGM and virtual forces
Dependencies: ISR_Mini-explorer mbed
Fork of VirtualForces by
main.cpp@10:a7fd80e79e80, 2017-03-27 (annotated)
- Committer:
- geotsam
- Date:
- Mon Mar 27 16:31:41 2017 +0000
- Revision:
- 10:a7fd80e79e80
- Parent:
- 9:b7138acdf4ac
deleted theta from function inputs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
geotsam | 0:8bffb51cc345 | 1 | #include "mbed.h" |
geotsam | 0:8bffb51cc345 | 2 | #include "robot.h" // Initializes the robot. This include should be used in all main.cpp! |
geotsam | 0:8bffb51cc345 | 3 | #include "math.h" |
AurelienBernier | 6:afde4b08166b | 4 | |
AurelienBernier | 6:afde4b08166b | 5 | Timer t; |
AurelienBernier | 4:8c56c3ba6e54 | 6 | |
geotsam | 0:8bffb51cc345 | 7 | float dist(float robot_x, float robot_y, float target_x, float target_y); |
geotsam | 10:a7fd80e79e80 | 8 | int goToPointWithAngle(float target_x, float target_y, float target_angle); |
AurelienBernier | 8:109314be5b68 | 9 | |
AurelienBernier | 8:109314be5b68 | 10 | float alpha; //angle error |
AurelienBernier | 8:109314be5b68 | 11 | float rho; //distance from target |
AurelienBernier | 8:109314be5b68 | 12 | float beta; |
AurelienBernier | 8:109314be5b68 | 13 | //float k_linear=10, k_angular=200; |
AurelienBernier | 8:109314be5b68 | 14 | //kb = -15 and ka = 30 tabom |
AurelienBernier | 8:109314be5b68 | 15 | float kRho=12, ka=30, kb=-13; |
AurelienBernier | 8:109314be5b68 | 16 | float linear, angular, angular_left, angular_right; |
AurelienBernier | 8:109314be5b68 | 17 | float dt=0.5; |
AurelienBernier | 8:109314be5b68 | 18 | float temp; |
AurelienBernier | 8:109314be5b68 | 19 | float d2; |
AurelienBernier | 8:109314be5b68 | 20 | |
geotsam | 10:a7fd80e79e80 | 21 | float map[40][40]; |
geotsam | 10:a7fd80e79e80 | 22 | |
AurelienBernier | 8:109314be5b68 | 23 | //Diameter of a wheel and distance between the 2 |
AurelienBernier | 8:109314be5b68 | 24 | float r=3.25, b=7.2; |
AurelienBernier | 8:109314be5b68 | 25 | |
AurelienBernier | 8:109314be5b68 | 26 | int speed=999; // Max speed at beggining of movement |
AurelienBernier | 8:109314be5b68 | 27 | |
AurelienBernier | 8:109314be5b68 | 28 | //Target example x,y values |
AurelienBernier | 8:109314be5b68 | 29 | float target_x=46.8, target_y=78.6, target_angle=1.7; |
AurelienBernier | 8:109314be5b68 | 30 | |
AurelienBernier | 4:8c56c3ba6e54 | 31 | //Timeout time; |
geotsam | 0:8bffb51cc345 | 32 | int main(){ |
AurelienBernier | 2:ea61e801e81f | 33 | initRobot(); //Initializing the robot |
geotsam | 0:8bffb51cc345 | 34 | pc.baud(9600); // baud for the pc communication |
geotsam | 0:8bffb51cc345 | 35 | |
AurelienBernier | 2:ea61e801e81f | 36 | //Resetting coordinates before moving |
AurelienBernier | 2:ea61e801e81f | 37 | theta=0; |
geotsam | 0:8bffb51cc345 | 38 | X=0; |
geotsam | 0:8bffb51cc345 | 39 | Y=0; |
geotsam | 0:8bffb51cc345 | 40 | |
AurelienBernier | 4:8c56c3ba6e54 | 41 | alpha = atan2((target_y-Y),(target_x-X))-theta; |
AurelienBernier | 4:8c56c3ba6e54 | 42 | alpha = atan(sin(alpha)/cos(alpha)); |
AurelienBernier | 4:8c56c3ba6e54 | 43 | rho = dist(X, Y, target_x, target_y); |
AurelienBernier | 6:afde4b08166b | 44 | |
AurelienBernier | 4:8c56c3ba6e54 | 45 | beta = -alpha-theta+target_angle; |
AurelienBernier | 6:afde4b08166b | 46 | //beta = atan(sin(beta)/cos(beta)); |
AurelienBernier | 8:109314be5b68 | 47 | |
AurelienBernier | 8:109314be5b68 | 48 | goToPointWithAngle(target_x, target_y, target_angle); |
AurelienBernier | 8:109314be5b68 | 49 | |
AurelienBernier | 8:109314be5b68 | 50 | //Stop at the end |
AurelienBernier | 8:109314be5b68 | 51 | leftMotor(1,0); |
AurelienBernier | 8:109314be5b68 | 52 | rightMotor(1,0); |
AurelienBernier | 8:109314be5b68 | 53 | |
AurelienBernier | 8:109314be5b68 | 54 | pc.printf("\n\r %f -- arrived!", rho); |
AurelienBernier | 8:109314be5b68 | 55 | } |
AurelienBernier | 8:109314be5b68 | 56 | |
AurelienBernier | 8:109314be5b68 | 57 | //Distance computation function |
AurelienBernier | 8:109314be5b68 | 58 | float dist(float robot_x, float robot_y, float target_x, float target_y){ |
AurelienBernier | 8:109314be5b68 | 59 | return sqrt(pow(target_y-robot_y,2) + pow(target_x-robot_x,2)); |
AurelienBernier | 8:109314be5b68 | 60 | } |
AurelienBernier | 8:109314be5b68 | 61 | |
geotsam | 10:a7fd80e79e80 | 62 | int goToPointWithAngle(float target_x, float target_y, float target_angle) { |
AurelienBernier | 8:109314be5b68 | 63 | do { |
geotsam | 0:8bffb51cc345 | 64 | pc.printf("\n\n\r entered while"); |
AurelienBernier | 2:ea61e801e81f | 65 | |
AurelienBernier | 6:afde4b08166b | 66 | //Timer stuff |
AurelienBernier | 6:afde4b08166b | 67 | dt = t.read(); |
AurelienBernier | 6:afde4b08166b | 68 | t.reset(); |
AurelienBernier | 6:afde4b08166b | 69 | t.start(); |
AurelienBernier | 6:afde4b08166b | 70 | |
AurelienBernier | 2:ea61e801e81f | 71 | //Updating X,Y and theta with the odometry values |
geotsam | 0:8bffb51cc345 | 72 | Odometria(); |
geotsam | 3:1e0f4cb93eda | 73 | |
AurelienBernier | 4:8c56c3ba6e54 | 74 | alpha = atan2((target_y-Y),(target_x-X))-theta; |
AurelienBernier | 4:8c56c3ba6e54 | 75 | alpha = atan(sin(alpha)/cos(alpha)); |
AurelienBernier | 4:8c56c3ba6e54 | 76 | rho = dist(X, Y, target_x, target_y); |
AurelienBernier | 6:afde4b08166b | 77 | d2 = rho; |
AurelienBernier | 5:dea05b8f30d0 | 78 | beta = -alpha-theta+target_angle; |
AurelienBernier | 6:afde4b08166b | 79 | //beta = atan(sin(beta)/cos(beta)); |
AurelienBernier | 6:afde4b08166b | 80 | |
AurelienBernier | 6:afde4b08166b | 81 | |
AurelienBernier | 2:ea61e801e81f | 82 | //Computing angle error and distance towards the target value |
AurelienBernier | 4:8c56c3ba6e54 | 83 | rho += dt*(-kRho*cos(alpha)*rho); |
AurelienBernier | 4:8c56c3ba6e54 | 84 | temp = alpha; |
AurelienBernier | 6:afde4b08166b | 85 | alpha += dt*(kRho*sin(alpha)-ka*alpha-kb*beta); |
AurelienBernier | 6:afde4b08166b | 86 | beta += dt*(-kRho*sin(temp)); |
AurelienBernier | 6:afde4b08166b | 87 | pc.printf("\n\r d2=%f", d2); |
AurelienBernier | 6:afde4b08166b | 88 | pc.printf("\n\r dt=%f", dt); |
geotsam | 0:8bffb51cc345 | 89 | |
AurelienBernier | 2:ea61e801e81f | 90 | //Computing linear and angular velocities |
AurelienBernier | 4:8c56c3ba6e54 | 91 | if(alpha>=-1.5708 && alpha<=1.5708){ |
AurelienBernier | 4:8c56c3ba6e54 | 92 | linear=kRho*rho; |
AurelienBernier | 4:8c56c3ba6e54 | 93 | angular=ka*alpha+kb*beta; |
geotsam | 3:1e0f4cb93eda | 94 | } |
geotsam | 3:1e0f4cb93eda | 95 | else{ |
AurelienBernier | 4:8c56c3ba6e54 | 96 | linear=-kRho*rho; |
AurelienBernier | 4:8c56c3ba6e54 | 97 | angular=-ka*alpha-kb*beta; |
geotsam | 3:1e0f4cb93eda | 98 | } |
geotsam | 0:8bffb51cc345 | 99 | angular_left=(linear-0.5*b*angular)/r; |
geotsam | 0:8bffb51cc345 | 100 | angular_right=(linear+0.5*b*angular)/r; |
geotsam | 0:8bffb51cc345 | 101 | |
AurelienBernier | 2:ea61e801e81f | 102 | //Slowing down at the end for more precision |
AurelienBernier | 6:afde4b08166b | 103 | if (d2<25) { |
AurelienBernier | 6:afde4b08166b | 104 | speed = d2*30; |
geotsam | 0:8bffb51cc345 | 105 | } |
AurelienBernier | 2:ea61e801e81f | 106 | |
AurelienBernier | 2:ea61e801e81f | 107 | //Normalize speed for motors |
geotsam | 0:8bffb51cc345 | 108 | if(angular_left>angular_right) { |
geotsam | 0:8bffb51cc345 | 109 | angular_right=speed*angular_right/angular_left; |
geotsam | 0:8bffb51cc345 | 110 | angular_left=speed; |
geotsam | 0:8bffb51cc345 | 111 | } else { |
geotsam | 0:8bffb51cc345 | 112 | angular_left=speed*angular_left/angular_right; |
geotsam | 0:8bffb51cc345 | 113 | angular_right=speed; |
geotsam | 0:8bffb51cc345 | 114 | } |
geotsam | 0:8bffb51cc345 | 115 | |
geotsam | 0:8bffb51cc345 | 116 | pc.printf("\n\r X=%f", X); |
geotsam | 0:8bffb51cc345 | 117 | pc.printf("\n\r Y=%f", Y); |
geotsam | 0:8bffb51cc345 | 118 | |
AurelienBernier | 2:ea61e801e81f | 119 | //Updating motor velocities |
AurelienBernier | 1:f0807d5c5a4b | 120 | leftMotor(1,angular_left); |
AurelienBernier | 1:f0807d5c5a4b | 121 | rightMotor(1,angular_right); |
geotsam | 0:8bffb51cc345 | 122 | |
AurelienBernier | 7:c94070f9af78 | 123 | wait(0.2); |
AurelienBernier | 6:afde4b08166b | 124 | //Timer stuff |
AurelienBernier | 6:afde4b08166b | 125 | t.stop(); |
AurelienBernier | 7:c94070f9af78 | 126 | } while(d2>1); |
AurelienBernier | 8:109314be5b68 | 127 | |
AurelienBernier | 8:109314be5b68 | 128 | return 0; |
AurelienBernier | 6:afde4b08166b | 129 | } |