João Pedro Castilho
/
Lab4
main.cpp@0:0d3a25d4697e, 2021-05-27 (annotated)
- Committer:
- ccpjboss
- Date:
- Thu May 27 08:53:19 2021 +0000
- Revision:
- 0:0d3a25d4697e
tet
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ccpjboss | 0:0d3a25d4697e | 1 | #include "mbed.h" |
ccpjboss | 0:0d3a25d4697e | 2 | #include "BufferedSerial.h" |
ccpjboss | 0:0d3a25d4697e | 3 | #include "rplidar.h" |
ccpjboss | 0:0d3a25d4697e | 4 | #include "Robot.h" |
ccpjboss | 0:0d3a25d4697e | 5 | #include "Communication.h" |
ccpjboss | 0:0d3a25d4697e | 6 | |
ccpjboss | 0:0d3a25d4697e | 7 | #define D_EIXO 14.05 // Distancia entre rodas |
ccpjboss | 0:0d3a25d4697e | 8 | #define D_RODA 7.0 // Raio da roda ( cm ) |
ccpjboss | 0:0d3a25d4697e | 9 | #define KV 10.0 //uperior a zero |
ccpjboss | 0:0d3a25d4697e | 10 | #define KS 70.0 //superior a KV |
ccpjboss | 0:0d3a25d4697e | 11 | #define KI 0.05 // superior a KV |
ccpjboss | 0:0d3a25d4697e | 12 | #define D_ERRO 0.5 // cm |
ccpjboss | 0:0d3a25d4697e | 13 | #define MAX_SPEED 70.0 |
ccpjboss | 0:0d3a25d4697e | 14 | #define MIN_MAX_SPEED 70.0 |
ccpjboss | 0:0d3a25d4697e | 15 | #define MIN_SPEED 50.0 |
ccpjboss | 0:0d3a25d4697e | 16 | #define DIST_STOP 8.0 |
ccpjboss | 0:0d3a25d4697e | 17 | |
ccpjboss | 0:0d3a25d4697e | 18 | // Mapa |
ccpjboss | 0:0d3a25d4697e | 19 | #define D_QUAD 5.0 // tamanho do quadrado ... cm |
ccpjboss | 0:0d3a25d4697e | 20 | #define D_JANELA 70.0 // tamanho da janela ... cm (tem de ser multiplo impar de D_QUAD) |
ccpjboss | 0:0d3a25d4697e | 21 | #define D_MAPAX 200.0 // comprimento mapa em x ... cm |
ccpjboss | 0:0d3a25d4697e | 22 | #define D_MAPAY 200.0 // comprimento mapa em y ... cm |
ccpjboss | 0:0d3a25d4697e | 23 | #define MAPBUFFER 5.0 // buffer de 5cm para cada direcao |
ccpjboss | 0:0d3a25d4697e | 24 | |
ccpjboss | 0:0d3a25d4697e | 25 | double PI_val = 3.14159265358979323846f; |
ccpjboss | 0:0d3a25d4697e | 26 | |
ccpjboss | 0:0d3a25d4697e | 27 | // Configuracao GPIO |
ccpjboss | 0:0d3a25d4697e | 28 | DigitalIn mybutton(USER_BUTTON); |
ccpjboss | 0:0d3a25d4697e | 29 | |
ccpjboss | 0:0d3a25d4697e | 30 | // Configuracao comunicacao |
ccpjboss | 0:0d3a25d4697e | 31 | Serial bt(PA_0, PA_1, 38400); // Bluetooth |
ccpjboss | 0:0d3a25d4697e | 32 | Serial pc(SERIAL_TX, SERIAL_RX, 115200); // USB |
ccpjboss | 0:0d3a25d4697e | 33 | |
ccpjboss | 0:0d3a25d4697e | 34 | // Lidar |
ccpjboss | 0:0d3a25d4697e | 35 | RPLidar lidar; |
ccpjboss | 0:0d3a25d4697e | 36 | BufferedSerial se_lidar(PA_9, PA_10); |
ccpjboss | 0:0d3a25d4697e | 37 | PwmOut rplidar_motor(D3); |
ccpjboss | 0:0d3a25d4697e | 38 | struct RPLidarMeasurement data; |
ccpjboss | 0:0d3a25d4697e | 39 | double lidar_angle, lidar_dist; |
ccpjboss | 0:0d3a25d4697e | 40 | double lidar_distMin = 7.5f; |
ccpjboss | 0:0d3a25d4697e | 41 | double lidar_distMax = 200.0f; |
ccpjboss | 0:0d3a25d4697e | 42 | double offSetLidarX = -2.8, offSetLidarY = -1.5, lidar_angRet = 1.1*PI_val/180.0; |
ccpjboss | 0:0d3a25d4697e | 43 | double lidar_angleCs, lidar_angleSn, tMaxX, tMaxY, tDeltaX, tDeltaY; |
ccpjboss | 0:0d3a25d4697e | 44 | int stepX, stepY; |
ccpjboss | 0:0d3a25d4697e | 45 | double angDif, posDifX, posDifY; |
ccpjboss | 0:0d3a25d4697e | 46 | |
ccpjboss | 0:0d3a25d4697e | 47 | |
ccpjboss | 0:0d3a25d4697e | 48 | // Dados a modificar |
ccpjboss | 0:0d3a25d4697e | 49 | double pos_x[] = {30.0f,130.0f,30.0f,30.0f}; |
ccpjboss | 0:0d3a25d4697e | 50 | double pos_y[] = {30.0f,130.0f,130.0f,30.0f}; |
ccpjboss | 0:0d3a25d4697e | 51 | double THETA_Start = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 52 | |
ccpjboss | 0:0d3a25d4697e | 53 | // Periodos |
ccpjboss | 0:0d3a25d4697e | 54 | int T_printOdo = 250; int flag_printOdo = 1; // Periodo para print da odometria |
ccpjboss | 0:0d3a25d4697e | 55 | int T_upOdo = 10; // Periodo para update dos Encoders |
ccpjboss | 0:0d3a25d4697e | 56 | |
ccpjboss | 0:0d3a25d4697e | 57 | // Variaveis Globais |
ccpjboss | 0:0d3a25d4697e | 58 | float X = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 59 | float Y = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 60 | float THETA = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 61 | double delta_D = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 62 | double delta_TH = 0.0f; |
ccpjboss | 0:0d3a25d4697e | 63 | double goal_x, goal_y; |
ccpjboss | 0:0d3a25d4697e | 64 | double v, w, phi, racio, df, delta_theta; |
ccpjboss | 0:0d3a25d4697e | 65 | double DR_cm, DL_cm; |
ccpjboss | 0:0d3a25d4697e | 66 | int lastEncR = -1, lastEncL = -1, cont, pos_cont = 1; |
ccpjboss | 0:0d3a25d4697e | 67 | int w_e, w_d, dir_e, dir_d, sw_e, sw_d; |
ccpjboss | 0:0d3a25d4697e | 68 | int size_pos; |
ccpjboss | 0:0d3a25d4697e | 69 | bool running = true; |
ccpjboss | 0:0d3a25d4697e | 70 | double thetaCs, thetaSn; |
ccpjboss | 0:0d3a25d4697e | 71 | |
ccpjboss | 0:0d3a25d4697e | 72 | // Mapa |
ccpjboss | 0:0d3a25d4697e | 73 | double fca = 30; double fcr = 2000; |
ccpjboss | 0:0d3a25d4697e | 74 | float mapa[42][42]; |
ccpjboss | 0:0d3a25d4697e | 75 | int t_mapax = floor((D_MAPAX + MAPBUFFER*2.0)/D_QUAD); |
ccpjboss | 0:0d3a25d4697e | 76 | int t_mapay = floor((D_MAPAY + MAPBUFFER*2.0)/D_QUAD); |
ccpjboss | 0:0d3a25d4697e | 77 | int xa, ya, x_janela, y_janela; |
ccpjboss | 0:0d3a25d4697e | 78 | double frx, fry, da, delta_dax, delta_day, T_JANELA = D_JANELA/D_QUAD; // tamanho da janela em quadrados (janela) ; |
ccpjboss | 0:0d3a25d4697e | 79 | double delta_fx, delta_fy, fax, fay, Fx, Fy, x_prox, y_prox; |
ccpjboss | 0:0d3a25d4697e | 80 | double erro, erro_int = 0; |
ccpjboss | 0:0d3a25d4697e | 81 | int X_ind, Y_ind; |
ccpjboss | 0:0d3a25d4697e | 82 | double exp_mapa; |
ccpjboss | 0:0d3a25d4697e | 83 | |
ccpjboss | 0:0d3a25d4697e | 84 | // Obstaculos |
ccpjboss | 0:0d3a25d4697e | 85 | double obstX, obstY; |
ccpjboss | 0:0d3a25d4697e | 86 | int obstX_ind, obstY_ind; |
ccpjboss | 0:0d3a25d4697e | 87 | |
ccpjboss | 0:0d3a25d4697e | 88 | // Tempos |
ccpjboss | 0:0d3a25d4697e | 89 | uint32_t last_printOdo = 0, now_time = 0; // Referencia do ultimo print |
ccpjboss | 0:0d3a25d4697e | 90 | uint32_t last_upOdo = 0, t_control = 0; // Referencia do ultimo print |
ccpjboss | 0:0d3a25d4697e | 91 | uint32_t last_upMap = 0, t_map = 0; // Referencia do ultimo updateMap |
ccpjboss | 0:0d3a25d4697e | 92 | uint32_t start_upLid = 0; // Referencia do ultimo print |
ccpjboss | 0:0d3a25d4697e | 93 | uint32_t last_printMap =0; |
ccpjboss | 0:0d3a25d4697e | 94 | Timer t; // Variavel print |
ccpjboss | 0:0d3a25d4697e | 95 | |
ccpjboss | 0:0d3a25d4697e | 96 | // Declaracao de funcoes |
ccpjboss | 0:0d3a25d4697e | 97 | void start_system(); |
ccpjboss | 0:0d3a25d4697e | 98 | void lidar_setUp(); |
ccpjboss | 0:0d3a25d4697e | 99 | int check_enc(); |
ccpjboss | 0:0d3a25d4697e | 100 | void wait_user(); |
ccpjboss | 0:0d3a25d4697e | 101 | void print_odo(); |
ccpjboss | 0:0d3a25d4697e | 102 | void update_goal(); |
ccpjboss | 0:0d3a25d4697e | 103 | void update_odo(); |
ccpjboss | 0:0d3a25d4697e | 104 | void update_map(int, int); |
ccpjboss | 0:0d3a25d4697e | 105 | void update_control(); |
ccpjboss | 0:0d3a25d4697e | 106 | void update_vel(double v, double w); |
ccpjboss | 0:0d3a25d4697e | 107 | void update_pos(); |
ccpjboss | 0:0d3a25d4697e | 108 | void check_error(); |
ccpjboss | 0:0d3a25d4697e | 109 | void shutdown_system(); |
ccpjboss | 0:0d3a25d4697e | 110 | void print_mapa(); |
ccpjboss | 0:0d3a25d4697e | 111 | |
ccpjboss | 0:0d3a25d4697e | 112 | int main(){ |
ccpjboss | 0:0d3a25d4697e | 113 | size_pos = sizeof(pos_x)/sizeof(pos_x[0]); |
ccpjboss | 0:0d3a25d4697e | 114 | const double v = 175; |
ccpjboss | 0:0d3a25d4697e | 115 | const double w = 4.5; |
ccpjboss | 0:0d3a25d4697e | 116 | |
ccpjboss | 0:0d3a25d4697e | 117 | start_system(); |
ccpjboss | 0:0d3a25d4697e | 118 | update_vel(v,w); |
ccpjboss | 0:0d3a25d4697e | 119 | |
ccpjboss | 0:0d3a25d4697e | 120 | /*while(running) { |
ccpjboss | 0:0d3a25d4697e | 121 | now_time = t.read_ms(); |
ccpjboss | 0:0d3a25d4697e | 122 | t_control = now_time - last_upOdo; |
ccpjboss | 0:0d3a25d4697e | 123 | if( t_control >= T_upOdo){ |
ccpjboss | 0:0d3a25d4697e | 124 | if(check_enc()){ |
ccpjboss | 0:0d3a25d4697e | 125 | update_odo(); |
ccpjboss | 0:0d3a25d4697e | 126 | update_pos(); |
ccpjboss | 0:0d3a25d4697e | 127 | update_map(2, 2); |
ccpjboss | 0:0d3a25d4697e | 128 | update_control(); |
ccpjboss | 0:0d3a25d4697e | 129 | update_vel(); |
ccpjboss | 0:0d3a25d4697e | 130 | check_error(); |
ccpjboss | 0:0d3a25d4697e | 131 | last_upOdo = now_time; |
ccpjboss | 0:0d3a25d4697e | 132 | } |
ccpjboss | 0:0d3a25d4697e | 133 | } |
ccpjboss | 0:0d3a25d4697e | 134 | |
ccpjboss | 0:0d3a25d4697e | 135 | now_time = t.read_ms(); |
ccpjboss | 0:0d3a25d4697e | 136 | if((now_time - last_printOdo >= T_printOdo) && (flag_printOdo)){ |
ccpjboss | 0:0d3a25d4697e | 137 | print_odo(); |
ccpjboss | 0:0d3a25d4697e | 138 | last_printOdo = now_time; |
ccpjboss | 0:0d3a25d4697e | 139 | } |
ccpjboss | 0:0d3a25d4697e | 140 | }*/ |
ccpjboss | 0:0d3a25d4697e | 141 | //shutdown_system(); |
ccpjboss | 0:0d3a25d4697e | 142 | } |
ccpjboss | 0:0d3a25d4697e | 143 | |
ccpjboss | 0:0d3a25d4697e | 144 | void update_goal(){ |
ccpjboss | 0:0d3a25d4697e | 145 | goal_x = pos_x[pos_cont] + MAPBUFFER; |
ccpjboss | 0:0d3a25d4697e | 146 | goal_y = pos_y[pos_cont] + MAPBUFFER; |
ccpjboss | 0:0d3a25d4697e | 147 | pos_cont++; |
ccpjboss | 0:0d3a25d4697e | 148 | } |
ccpjboss | 0:0d3a25d4697e | 149 | |
ccpjboss | 0:0d3a25d4697e | 150 | void start_system(){ |
ccpjboss | 0:0d3a25d4697e | 151 | init_communication(&pc); |
ccpjboss | 0:0d3a25d4697e | 152 | |
ccpjboss | 0:0d3a25d4697e | 153 | X = pos_x[0] + MAPBUFFER; |
ccpjboss | 0:0d3a25d4697e | 154 | Y = pos_y[0] + MAPBUFFER; |
ccpjboss | 0:0d3a25d4697e | 155 | THETA = THETA_Start; |
ccpjboss | 0:0d3a25d4697e | 156 | |
ccpjboss | 0:0d3a25d4697e | 157 | update_goal(); |
ccpjboss | 0:0d3a25d4697e | 158 | |
ccpjboss | 0:0d3a25d4697e | 159 | pc.printf("Robo Speed to Zero...\n"); |
ccpjboss | 0:0d3a25d4697e | 160 | setSpeeds(0, 0); |
ccpjboss | 0:0d3a25d4697e | 161 | pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 162 | |
ccpjboss | 0:0d3a25d4697e | 163 | pc.printf("Initiating Lidar...\n"); |
ccpjboss | 0:0d3a25d4697e | 164 | lidar_setUp(); |
ccpjboss | 0:0d3a25d4697e | 165 | pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 166 | |
ccpjboss | 0:0d3a25d4697e | 167 | wait_user(); |
ccpjboss | 0:0d3a25d4697e | 168 | |
ccpjboss | 0:0d3a25d4697e | 169 | pc.printf("START\n"); |
ccpjboss | 0:0d3a25d4697e | 170 | pc.printf("LAB3\n"); |
ccpjboss | 0:0d3a25d4697e | 171 | pc.printf("VFF\n"); |
ccpjboss | 0:0d3a25d4697e | 172 | |
ccpjboss | 0:0d3a25d4697e | 173 | char str[100], str2[10]; |
ccpjboss | 0:0d3a25d4697e | 174 | for(int posInt = 1; posInt < size_pos; posInt++){ |
ccpjboss | 0:0d3a25d4697e | 175 | sprintf(str2,"/%.2f/%2.f", pos_x[posInt], pos_y[posInt]); |
ccpjboss | 0:0d3a25d4697e | 176 | strcat(str, str2); |
ccpjboss | 0:0d3a25d4697e | 177 | } |
ccpjboss | 0:0d3a25d4697e | 178 | pc.printf("%.2f/%.2f/%.2f%s/%.2f/%.2f/%.2f/%.2f/%.2f/%.2f \n", pos_x[0], pos_y[0], THETA_Start, str, KV, KS, KI, DIST_STOP, fca, fcr); |
ccpjboss | 0:0d3a25d4697e | 179 | |
ccpjboss | 0:0d3a25d4697e | 180 | pc.printf("BEGIN\n"); |
ccpjboss | 0:0d3a25d4697e | 181 | |
ccpjboss | 0:0d3a25d4697e | 182 | pc.printf("Lidar Speed to 100%%...\n"); |
ccpjboss | 0:0d3a25d4697e | 183 | //rplidar_motor.write(0.35f); |
ccpjboss | 0:0d3a25d4697e | 184 | //pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 185 | |
ccpjboss | 0:0d3a25d4697e | 186 | pc.printf("Stabilizing for 0.7 Second...\n"); |
ccpjboss | 0:0d3a25d4697e | 187 | wait(0.7); |
ccpjboss | 0:0d3a25d4697e | 188 | pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 189 | |
ccpjboss | 0:0d3a25d4697e | 190 | pc.printf("Reseting Encoders...\n"); |
ccpjboss | 0:0d3a25d4697e | 191 | getCountsAndReset(); |
ccpjboss | 0:0d3a25d4697e | 192 | pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 193 | |
ccpjboss | 0:0d3a25d4697e | 194 | print_odo(); |
ccpjboss | 0:0d3a25d4697e | 195 | |
ccpjboss | 0:0d3a25d4697e | 196 | t.start(); |
ccpjboss | 0:0d3a25d4697e | 197 | |
ccpjboss | 0:0d3a25d4697e | 198 | pc.printf("Updating Map with 250 Measures...\n"); |
ccpjboss | 0:0d3a25d4697e | 199 | last_upMap = t.read_ms(); |
ccpjboss | 0:0d3a25d4697e | 200 | //update_map(2, 700); |
ccpjboss | 0:0d3a25d4697e | 201 | t_map = t.read_ms() - last_upMap; |
ccpjboss | 0:0d3a25d4697e | 202 | pc.printf(" Done! %f\n", t_map/250.0); |
ccpjboss | 0:0d3a25d4697e | 203 | } |
ccpjboss | 0:0d3a25d4697e | 204 | |
ccpjboss | 0:0d3a25d4697e | 205 | void lidar_setUp(){ |
ccpjboss | 0:0d3a25d4697e | 206 | // Lidar initialization |
ccpjboss | 0:0d3a25d4697e | 207 | |
ccpjboss | 0:0d3a25d4697e | 208 | rplidar_motor.period(0.01f); |
ccpjboss | 0:0d3a25d4697e | 209 | lidar.begin(se_lidar); |
ccpjboss | 0:0d3a25d4697e | 210 | lidar.setAngle(0,360); |
ccpjboss | 0:0d3a25d4697e | 211 | lidar.startThreadScan(); |
ccpjboss | 0:0d3a25d4697e | 212 | rplidar_motor.write(0.0f); |
ccpjboss | 0:0d3a25d4697e | 213 | } |
ccpjboss | 0:0d3a25d4697e | 214 | |
ccpjboss | 0:0d3a25d4697e | 215 | int check_enc(){ |
ccpjboss | 0:0d3a25d4697e | 216 | |
ccpjboss | 0:0d3a25d4697e | 217 | getCountsAndReset(); // Obtem encoder e reset encoder |
ccpjboss | 0:0d3a25d4697e | 218 | //pc.printf("%d %d ", countsRight, countsLeft); |
ccpjboss | 0:0d3a25d4697e | 219 | if(!(abs(countsRight) == 1 && countsLeft == 255)){ |
ccpjboss | 0:0d3a25d4697e | 220 | lastEncR = countsRight; |
ccpjboss | 0:0d3a25d4697e | 221 | lastEncL = countsLeft; |
ccpjboss | 0:0d3a25d4697e | 222 | //pc.printf("|1| %d %d\n\r", countsRight, countsLeft); |
ccpjboss | 0:0d3a25d4697e | 223 | return 1; |
ccpjboss | 0:0d3a25d4697e | 224 | }else{ |
ccpjboss | 0:0d3a25d4697e | 225 | if(lastEncR == -1 && lastEncL == -1){ |
ccpjboss | 0:0d3a25d4697e | 226 | //pc.printf("|2| %d %d\n\r", countsRight, countsLeft); |
ccpjboss | 0:0d3a25d4697e | 227 | return 0; |
ccpjboss | 0:0d3a25d4697e | 228 | }else{ |
ccpjboss | 0:0d3a25d4697e | 229 | countsRight = lastEncR; |
ccpjboss | 0:0d3a25d4697e | 230 | countsLeft = lastEncL; |
ccpjboss | 0:0d3a25d4697e | 231 | //pc.printf("|3| %d %d\n\r", countsRight, countsLeft); |
ccpjboss | 0:0d3a25d4697e | 232 | return 1; |
ccpjboss | 0:0d3a25d4697e | 233 | } |
ccpjboss | 0:0d3a25d4697e | 234 | } |
ccpjboss | 0:0d3a25d4697e | 235 | } |
ccpjboss | 0:0d3a25d4697e | 236 | |
ccpjboss | 0:0d3a25d4697e | 237 | void update_odo(){ |
ccpjboss | 0:0d3a25d4697e | 238 | |
ccpjboss | 0:0d3a25d4697e | 239 | DR_cm = (double)countsRight * ((D_RODA*PI_val)/1440.0); |
ccpjboss | 0:0d3a25d4697e | 240 | DL_cm = (double)countsLeft * ((D_RODA*PI_val)/1440.0); |
ccpjboss | 0:0d3a25d4697e | 241 | |
ccpjboss | 0:0d3a25d4697e | 242 | delta_D = (DR_cm + DL_cm)/2.0; |
ccpjboss | 0:0d3a25d4697e | 243 | delta_TH = (DR_cm - DL_cm)/D_EIXO; |
ccpjboss | 0:0d3a25d4697e | 244 | delta_TH = atan2(sin(delta_TH), cos(delta_TH)); |
ccpjboss | 0:0d3a25d4697e | 245 | } |
ccpjboss | 0:0d3a25d4697e | 246 | |
ccpjboss | 0:0d3a25d4697e | 247 | void update_pos(){ |
ccpjboss | 0:0d3a25d4697e | 248 | if(delta_TH == 0){ |
ccpjboss | 0:0d3a25d4697e | 249 | X = X + delta_D * cos(THETA); |
ccpjboss | 0:0d3a25d4697e | 250 | Y = Y + delta_D * sin(THETA); |
ccpjboss | 0:0d3a25d4697e | 251 | }else{ |
ccpjboss | 0:0d3a25d4697e | 252 | X = X + delta_D*sin(delta_TH/2.0)*cos(THETA+delta_TH/2.0)/(delta_TH/2.0); |
ccpjboss | 0:0d3a25d4697e | 253 | Y = Y + delta_D*sin(delta_TH/2.0)*sin(THETA+delta_TH/2.0)/(delta_TH/2.0); |
ccpjboss | 0:0d3a25d4697e | 254 | THETA += delta_TH; |
ccpjboss | 0:0d3a25d4697e | 255 | THETA = atan2(sin(THETA), cos(THETA)); |
ccpjboss | 0:0d3a25d4697e | 256 | } |
ccpjboss | 0:0d3a25d4697e | 257 | } |
ccpjboss | 0:0d3a25d4697e | 258 | |
ccpjboss | 0:0d3a25d4697e | 259 | void update_map(int update_mode, int qnt){ |
ccpjboss | 0:0d3a25d4697e | 260 | // update_mode = 1 -> Timer |
ccpjboss | 0:0d3a25d4697e | 261 | // update_mode = 2 -> Contador |
ccpjboss | 0:0d3a25d4697e | 262 | |
ccpjboss | 0:0d3a25d4697e | 263 | X_ind = (int)floor(X/D_QUAD); // Indice célula posicao X |
ccpjboss | 0:0d3a25d4697e | 264 | Y_ind = (int)floor(Y/D_QUAD); // Indice célula posicao Y |
ccpjboss | 0:0d3a25d4697e | 265 | |
ccpjboss | 0:0d3a25d4697e | 266 | thetaCs = cos(THETA); |
ccpjboss | 0:0d3a25d4697e | 267 | thetaSn = sin(THETA); |
ccpjboss | 0:0d3a25d4697e | 268 | mapa[X_ind][Y_ind] -= 0.65; // Posição inicial está livre |
ccpjboss | 0:0d3a25d4697e | 269 | |
ccpjboss | 0:0d3a25d4697e | 270 | cont = 0; |
ccpjboss | 0:0d3a25d4697e | 271 | start_upLid = t.read_ms(); |
ccpjboss | 0:0d3a25d4697e | 272 | while((cont < qnt)){ |
ccpjboss | 0:0d3a25d4697e | 273 | if(lidar.pollSensorData(&data)==0){ |
ccpjboss | 0:0d3a25d4697e | 274 | X_ind = (int)floor(X/D_QUAD); // Indice célula posicao X |
ccpjboss | 0:0d3a25d4697e | 275 | Y_ind = (int)floor(Y/D_QUAD); // Indice célula posicao Y |
ccpjboss | 0:0d3a25d4697e | 276 | |
ccpjboss | 0:0d3a25d4697e | 277 | lidar_dist = (double) data.distance/10.0; |
ccpjboss | 0:0d3a25d4697e | 278 | lidar_angle = (double) data.angle; |
ccpjboss | 0:0d3a25d4697e | 279 | if((lidar_dist > lidar_distMin) && (lidar_dist < lidar_distMax)){ |
ccpjboss | 0:0d3a25d4697e | 280 | |
ccpjboss | 0:0d3a25d4697e | 281 | lidar_angle = lidar_angle*PI_val/180.0 ; |
ccpjboss | 0:0d3a25d4697e | 282 | |
ccpjboss | 0:0d3a25d4697e | 283 | obstX = X + offSetLidarX*thetaCs - offSetLidarY*thetaSn - lidar_dist*sin(lidar_angRet - THETA + lidar_angle); |
ccpjboss | 0:0d3a25d4697e | 284 | obstY = Y + offSetLidarY*thetaCs + offSetLidarX*thetaSn - lidar_dist*cos(lidar_angRet - THETA + lidar_angle); |
ccpjboss | 0:0d3a25d4697e | 285 | |
ccpjboss | 0:0d3a25d4697e | 286 | posDifX = obstX - X; |
ccpjboss | 0:0d3a25d4697e | 287 | posDifY = obstY - Y; |
ccpjboss | 0:0d3a25d4697e | 288 | angDif = atan2(posDifY, posDifX); |
ccpjboss | 0:0d3a25d4697e | 289 | lidar_angleCs = cos(angDif); |
ccpjboss | 0:0d3a25d4697e | 290 | lidar_angleSn = sin(angDif); |
ccpjboss | 0:0d3a25d4697e | 291 | |
ccpjboss | 0:0d3a25d4697e | 292 | obstX_ind = (int)floor(obstX/D_QUAD); |
ccpjboss | 0:0d3a25d4697e | 293 | obstY_ind = (int)floor(obstY/D_QUAD); |
ccpjboss | 0:0d3a25d4697e | 294 | |
ccpjboss | 0:0d3a25d4697e | 295 | if(obstX < X){ |
ccpjboss | 0:0d3a25d4697e | 296 | stepX = -1; |
ccpjboss | 0:0d3a25d4697e | 297 | }else{ |
ccpjboss | 0:0d3a25d4697e | 298 | stepX = 1; |
ccpjboss | 0:0d3a25d4697e | 299 | } |
ccpjboss | 0:0d3a25d4697e | 300 | if(obstY < Y){ |
ccpjboss | 0:0d3a25d4697e | 301 | stepY = -1; |
ccpjboss | 0:0d3a25d4697e | 302 | }else{ |
ccpjboss | 0:0d3a25d4697e | 303 | stepY = 1; |
ccpjboss | 0:0d3a25d4697e | 304 | } |
ccpjboss | 0:0d3a25d4697e | 305 | |
ccpjboss | 0:0d3a25d4697e | 306 | tMaxX = X; |
ccpjboss | 0:0d3a25d4697e | 307 | tMaxY = Y; |
ccpjboss | 0:0d3a25d4697e | 308 | |
ccpjboss | 0:0d3a25d4697e | 309 | while(1){ |
ccpjboss | 0:0d3a25d4697e | 310 | // tDeltaX = (abs(((X_ind+1*(stepX>0))*D_QUAD) - tMaxX))/lidar_angleCs; |
ccpjboss | 0:0d3a25d4697e | 311 | // tDeltaY = (abs(((Y_ind+1*(stepY>0))*D_QUAD) - tMaxY))/lidar_angleSn; |
ccpjboss | 0:0d3a25d4697e | 312 | |
ccpjboss | 0:0d3a25d4697e | 313 | tDeltaX = (X_ind+1*(stepX>0))*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 314 | tDeltaY = (Y_ind+1*(stepY>0))*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 315 | tDeltaX = abs(tDeltaX - tMaxX); |
ccpjboss | 0:0d3a25d4697e | 316 | tDeltaY = abs(tDeltaY - tMaxY); |
ccpjboss | 0:0d3a25d4697e | 317 | tDeltaX = (tDeltaX)/lidar_angleCs; |
ccpjboss | 0:0d3a25d4697e | 318 | tDeltaY = (tDeltaY)/lidar_angleSn; |
ccpjboss | 0:0d3a25d4697e | 319 | |
ccpjboss | 0:0d3a25d4697e | 320 | if(abs(tDeltaX) < abs(tDeltaY)){ |
ccpjboss | 0:0d3a25d4697e | 321 | X_ind += stepX; |
ccpjboss | 0:0d3a25d4697e | 322 | tMaxX = (X_ind+1*(stepX<0))*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 323 | tMaxY += tDeltaX*lidar_angleSn*stepX; |
ccpjboss | 0:0d3a25d4697e | 324 | }else{ |
ccpjboss | 0:0d3a25d4697e | 325 | Y_ind += stepY; |
ccpjboss | 0:0d3a25d4697e | 326 | tMaxY = (Y_ind+1*(stepY<0))*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 327 | tMaxX += tDeltaY*lidar_angleCs*stepY; |
ccpjboss | 0:0d3a25d4697e | 328 | } |
ccpjboss | 0:0d3a25d4697e | 329 | //pc.printf("%d %d\n\r", X_ind, Y_ind); |
ccpjboss | 0:0d3a25d4697e | 330 | if((X_ind >= 0) && (X_ind < t_mapax) && (Y_ind >= 0) && (Y_ind < t_mapay)){ |
ccpjboss | 0:0d3a25d4697e | 331 | if(X_ind == obstX_ind && Y_ind == obstY_ind){ |
ccpjboss | 0:0d3a25d4697e | 332 | mapa[X_ind][Y_ind] += 0.65; |
ccpjboss | 0:0d3a25d4697e | 333 | //pc.printf("break\n\r"); |
ccpjboss | 0:0d3a25d4697e | 334 | break; |
ccpjboss | 0:0d3a25d4697e | 335 | //}else if(X_ind == 0 || Y_ind == 0 || X_ind == t_mapax-1 || Y_ind == t_mapay-1 ){ |
ccpjboss | 0:0d3a25d4697e | 336 | // mapa[X_ind][Y_ind] += 0.65; |
ccpjboss | 0:0d3a25d4697e | 337 | }else{ |
ccpjboss | 0:0d3a25d4697e | 338 | //pc.printf("livre\n\r"); |
ccpjboss | 0:0d3a25d4697e | 339 | mapa[X_ind][Y_ind] -= 0.65; |
ccpjboss | 0:0d3a25d4697e | 340 | } |
ccpjboss | 0:0d3a25d4697e | 341 | }else{ |
ccpjboss | 0:0d3a25d4697e | 342 | break; |
ccpjboss | 0:0d3a25d4697e | 343 | } |
ccpjboss | 0:0d3a25d4697e | 344 | } |
ccpjboss | 0:0d3a25d4697e | 345 | //pc.printf("%d\n",cont); |
ccpjboss | 0:0d3a25d4697e | 346 | cont++; |
ccpjboss | 0:0d3a25d4697e | 347 | } |
ccpjboss | 0:0d3a25d4697e | 348 | } |
ccpjboss | 0:0d3a25d4697e | 349 | } |
ccpjboss | 0:0d3a25d4697e | 350 | } |
ccpjboss | 0:0d3a25d4697e | 351 | |
ccpjboss | 0:0d3a25d4697e | 352 | void update_control(){ |
ccpjboss | 0:0d3a25d4697e | 353 | xa = (int)floor(X/D_QUAD); // Indice célula posicao X |
ccpjboss | 0:0d3a25d4697e | 354 | ya = (int)floor(Y/D_QUAD); // Indice célula posicao Y |
ccpjboss | 0:0d3a25d4697e | 355 | |
ccpjboss | 0:0d3a25d4697e | 356 | frx = 0; fry = 0; |
ccpjboss | 0:0d3a25d4697e | 357 | x_janela = xa - floor(T_JANELA/2.0); |
ccpjboss | 0:0d3a25d4697e | 358 | for(int i = 0; i < T_JANELA; i++){ |
ccpjboss | 0:0d3a25d4697e | 359 | y_janela = ya - floor(T_JANELA/2.0); |
ccpjboss | 0:0d3a25d4697e | 360 | for(int j = 0; j < T_JANELA; j++){ |
ccpjboss | 0:0d3a25d4697e | 361 | |
ccpjboss | 0:0d3a25d4697e | 362 | if((x_janela >= 0) && (x_janela < t_mapax) && (y_janela >= 0) && (y_janela < t_mapay)){ |
ccpjboss | 0:0d3a25d4697e | 363 | |
ccpjboss | 0:0d3a25d4697e | 364 | delta_dax = x_janela*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 365 | delta_day = y_janela*D_QUAD; |
ccpjboss | 0:0d3a25d4697e | 366 | |
ccpjboss | 0:0d3a25d4697e | 367 | if(X >= delta_dax+D_QUAD){ |
ccpjboss | 0:0d3a25d4697e | 368 | delta_dax = delta_dax+D_QUAD-X; |
ccpjboss | 0:0d3a25d4697e | 369 | }else{ |
ccpjboss | 0:0d3a25d4697e | 370 | delta_dax = delta_dax-X; |
ccpjboss | 0:0d3a25d4697e | 371 | } |
ccpjboss | 0:0d3a25d4697e | 372 | |
ccpjboss | 0:0d3a25d4697e | 373 | if(Y >= delta_day+D_QUAD){ |
ccpjboss | 0:0d3a25d4697e | 374 | delta_day = delta_day+D_QUAD-Y; |
ccpjboss | 0:0d3a25d4697e | 375 | }else{ |
ccpjboss | 0:0d3a25d4697e | 376 | delta_day = delta_day-Y; |
ccpjboss | 0:0d3a25d4697e | 377 | } |
ccpjboss | 0:0d3a25d4697e | 378 | |
ccpjboss | 0:0d3a25d4697e | 379 | if(delta_dax == 0){ |
ccpjboss | 0:0d3a25d4697e | 380 | delta_dax = 0.1; |
ccpjboss | 0:0d3a25d4697e | 381 | } |
ccpjboss | 0:0d3a25d4697e | 382 | if(delta_day == 0){ |
ccpjboss | 0:0d3a25d4697e | 383 | delta_day = 0.1; |
ccpjboss | 0:0d3a25d4697e | 384 | } |
ccpjboss | 0:0d3a25d4697e | 385 | |
ccpjboss | 0:0d3a25d4697e | 386 | exp_mapa = 1-(1/(1+exp(mapa[x_janela][y_janela]))); |
ccpjboss | 0:0d3a25d4697e | 387 | if(exp_mapa <= 0.5){ |
ccpjboss | 0:0d3a25d4697e | 388 | exp_mapa = 0; |
ccpjboss | 0:0d3a25d4697e | 389 | } |
ccpjboss | 0:0d3a25d4697e | 390 | |
ccpjboss | 0:0d3a25d4697e | 391 | da = sqrt(pow(delta_dax,2)+pow(delta_day,2)); |
ccpjboss | 0:0d3a25d4697e | 392 | frx += fcr*exp_mapa*delta_dax/pow(da,3); |
ccpjboss | 0:0d3a25d4697e | 393 | fry += fcr*exp_mapa*delta_day/pow(da,3); |
ccpjboss | 0:0d3a25d4697e | 394 | } |
ccpjboss | 0:0d3a25d4697e | 395 | y_janela ++; |
ccpjboss | 0:0d3a25d4697e | 396 | } |
ccpjboss | 0:0d3a25d4697e | 397 | x_janela ++; |
ccpjboss | 0:0d3a25d4697e | 398 | } |
ccpjboss | 0:0d3a25d4697e | 399 | |
ccpjboss | 0:0d3a25d4697e | 400 | delta_fx = goal_x-X; |
ccpjboss | 0:0d3a25d4697e | 401 | delta_fy = goal_y-Y; |
ccpjboss | 0:0d3a25d4697e | 402 | |
ccpjboss | 0:0d3a25d4697e | 403 | df = sqrt(pow(delta_fx,2)+pow(delta_fy,2)); |
ccpjboss | 0:0d3a25d4697e | 404 | |
ccpjboss | 0:0d3a25d4697e | 405 | fax = fca*delta_fx/df; |
ccpjboss | 0:0d3a25d4697e | 406 | fay = fca*delta_fy/df; |
ccpjboss | 0:0d3a25d4697e | 407 | |
ccpjboss | 0:0d3a25d4697e | 408 | Fx = fax - frx; |
ccpjboss | 0:0d3a25d4697e | 409 | Fy = fay - fry; |
ccpjboss | 0:0d3a25d4697e | 410 | |
ccpjboss | 0:0d3a25d4697e | 411 | x_prox = X + Fx; |
ccpjboss | 0:0d3a25d4697e | 412 | y_prox = Y + Fy; |
ccpjboss | 0:0d3a25d4697e | 413 | |
ccpjboss | 0:0d3a25d4697e | 414 | erro = sqrt(pow(x_prox-X,2)+pow(y_prox-Y,2))-D_ERRO; |
ccpjboss | 0:0d3a25d4697e | 415 | erro_int = erro_int + erro; |
ccpjboss | 0:0d3a25d4697e | 416 | |
ccpjboss | 0:0d3a25d4697e | 417 | phi = atan2((y_prox-Y), (x_prox-X)); |
ccpjboss | 0:0d3a25d4697e | 418 | delta_theta = atan2(sin(phi - THETA), cos(phi - THETA)); |
ccpjboss | 0:0d3a25d4697e | 419 | |
ccpjboss | 0:0d3a25d4697e | 420 | v = KV*erro+KI*erro_int; |
ccpjboss | 0:0d3a25d4697e | 421 | w = KS*delta_theta; |
ccpjboss | 0:0d3a25d4697e | 422 | } |
ccpjboss | 0:0d3a25d4697e | 423 | |
ccpjboss | 0:0d3a25d4697e | 424 | void update_vel(double v, double w){ |
ccpjboss | 0:0d3a25d4697e | 425 | |
ccpjboss | 0:0d3a25d4697e | 426 | w_e = (v-(D_EIXO/2.0)*w)/(D_RODA/2.0); |
ccpjboss | 0:0d3a25d4697e | 427 | w_d = (v+(D_EIXO/2.0)*w)/(D_RODA/2.0); |
ccpjboss | 0:0d3a25d4697e | 428 | |
ccpjboss | 0:0d3a25d4697e | 429 | sw_e = w_e; |
ccpjboss | 0:0d3a25d4697e | 430 | sw_d = w_d; |
ccpjboss | 0:0d3a25d4697e | 431 | |
ccpjboss | 0:0d3a25d4697e | 432 | if(abs(w_e) > MAX_SPEED || abs(w_d) > MAX_SPEED){ |
ccpjboss | 0:0d3a25d4697e | 433 | racio = fabs((double)w_e/w_d); |
ccpjboss | 0:0d3a25d4697e | 434 | |
ccpjboss | 0:0d3a25d4697e | 435 | if( w_e < 0 ) dir_e = -1; else dir_e = 1; |
ccpjboss | 0:0d3a25d4697e | 436 | if( w_d < 0 ) dir_d = -1; else dir_d = 1; |
ccpjboss | 0:0d3a25d4697e | 437 | |
ccpjboss | 0:0d3a25d4697e | 438 | if(fabs(racio) >= 1.0){ |
ccpjboss | 0:0d3a25d4697e | 439 | sw_e = dir_e*MAX_SPEED; |
ccpjboss | 0:0d3a25d4697e | 440 | sw_d = dir_d*MAX_SPEED/racio; |
ccpjboss | 0:0d3a25d4697e | 441 | }else{ |
ccpjboss | 0:0d3a25d4697e | 442 | sw_e = dir_e*MAX_SPEED*racio; |
ccpjboss | 0:0d3a25d4697e | 443 | sw_d = dir_d*MAX_SPEED; |
ccpjboss | 0:0d3a25d4697e | 444 | } |
ccpjboss | 0:0d3a25d4697e | 445 | } |
ccpjboss | 0:0d3a25d4697e | 446 | if(abs(w_e) < MIN_SPEED || abs(w_d) < MIN_SPEED){ |
ccpjboss | 0:0d3a25d4697e | 447 | racio = fabs((double)w_e/w_d); |
ccpjboss | 0:0d3a25d4697e | 448 | |
ccpjboss | 0:0d3a25d4697e | 449 | if( w_e < 0 ) dir_e = -1; else dir_e = 1; |
ccpjboss | 0:0d3a25d4697e | 450 | if( w_d < 0 ) dir_d = -1; else dir_d = 1; |
ccpjboss | 0:0d3a25d4697e | 451 | |
ccpjboss | 0:0d3a25d4697e | 452 | if(fabs(racio) >= 1.0){ |
ccpjboss | 0:0d3a25d4697e | 453 | if(MIN_SPEED*racio <= MIN_MAX_SPEED){ |
ccpjboss | 0:0d3a25d4697e | 454 | sw_e = dir_e*MIN_SPEED*racio; |
ccpjboss | 0:0d3a25d4697e | 455 | sw_d = dir_d*MIN_SPEED; |
ccpjboss | 0:0d3a25d4697e | 456 | } |
ccpjboss | 0:0d3a25d4697e | 457 | }else{ |
ccpjboss | 0:0d3a25d4697e | 458 | if(MIN_SPEED/racio <= MIN_MAX_SPEED){ |
ccpjboss | 0:0d3a25d4697e | 459 | sw_e = dir_e*MIN_SPEED; |
ccpjboss | 0:0d3a25d4697e | 460 | sw_d = dir_d*MIN_SPEED/racio; |
ccpjboss | 0:0d3a25d4697e | 461 | } |
ccpjboss | 0:0d3a25d4697e | 462 | } |
ccpjboss | 0:0d3a25d4697e | 463 | } |
ccpjboss | 0:0d3a25d4697e | 464 | |
ccpjboss | 0:0d3a25d4697e | 465 | setSpeeds(sw_e, sw_d); |
ccpjboss | 0:0d3a25d4697e | 466 | } |
ccpjboss | 0:0d3a25d4697e | 467 | |
ccpjboss | 0:0d3a25d4697e | 468 | void check_error(){ |
ccpjboss | 0:0d3a25d4697e | 469 | if(df > DIST_STOP){ |
ccpjboss | 0:0d3a25d4697e | 470 | running = true; |
ccpjboss | 0:0d3a25d4697e | 471 | }else{ |
ccpjboss | 0:0d3a25d4697e | 472 | if(pos_cont < size_pos){ |
ccpjboss | 0:0d3a25d4697e | 473 | //pc.printf("Goal Completed!\n"); |
ccpjboss | 0:0d3a25d4697e | 474 | //pc.printf("Changing Goal...\n"); |
ccpjboss | 0:0d3a25d4697e | 475 | update_goal(); |
ccpjboss | 0:0d3a25d4697e | 476 | //pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 477 | erro_int = 0; |
ccpjboss | 0:0d3a25d4697e | 478 | running = true; |
ccpjboss | 0:0d3a25d4697e | 479 | }else{ |
ccpjboss | 0:0d3a25d4697e | 480 | running = false; |
ccpjboss | 0:0d3a25d4697e | 481 | } |
ccpjboss | 0:0d3a25d4697e | 482 | } |
ccpjboss | 0:0d3a25d4697e | 483 | } |
ccpjboss | 0:0d3a25d4697e | 484 | |
ccpjboss | 0:0d3a25d4697e | 485 | void print_mapa(){ |
ccpjboss | 0:0d3a25d4697e | 486 | for( int xx = 0; xx < 42; xx++){ |
ccpjboss | 0:0d3a25d4697e | 487 | for( int yy = 0; yy < 42; yy++){ |
ccpjboss | 0:0d3a25d4697e | 488 | pc.printf("%d/%d/%.2f \n",xx,yy,mapa[xx][yy]); |
ccpjboss | 0:0d3a25d4697e | 489 | wait(0.0001); |
ccpjboss | 0:0d3a25d4697e | 490 | } |
ccpjboss | 0:0d3a25d4697e | 491 | } |
ccpjboss | 0:0d3a25d4697e | 492 | } |
ccpjboss | 0:0d3a25d4697e | 493 | |
ccpjboss | 0:0d3a25d4697e | 494 | void print_odo(){ |
ccpjboss | 0:0d3a25d4697e | 495 | pc.printf("%.2f/%.2f/%.2f/%.2f/%.2f \n", X - MAPBUFFER, Y - MAPBUFFER, THETA, x_prox - MAPBUFFER, y_prox - MAPBUFFER); |
ccpjboss | 0:0d3a25d4697e | 496 | } |
ccpjboss | 0:0d3a25d4697e | 497 | |
ccpjboss | 0:0d3a25d4697e | 498 | void wait_user(){ |
ccpjboss | 0:0d3a25d4697e | 499 | pc.printf("Press UserButton to continue...\n"); |
ccpjboss | 0:0d3a25d4697e | 500 | while(mybutton); // Espera por butao USER ser primido |
ccpjboss | 0:0d3a25d4697e | 501 | pc.printf(" Done!\n"); |
ccpjboss | 0:0d3a25d4697e | 502 | } |
ccpjboss | 0:0d3a25d4697e | 503 | |
ccpjboss | 0:0d3a25d4697e | 504 | void shutdown_system(){ |
ccpjboss | 0:0d3a25d4697e | 505 | setSpeeds(0,0); |
ccpjboss | 0:0d3a25d4697e | 506 | |
ccpjboss | 0:0d3a25d4697e | 507 | rplidar_motor.write(0.0f); |
ccpjboss | 0:0d3a25d4697e | 508 | |
ccpjboss | 0:0d3a25d4697e | 509 | print_mapa(); |
ccpjboss | 0:0d3a25d4697e | 510 | pc.printf("END!\n"); |
ccpjboss | 0:0d3a25d4697e | 511 | t.stop(); |
ccpjboss | 0:0d3a25d4697e | 512 | } |