Improve the Control App Part 2
Congratulations if you have made it this far.
Up until now, we have mainly used the camera of the robot to check for hats, but in a more complex and dangerous environment we don’t want our little guy bumping into things. We want to detect obstacles and avoid them.
Head back to your DevSpaces Tab and here is a new code drop for you. We now add a second function which will navigate the robot around an obstacle.
-
It use the distance sensor to navigate around obstacles
-
Puts the code to drive around obstacles in the function
bypass_obstacle()
-
Creates some more parameters to test, optimize and tune different values in your code
Add the new "bypass_obstacle()" function
Below the new function def search_for_hat:
add this function (as usual check you identation)
# Check for an obstacle directly in front and bypass it, if existing
def bypass_obstacle():
# Determine if an obstacle is in sight
obstacle_in_sight = distance_int() <= min_distance_to_obstacle
# Only continue if an obstacle is ahead
if not obstacle_in_sight:
print ('No obstacle close enough -> returning')
return
# For debugging only
take_picture('static/current_view.jpg')
# Determine distance to obstacle
distance_to_object = distance_int()
print('### Bypass Obstacle Mode - START ###')
# Turn left
turn_left(angle_delta)
# Determine if there is another obstacle is in sight
obstacle_in_sight = distance_int() <= min_distance_to_obstacle
print ('Got distance -> ', distance())
# If no other obstacle is in the bypass direction, move a bit forward
# and then go back again on course
if not obstacle_in_sight:
move_forward(20)
turn_right(angle_delta)
# Determine if original obsctacle is still in sight (after having turned back in original direction)
obstacle_in_sight = distance_int() <= min_distance_to_obstacle
print ('Got distance -> ', distance())
# If original obstacle is not in sight anymore, move forward to bypass it
if not obstacle_in_sight:
# Move forward using the original distance to the obstacle and a buffer
move_forward(math.ceil(distance_to_object / 10) + 40)
print('### Bypass Obstacle Mode - END: SUCCESS! ###')
First test the new obstacle avoidance code by commenting out the function search_for_hat())
from the startRobot()
function and adding the bypass_obstacle()
function like so:
log_with_timestamp("startRobot thread has started.")
global hat_found_and_intercepted
hat_found_and_intercepted = False
while thread_event.is_set() and not hat_found_and_intercepted:
# Check for an obstacle directly in front and bypass it, if existing
bypass_obstacle()
# Search for the hat and intercept it
# search_for_hat()
log_with_timestamp("Exited main control loop.")
Give the code a try. Place a barrier in front of the robot and test the object avoidance code.
Try to change some of the value parameters and see if you can tune the performance of your robot.
Putting it together
You should by now have tested both functions, so it’s time to combine both functions into one main loop that continuously checks for obstacles and hats. The robot has to:
-
navigate around a barrier
-
find the hat and drive towards it
You have worked enough with the code to tackle this without a lot of instructions. Go on and try it out!