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 3875_Individualproject
Diff: main/main.cpp
- Revision:
- 58:cb32aa0f4116
- Parent:
- 57:9f9067e3f99e
- Child:
- 59:11e31ce4d675
--- a/main/main.cpp Sat Apr 18 00:10:25 2020 +0000 +++ b/main/main.cpp Sat Apr 18 17:33:31 2020 +0000 @@ -444,9 +444,9 @@ // if( turn_angle != 180 ) { robot.forward(speed); wait(0.05); } // maybe remove if( turn_angle == 0) { robot.forward(speed); wait(0.1); turn_select('S'); } - else if( turn_angle == 90) { robot.forward(speed); wait(0.02); turn_select('R'); } + else if( turn_angle == 90) { robot.forward(speed); wait(0.03); turn_select('R'); } else if( turn_angle == 180) { turn_select('B'); } - else if( turn_angle == 270) { robot.forward(speed); wait(0.02); turn_select('L'); } + else if( turn_angle == 270) { robot.forward(speed); wait(0.03); turn_select('L'); } } void back_track() @@ -459,7 +459,7 @@ int d_node; // an index to the most recent (desired) node with unexplored paths for(int i = total_points; i >= 0; i--) { // start from the most recently discovered node - if( explored[i] != type[i] ) { + if( explored[i] != type[i] ) { complete = true; d_node = i; break; @@ -689,6 +689,94 @@ // add inverted sub path to the real path and increment the path length by real_len -1 } +void looped_goal_simplification() // change into dead_end_removal and have it take two indexes and a path and return an array +{ + for( int i = 0; i <= path_length; i++ ) { + goal_path1[i] = looped_path[i]; + if( looped_path[i] == 100 ) { goal_length1 = i; break; } + } + + for( int i = path_length; i >= 0; i-- ) { + goal_path2[path_length-i] = looped_path[i]; + if( looped_path[i] == 100 ) { goal_length2 = path_length-i; break; } + } + + int temp_array[100]; + + int i = 0; + while( i <= goal_length1 ) { + int count = i; + for( int j = 0; j <= goal_length1; j++ ) { + if( goal_path1[i] == goal_path1[j] ){ + count = j; + } + } + if( count != i ) { + + for( int k = 0; k <= i; k++ ) { + temp_array[k] = goal_path1[k]; + } + int ind = 1; + for( int z = count+1; z <= goal_length1; z++ ) { + temp_array[i+ind] = goal_path1[z]; + ind++; + } + // clear the array + for( int x = 0; x <= goal_length1; x++ ) { goal_path1[x] = NULL; } + + goal_length1 -= (count-i); + i = -1; + + for( int x = 0; x <= goal_length1; x++ ) { goal_path1[x] = temp_array[x]; } + + for( int x = 0; x <= goal_length1; x++ ) { temp_array[x] = NULL; } + } + i++; + } + + i = 0; + while( i <= goal_length2 ) { + int count = i; + for( int j = 0; j <= goal_length2; j++ ) { + if( goal_path2[i] == goal_path2[j] ){ + count = j; + } + } + if( count != i ) { + + for( int k = 0; k <= i; k++ ) { + temp_array[k] = goal_path2[k]; + } + int ind = 1; + for( int z = count+1; z <= goal_length2; z++ ) { + temp_array[i+ind] = goal_path2[z]; + ind++; + } + // clear the array + for( int x = 0; x <= goal_length2; x++ ) { goal_path2[x] = NULL; } + + goal_length2 -= (count-i); + i = -1; + + for( int x = 0; x <= goal_length2; x++ ) { goal_path2[x] = temp_array[x]; } + + for( int x = 0; x <= goal_length2; x++ ) { temp_array[x] = NULL; } + } + i++; + } + + if( goal_length2 < goal_length1 ) { + for( int x = 0; x <= goal_length1; x++ ) { goal_path1[x] = NULL; } + for( int x = 0; x <= goal_length2; x++ ) { + goal_path1[x] = goal_path2[x]; + } + goal_length1 = goal_length2; + } + + // print these to check + // add inverted sub path to the real path and increment the path length by real_len -1 +} + void follow_line() { robot.scan(); @@ -807,7 +895,7 @@ while (sensor[0] > SENS_THRESH) { robot.scan(); } robot.spin_left(TURN_SPEED); - wait(0.2); + wait(0.25); while (sensor[1] < SENS_THRESH) { robot.scan(); } @@ -821,7 +909,7 @@ while (sensor[4] > SENS_THRESH) { robot.scan(); } robot.spin_right(TURN_SPEED); - wait(0.2); + wait(0.25); while (sensor[3] < SENS_THRESH) { robot.scan(); } @@ -956,30 +1044,151 @@ } } } -} +} void looped_goal() { // return to start (adding nodes to path) // simplify path, check path before reaching goal and path after reaching goal, use the shorter one // loop between start and goal + turn_select('B'); robot.stop(); - bool na = dead_end_removal( point[0], point[total_points] ); - leds = 0b1001; - wait(0.2); - leds = 0b0110; - wait(0.2); - na = dead_end_removal( point[2], point[1] ); - leds = 0b1001; - wait(0.2); - leds = 0b0110; - wait(0.2); - na = dead_end_removal( point[4], 100 ); - while( button_enter.read() == 1 ) { - leds = 0b1001; - wait(0.2); - leds = 0b0110; - wait(0.2); + + if( dir == 'N' ) { dir = 'S'; } + else if( dir == 'S' ) { dir = 'N'; } + else if( dir == 'E' ) { dir = 'W'; } + else if( dir == 'W' ) { dir = 'E'; } + + looped_goal_simplification(); + + bool _switch = true; + + while(1) { + robot.lcd_clear(); + robot.lcd_goto_xy(0,0); + robot.lcd_print(" ENTER ", 10); + robot.lcd_goto_xy(0,1); + robot.lcd_print("=restart", 10); + + while( button_enter.read() == 1 ) { + leds = 0b1001; + wait(0.2); + leds = 0b0110; + wait(0.2); + } + + wait(2); + + t_restart = true; + + goal_path_explored(_switch); + + _switch = ~ _switch; + + while(1) { + + if ( t_restart ){ // only start the timer if it isnt already started + t_coord.start(); + t_restart = false; + + } + + follow_line(); + + if( junction_detect() ) { + float time = t_coord.read(); + int dist_est = ceil(time*2); // scaled so that a longer straight will have a different time to a shorter straight + t_coord.stop(); + t_coord.reset(); + t_restart = true; //restart the timer next loop + + if (dir == 'N'){ curr_coords[1] += dist_est; } // y coord + if (dir == 'E'){ curr_coords[0] += dist_est; } // x coord + if (dir == 'S'){ curr_coords[1] -= dist_est; } + if (dir == 'W'){ curr_coords[0] -= dist_est; } + + update_index(); + choose_turn(); //looks at the point we are at, examines the type vs explored and makes the appropriate turn also updates the explored + + } + + if( _switch == true && point[curr_index] == 100 ) { break; } + else if( _switch == false && point[curr_index] == 0 ) { break; } + } + + robot.stop(); + } +} + +void goal_path_explored( bool inverse ) +{ + char dir_diff; + + if ( inverse == false ) { + for(int j = goal_length1; j >= 0; j--) { + int curr_node = path_to_point_index(goal_path1[j]); + int next_node = path_to_point_index(goal_path2[j-1]); + if(coords_x[next_node] != coords_x[curr_node]) { + if(coords_x[next_node] - coords_x[curr_node] > 0){ + dir_diff = 'E'; + } else { + dir_diff = 'W'; + } + } else if( coords_y[next_node] != coords_y[curr_node] ) { + if(coords_y[next_node] - coords_y[curr_node] > 0){ + dir_diff = 'N'; + } else { + dir_diff = 'S'; + } + } + + if( dir_diff == 'N' ) { + explored[curr_node] &= 0b1011; + } + else if( dir_diff == 'E' ) { + explored[curr_node] &= 0b1101; + } + else if( dir_diff == 'S' ) { + explored[curr_node] &= 0b1110; + } + else if( dir_diff == 'W' ) { + explored[curr_node] &= 0b0111; + } + } + } + + else{ + + for(int j = 0; j <= goal_length1; j++) { + int curr_node = path_to_point_index(goal_path1[j]); + int next_node = path_to_point_index(goal_path2[j+1]); + if(coords_x[next_node] != coords_x[curr_node]) { + if(coords_x[next_node] - coords_x[curr_node] > 0){ + dir_diff = 'E'; + } else { + dir_diff = 'W'; + } + } else if( coords_y[next_node] != coords_y[curr_node] ) { + if(coords_y[next_node] - coords_y[curr_node] > 0){ + dir_diff = 'N'; + } else { + dir_diff = 'S'; + } + } + + if( dir_diff == 'N' ) { + explored[curr_node] &= 0b1011; + } + else if( dir_diff == 'E' ) { + explored[curr_node] &= 0b1101; + } + else if( dir_diff == 'S' ) { + explored[curr_node] &= 0b1110; + } + else if( dir_diff == 'W' ) { + explored[curr_node] &= 0b0111; + } + } } }