
svoe
Dependencies: mbed mbed-STM32F103C8T6 MPU6050_1
Revision 23:bc05a104be10, committed 2019-08-06
- Comitter:
- dima285
- Date:
- Tue Aug 06 14:13:55 2019 +0000
- Branch:
- svoe
- Parent:
- 22:14e85f2068c7
- Commit message:
- 06.08.19
Changed in this revision
diff -r 14e85f2068c7 -r bc05a104be10 common.h --- a/common.h Tue Jul 23 12:55:23 2019 +0000 +++ b/common.h Tue Aug 06 14:13:55 2019 +0000 @@ -19,6 +19,8 @@ float const m_inert = 5e-3;//SI float const half_axis = 0.08;//SI float const ppr = 3200;//pulses per revolution +float const deg5_rad = 0.08726646; //5/360*2*pi; //5 gradusov v radianah +float const pi2_byte = 40.743665431; //256/2/pi; struct coord{ float x; //m //vpered @@ -30,6 +32,8 @@ float accel; float eps; bool dir; + int echo_cm; + float echo_azimuth; }; coord current; @@ -73,4 +77,9 @@ #define GO 2 #define ROTATE 1 +bool scan_360_flag; +int scan_360_counter; +int array_360_cm[100]; //full scan array +float array_360_rad[100]; +int echo_delay_counter;
diff -r 14e85f2068c7 -r bc05a104be10 echo.h --- a/echo.h Tue Jul 23 12:55:23 2019 +0000 +++ b/echo.h Tue Aug 06 14:13:55 2019 +0000 @@ -15,6 +15,7 @@ int max_dist_angle; int front_dist; + Timer echo_timer; InterruptIn echo(PB_12); DigitalOut sonar_triger(PB_13); @@ -48,6 +49,10 @@ //for(tmstep = 0; tmstep < steps_number; tmstep ++){wifi.putc((obstacle[tmstep] < 500) ? obstacle[tmstep]/2 : 250);} for(tmstep = 0; tmstep < steps_number; tmstep ++){wifi.putc((corrected_obstacle[tmstep] < 500) ? corrected_obstacle[tmstep]/2 : 250);} } + +void transmit_360(){ + + } void echo_scan(){ // rewrite with argument: n or step //will not work in interrupt ?? serva(-90); @@ -71,9 +76,136 @@ serva(echo_current_step*5-90); echo_start(); //the last to exit ticker interrupt ASAP } + void correct_obstacle(){ //gabariti + for(int point = 0;point <= 12;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])) 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; + } + } + +void correct_obstacle_360(){ //gabariti + int tmtp; + for(int point = 0;point <= 71;point ++){ + gabarit_obstacle[point] = obstacle[point]; + } + for(int point = 0;point <= 71;point ++){ + for(int test_point = point - 12;test_point <= point + 12 ;test_point ++){ + if (test_point < 0) tmtp = 72 + test_point; else tmtp = test_point; + if((obstacle[tmtp] < (half_axis + 0.05) * 100 / sin(abs(tmtp - point) * deg5_rad) && (obstacle[tmtp] < obstacle[point]))){ + gabarit_obstacle[point] = cos(abs(tmtp - point) * deg5_rad) * obstacle[tmtp]; + } + } + } + + for(int point = 0;point <= 71;point ++){ + corrected_obstacle[point] = 0; + float tm = 0; + for(int test_point = 0;test_point <= 71;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; + } + } + + +void analyze_obstacle(){ + min_dist = 400; max_dist = 0; front_dist = corrected_obstacle[6]; + for(int point = 2;point <= 10;point ++){ + 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 = 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"); +} + +void analize_obstacle_360(){ + min_dist = 400; max_dist = 0; front_dist = corrected_obstacle[0]; + for(int point = 0;point <= 71;point ++){ + if((corrected_obstacle[point] < min_dist) && (corrected_obstacle[point] > 0)) {min_dist = corrected_obstacle[point]; min_dist_angle = array_360_rad[point];} + if(corrected_obstacle[point] > max_dist) {max_dist=corrected_obstacle[point]; max_dist_angle = array_360_rad[point];} + } + if (max_dist < 30){/*vse ploho*/} + target.azimuth = max_dist_angle; + target.path = current.path + (max_dist - 30) / 100.0; + } -void echo_full_scan(int steps){ //scan by wheels (calculate speed) + +void rt_scan(){ //realtime scan + int tm_echo; + int tm_glaz; + + tm_glaz = glaz.read()/10;//cm //read glaz + glaz.stopContinuous(); + tm_echo = echo_cm; //read echo + if ((tm_glaz > tm_echo) && (tm_echo < 100)) //echo/glaz selection + current.echo_cm = tm_echo; + else current.echo_cm = tm_glaz; + + glaz.startContinuous(100); //start new measurement + echo_start(); + switch (motion_mode){ //set new coord + case STOP:{break;} + case GO:{break;} + case ROTATE:{ //SCAN 360 + if (scan_360_flag == 1) { + array_360_cm[scan_360_counter] = current.echo_cm; //save current data + array_360_rad[scan_360_counter] = current.azimuth; + target.azimuth = current.azimuth + deg5_rad; //set new azimuth + wifi.putc(current.echo_cm/2); + wifi.putc(current.azimuth * pi2_byte); + if (scan_360_counter++ > 70) { //increment counter + scan_360_counter = 0; //finish scan + scan_360_flag = 0; + correct_obstacle_360(); + analize_obstacle_360(); + } + + } + break;} + } } void glaz_init(){
diff -r 14e85f2068c7 -r bc05a104be10 main.cpp --- a/main.cpp Tue Jul 23 12:55:23 2019 +0000 +++ b/main.cpp Tue Aug 06 14:13:55 2019 +0000 @@ -27,10 +27,12 @@ serva_counter = 0; //wait(20); + while(1){ + //myled = 1; //SMErT' !!!!!!! while(realtime_flag == 0){} - myled = !myled; + //myled = 0; //myled = 0; //inverse connection gyro.read(&gx,&gy,&gz,&ax,&ay,&az); //doesn't work in interrupt // reading - 500 uS ax_filter(); @@ -39,6 +41,7 @@ //balance_coord(); balance_motion_PID(); if(external_command != 0) command_process(); + if (echo_delay_counter++ > 2) {echo_delay_counter = 0; rt_scan();} //echo every 3 csycles free_walk();//motion //motion_1D();
diff -r 14e85f2068c7 -r bc05a104be10 motion.h --- a/motion.h Tue Jul 23 12:55:23 2019 +0000 +++ b/motion.h Tue Aug 06 14:13:55 2019 +0000 @@ -7,6 +7,8 @@ bool infinite_flag = 0; int fail_counter = 0; + + /*void go(float distance_m, bool brake = 1){ target.path = current.path + distance_m; // wifi.printf("%.2f %.2f %.2f %.2f;",target_path,current_path,distance_m,current_speed); @@ -15,64 +17,7 @@ // wifi.printf("%.2f %.2f %.2f %.2f;",target_path,current_path,target_path,current_speed);} }*/ -void correct_obstacle(){ //gabariti - for(int point = 0;point <= 12;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])) 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; - } - } - - -void analyze_obstacle(){ - min_dist = 400; max_dist = 0; front_dist = corrected_obstacle[6]; - for(int point = 2;point <= 10;point ++){ - 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 = 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"); -} + void vstavai(){ //motor_speed[0] = 0; @@ -91,7 +36,30 @@ } void free_walk(){ - if (motion_mode == GO){ + + switch (motion_mode){ + case ROTATE:{ + if(coord_ready && !scan_360_flag) motion_mode = GO; + break;} + case GO:{ + if (timeout_counter-- == 0) { + target.path = current.path - 0.2; + timeout_counter = 250; + } + if (current.echo_cm < 30) target.path = current.path + current.echo_cm/100.0 - 0.15; + if (coord_ready) motion_mode = STOP; + break;} + case STOP:{ + wifi.putc(current.x * 20); wifi.putc(current.y * 20); + scan_360_counter = 0; + scan_360_flag = 1; + motion_mode = ROTATE; + break;} + } + + + + /*if (motion_mode == GO){ if (timeout_counter-- == 0) { target.path = current.path - 0.2; timeout_counter = 250; @@ -128,7 +96,7 @@ } } delay_counter = 7; - } + }*/ }
diff -r 14e85f2068c7 -r bc05a104be10 sound.h --- a/sound.h Tue Jul 23 12:55:23 2019 +0000 +++ b/sound.h Tue Aug 06 14:13:55 2019 +0000 @@ -29,7 +29,7 @@ void voice_command_process(){ if(sound_in.readable()){ - if (myled == 0 ) myled = 1;else myled = 0; + //if (myled == 0 ) myled = 1;else myled = 0; char tmc = sound_in.getc(); wifi.putc(tmc); if (tmc == 0xAA) sound_in_receive_counter = 0; else sound_in_receive_counter++; if(sound_in_receive_counter > 15) sound_in_receive_counter = 15;