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.
Fork of BeautifulMemeProject by
Revision 27:7eb032772bc2, committed 2016-01-31
- Comitter:
- alanmillard
- Date:
- Sun Jan 31 15:14:54 2016 +0000
- Parent:
- 26:3869ae5eddd7
- Commit message:
- Flocking seems to work better now, however the robot controller sometimes "crashes" (unsure why).
Changed in this revision
programs.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/programs.cpp Mon Jan 25 16:36:54 2016 +0000 +++ b/programs.cpp Sun Jan 31 15:14:54 2016 +0000 @@ -728,7 +728,8 @@ /// flocking_program void flocking_program() -{ +{ + char display_line[16] = " "; int average_heading = 0; int number_of_neighbours = 0; int number_of_flocking_headings = 0; @@ -770,9 +771,11 @@ cohesion_vector.distance /= number_of_neighbours; // Normalise obstacle_vector.distance /= sensors_activated; // Normalise + int obstacle_avoidance_angle; + if(sensors_activated > 0) { - int obstacle_avoidance_angle = obstacle_vector.angle + 180; + obstacle_avoidance_angle = obstacle_vector.angle + 180; if(obstacle_avoidance_angle > 180) obstacle_avoidance_angle -= 360; @@ -782,11 +785,13 @@ target_heading += obstacle_avoidance_angle; angles++; } + + int cohesion_angle; // Don't bother performing cohesion if robots are already close enough - if(number_of_neighbours > 0 && cohesion_vector.distance < 400) - { - int cohesion_angle = cohesion_vector.angle; + if(number_of_neighbours > 0 && cohesion_vector.distance < 200) + { + cohesion_angle = cohesion_vector.angle; if(cohesion_angle > 180) cohesion_angle -= 360; @@ -797,11 +802,13 @@ angles++; } + int relative_flocking_heading; + if(number_of_flocking_headings > 0) { average_heading /= number_of_flocking_headings; - int relative_flocking_heading = beacon_heading - average_heading; + relative_flocking_heading = beacon_heading - average_heading; if(relative_flocking_heading > 180) relative_flocking_heading -= 360; @@ -828,12 +835,16 @@ // Only transmit beacon heading if the beacon is visible if(beacon_found) - { + { float degrees_per_value = 256.0f / 360.0f; char beacon_heading_byte = (beacon_heading + 180) * degrees_per_value; // Convert beacon heading from +/-180 degrees into a single byte value bt.putc(beacon_heading_byte); } + + sprintf(display_line, "%d %d %d %d", target_heading, obstacle_avoidance_angle, cohesion_angle, relative_flocking_heading); + + set_program_info(display_line); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////