svoe
Dependencies: mbed mbed-STM32F103C8T6 MPU6050_1
Diff: motion.h
- Branch:
- svoe
- Revision:
- 22:14e85f2068c7
- Parent:
- 20:e73f49ba5001
- Child:
- 23:bc05a104be10
--- a/motion.h Sat Mar 23 16:39:46 2019 +0000 +++ b/motion.h Tue Jul 23 12:55:23 2019 +0000 @@ -5,6 +5,7 @@ bool tupic = 0; //int corrected_obstacle [100]; bool infinite_flag = 0; +int fail_counter = 0; /*void go(float distance_m, bool brake = 1){ target.path = current.path + distance_m; @@ -14,23 +15,32 @@ // wifi.printf("%.2f %.2f %.2f %.2f;",target_path,current_path,target_path,current_speed);} }*/ -void correct_obstacle(){ +void correct_obstacle(){ //gabariti for(int point = 0;point <= 12;point ++){ - corrected_obstacle[point] = obstacle[point]; + gabarit_obstacle[point] = obstacle[point]; } for(int point = 0;point <= 12;point ++){ for(int test_point = 0;test_point <= 12;test_point ++){ switch(abs(test_point - point)){ - case 1: if((obstacle[test_point] < 60) && (obstacle[test_point] < obstacle[point])) corrected_obstacle[point] = obstacle[test_point]; break; - case 2: if((obstacle[test_point] < 30) && (obstacle[test_point] < obstacle[point])) corrected_obstacle[point] = 0.85 * obstacle[test_point];break; - case 3: if((obstacle[test_point] < 20) && (obstacle[test_point] < obstacle[point])) corrected_obstacle[point] = 0.7 * obstacle[test_point];break; - case 4: if((obstacle[test_point] < 18) && (obstacle[test_point] < obstacle[point])) corrected_obstacle[point] = 0.5 * obstacle[test_point];break; + case 1: if((obstacle[test_point] < 60) && (obstacle[test_point] < obstacle[point])) gabarit_obstacle[point] = obstacle[test_point]; break; + case 2: if((obstacle[test_point] < 30) && (obstacle[test_point] < obstacle[point])) gabarit_obstacle[point] = 0.85 * obstacle[test_point];break; + case 3: if((obstacle[test_point] < 20) && (obstacle[test_point] < obstacle[point])) gabarit_obstacle[point] = 0.7 * obstacle[test_point];break; + case 4: if((obstacle[test_point] < 18) && (obstacle[test_point] < obstacle[point])) gabarit_obstacle[point] = 0.5 * obstacle[test_point];break; } } } /*for(int i = 0;i <= 12;i++){ obstacle[i] = corrected_obstacle[i]; }*/ + for(int point = 0;point <= 12;point ++){ + corrected_obstacle[point] = 0; + float tm = 0; + for(int test_point = 0;test_point <= 12;test_point ++){ + corrected_obstacle[point] += gabarit_obstacle[test_point]/(abs(point-test_point)+1); + tm += 1.0/(abs(point-test_point)+1); + } + corrected_obstacle[point] /= tm; + } } @@ -40,25 +50,28 @@ if((corrected_obstacle[point]<min_dist) && (corrected_obstacle[point] > 0)) {min_dist=corrected_obstacle[point];min_dist_angle = point*15-90;} if(corrected_obstacle[point]>max_dist) {max_dist=corrected_obstacle[point];max_dist_angle = point*15-90;} } + if (max_dist > 300) max_dist = 300; if (min_dist > 10) { - float tm = max_dist - 30; if (tm > 0.5) tm = 0.5; + float tm = float(max_dist - 30) / 100; //if (tm > 0.5) tm = 0.5; target.azimuth = current.azimuth + (max_dist_angle)/57.3; if (current.azimuth > pi) current.azimuth -= 2*pi; if (current.azimuth < -pi) current.azimuth += 2*pi; target.x = current.x + cos(target.azimuth) * tm;//(max_dist - 200); target.y = current.y + sin(target.azimuth) * tm;//(max_dist - 200); target.path = current.path + tm; + timeout_counter = 250; } else if(min_dist > 0){ target.azimuth = current.azimuth + (min_dist_angle-15)/57.3 ; if (current.azimuth > pi) current.azimuth -= 2*pi; if (current.azimuth < -pi) current.azimuth += 2*pi; target.x = current.x - 0.01*(cos(target.azimuth) * 20);//(max_dist - 200); target.y = current.y - 0.01*(sin(target.azimuth) * 20);//(max_dist - 200); target.path = current.path - 0.2; + timeout_counter = 250; } delta.path = target.path - current.path; delta.azimuth = target.azimuth - current.azimuth; if(delta.azimuth > pi) delta.azimuth -= 2*pi; if(delta.azimuth < -pi) delta.azimuth += 2*pi; delta.x = target.x - current.x; delta.y = target.y - current.y; if (delta.path > 0) target.dir = 1; else target.dir = 0; - wifi.printf("!***==========***!\r\n"); + //wifi.printf("!***==========***!\r\n"); } void vstavai(){ @@ -72,7 +85,56 @@ set_motor_speed(0,0); target.x = current.x; target.y = current.y; + target.path = current.path; target.azimuth = current.azimuth; + fail_counter++; + } + +void free_walk(){ + if (motion_mode == GO){ + if (timeout_counter-- == 0) { + target.path = current.path - 0.2; + timeout_counter = 250; + } + } + + if (delay_counter-- == 3) { + glaz.startContinuous(100); + echo_start(); + } + if (delay_counter == 0) { + if(motion_mode > STOP) {if(coord_ready) {motion_mode++;if (motion_mode > GO) motion_mode = STOP; delay2_counter = 15;}} + else{ + if (delay2_counter > 0) delay2_counter--;//delay before full stop and scan + else{ + obstacle_glaz[serva_counter] = glaz.read()/10;//cm //Function + glaz.stopContinuous(); + obstacle_echo[serva_counter] = echo_cm; + if ((obstacle_glaz[serva_counter] > obstacle_echo[serva_counter]) && (obstacle_echo[serva_counter] < 100)) + obstacle[serva_counter] = obstacle_echo[serva_counter]; + else obstacle[serva_counter] = obstacle_glaz[serva_counter]; + if(serva_counter < 12)serva(-90 + (serva_counter++)*15); + else{ + serva_counter = 0; + serva(-90); + correct_obstacle(); + analyze_obstacle(); + echo_transmit(13); + //wifi.putc(current.x * 10); wifi.putc(current.y * 10); wifi.putc(current.azimuth * 40); wifi.putc(target.x * 10); wifi.putc(target.y * 10); wifi.putc(target.azimuth * 40); + motion_mode = ROTATE; + //motion_timeout = 250; + //wait(2); + } + } + } + delay_counter = 7; + } + + } + +void motion_1D(){ + static int k; + if (k++ > 2400) k = 0; else { target.path = traj_1D[int(k/200)];} } /*if (max_dist < 0.3) tupic = 1;