Navigating by Touch
In previous navigation programs, our scripts only made the cyber:bot execute a list of movements predefined by you, the programmer. Now that you can write a script to make the cyber:bot monitor whisker switches and trigger action in response, you can also write a script that lets the cyber:bot drive and select its own maneuver if it bumps into something. This is an example of autonomous robot navigation.
Whisker Navigation Overview
The roaming_with_whiskers.py script makes the cyber:bot go forward while monitoring its whisker inputs, until it encounters an obstacle with one or both of them. As soon as the cyber:bot senses whisker electrical contact, it uses an if…elif…else statement to decide what to do. The decision code checks for various whisker pressed/not pressed combinations, and calls navigation functions to execute back-up-and-turn maneuvers. Then, the cyber:bot resumes forward motion until it bumps into another obstacle.
Example Script: roaming_with_whiskers
Let’s try the script first, and then take a closer look at how it works.
- Open a script you have previously used with the cyber:bot baord, like whiskers_detect_test or cyberbot-template-with-blink.hex.
- Set the project’s name to roaming_with_whiskers, update the script so that it matches the one below, and then click Save.
- Click Send to micro:bit.
- Disconnect the cyber:bot from its programming cable, and set the cyber:bot board’s PWR switch to 2.
- Put the cyber:bot on the floor, and try letting it roam. When it contacts obstacles in its path with its whisker switches, it should back up, turn, and then roam in a new direction.
- Set the cyber:bot board’s PWR switch back to 0 when you are done testing.
# roaming_with_whiskers
from cyberbot import *
def forward():
bot(18).servo_speed(75)
bot(19).servo_speed(-75)
def backwards():
bot(18).servo_speed(-75)
bot(19).servo_speed(75)
sleep(1000)
def right():
bot(18).servo_speed(75)
bot(19).servo_speed(75)
sleep(800)
def left():
bot(18).servo_speed(-75)
bot(19).servo_speed(-75)
sleep(800)
while True:
whisker_left = bot(7).read_digital()
whisker_right = bot(9).read_digital()
if whisker_left == 0 and whisker_right == 0:
backwards()
right()
elif whisker_left == 1 and whisker_right == 0:
backwards()
left()
elif whisker_left == 0 and whisker_right == 1:
backwards()
right()
else:
forward()