2018-03-18 14:23:17 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2018-03-24 19:56:29 +01:00
|
|
|
import ev3dev.ev3 as ev3
|
2018-03-18 14:23:17 +01:00
|
|
|
from wheel import Wheel
|
|
|
|
from sensor import Sensor
|
2018-03-23 19:09:49 +01:00
|
|
|
from odometry import Odometry
|
2018-03-25 15:09:13 +02:00
|
|
|
from planet import Direction
|
|
|
|
from time import sleep
|
2018-03-18 14:23:17 +01:00
|
|
|
|
|
|
|
|
2018-03-23 21:56:54 +01:00
|
|
|
def capat100(value):
|
|
|
|
if(value > 100):
|
|
|
|
return 100
|
|
|
|
elif(value < -100):
|
|
|
|
return -100
|
|
|
|
else:
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
2018-03-18 14:23:17 +01:00
|
|
|
class Move:
|
2018-03-23 21:34:33 +01:00
|
|
|
def __init__(self):
|
2018-03-22 02:14:44 +01:00
|
|
|
try:
|
|
|
|
self._wheel_l = Wheel('outB')
|
|
|
|
self._wheel_r = Wheel('outC')
|
2018-03-22 14:34:55 +01:00
|
|
|
self._sensor = Sensor()
|
2018-03-24 06:09:48 +01:00
|
|
|
self._calibrate()
|
2018-03-22 14:34:55 +01:00
|
|
|
except OSError:
|
|
|
|
print("ERROR: Cannot find Motor/Sensor")
|
2018-03-24 04:43:01 +01:00
|
|
|
self.defaultspeed = 20
|
|
|
|
self._odometry = Odometry()
|
2018-03-23 19:09:49 +01:00
|
|
|
|
2018-03-19 00:44:57 +01:00
|
|
|
'''
|
|
|
|
determine maximum and minimum brightness of lines/white space
|
|
|
|
depending on environment lighting
|
|
|
|
'''
|
2018-03-18 14:23:17 +01:00
|
|
|
def _calibrate(self):
|
2018-03-24 19:56:29 +01:00
|
|
|
ev3.Sound.beep()
|
|
|
|
while(not self._sensor.bumperwaspressed):
|
|
|
|
self._sensor.checkbumper()
|
|
|
|
self._sensor.reset()
|
2018-03-26 03:10:27 +02:00
|
|
|
sleep(1)
|
2018-03-24 06:09:48 +01:00
|
|
|
self._sensor.calibrateBrightness()
|
2018-03-24 19:56:29 +01:00
|
|
|
sleep(2)
|
|
|
|
ev3.Sound.beep()
|
|
|
|
while(not self._sensor.bumperwaspressed):
|
|
|
|
self._sensor.checkbumper()
|
|
|
|
self._sensor.reset()
|
2018-03-26 03:10:27 +02:00
|
|
|
sleep(1)
|
2018-03-24 19:56:29 +01:00
|
|
|
self._sensor.calibrateRGB(self._sensor.red)
|
|
|
|
sleep(2)
|
|
|
|
ev3.Sound.beep()
|
|
|
|
while(not self._sensor.bumperwaspressed):
|
|
|
|
self._sensor.checkbumper()
|
|
|
|
self._sensor.reset()
|
2018-03-26 03:10:27 +02:00
|
|
|
sleep(1)
|
|
|
|
self._sensor.calibrateRGB(self._sensor.blue)
|
|
|
|
sleep(5)
|
2018-03-18 14:23:17 +01:00
|
|
|
|
2018-03-19 00:44:57 +01:00
|
|
|
'''
|
|
|
|
Function to correct errors should the robot wander astray
|
|
|
|
'''
|
2018-03-21 14:54:24 +01:00
|
|
|
|
2018-03-18 14:23:17 +01:00
|
|
|
def _aligntoedge(self):
|
2018-03-25 15:09:13 +02:00
|
|
|
self._wheel_l.speed_set(20)
|
|
|
|
self._wheel_r.speed_set(-20)
|
|
|
|
self._wheel_l.run()
|
|
|
|
self._wheel_r.run()
|
|
|
|
self._sensor.refresh()
|
|
|
|
while(self._sensor.getbrightness() > self._sensor.edgebrightness):
|
|
|
|
self._sensor.refresh()
|
|
|
|
self._wheel_l.stop()
|
|
|
|
self._wheel_r.stop()
|
2018-03-26 07:05:55 +02:00
|
|
|
self._wheel_l.turnbyamount(20, 40)
|
|
|
|
self._wheel_r.turnbyamount(-20, 40)
|
|
|
|
sleep(1)
|
2018-03-26 03:10:27 +02:00
|
|
|
|
|
|
|
def setcurcir(self, curdir):
|
|
|
|
self.odometry.angle_set(curdir[1])
|
2018-03-19 00:03:35 +01:00
|
|
|
|
2018-03-19 00:44:57 +01:00
|
|
|
'''
|
|
|
|
uses odometry and the planet object to map edges that are connected to
|
|
|
|
current node.
|
2018-03-19 02:46:25 +01:00
|
|
|
|
|
|
|
Use either relative motor pos or timed driving to center on node.
|
|
|
|
Next turn around and detect edges through drops in _sensor.getbrightness()
|
2018-03-19 00:44:57 +01:00
|
|
|
'''
|
2018-03-19 00:03:35 +01:00
|
|
|
def getstationedges(self):
|
2018-03-25 15:09:13 +02:00
|
|
|
found_edges = []
|
|
|
|
self._odometry.reset()
|
|
|
|
while(True):
|
2018-03-26 03:10:27 +02:00
|
|
|
self._wheel_l.turnbyamount(40, 60)
|
|
|
|
self._wheel_r.turnbyamount(-40, 60)
|
2018-03-25 15:09:13 +02:00
|
|
|
self._aligntoedge()
|
|
|
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
|
|
|
if(self._odometry.angle_get() in found_edges):
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
found_edges.append(self._odometry.angle_get())
|
2018-03-26 03:10:27 +02:00
|
|
|
self._odometry.angle_set(self._odometry.angle_get())
|
2018-03-26 09:10:13 +02:00
|
|
|
self._wheel_l.turnbyamount(20, 40)
|
|
|
|
self._wheel_r.turnbyamount(-20, 40)
|
2018-03-25 15:09:13 +02:00
|
|
|
sleep(2)
|
2018-03-26 03:10:27 +02:00
|
|
|
self._aligntoedge()
|
|
|
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
|
|
|
self._odometry.angle_set(self._odometry.angle_get())
|
2018-03-25 15:09:13 +02:00
|
|
|
return found_edges
|
|
|
|
|
2018-03-26 03:10:27 +02:00
|
|
|
def setcurdir(self, newdir):
|
|
|
|
self._odometry.angle_set(newdir[1])
|
|
|
|
|
|
|
|
def getstats(self):
|
|
|
|
stats = list(self._odometry.coordinates_get())
|
2018-03-26 18:20:36 +02:00
|
|
|
if(self._sensor.bumperwaspressed):
|
2018-03-26 17:38:41 +02:00
|
|
|
stats.append(-1)
|
|
|
|
else:
|
|
|
|
stats.append(1)
|
2018-03-26 03:10:27 +02:00
|
|
|
return stats
|
2018-03-24 04:43:01 +01:00
|
|
|
|
|
|
|
def turnto(self, direction):
|
|
|
|
turnval = self._odometry.dir2ticks(direction)
|
2018-03-26 03:10:27 +02:00
|
|
|
self._wheel_l.turnbyamount(turnval, 120)
|
|
|
|
self._wheel_r.turnbyamount(-turnval, 120)
|
|
|
|
sleep(5)
|
|
|
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
self._odometry.reset()
|
|
|
|
self._sensor.reset()
|
2018-03-19 00:03:35 +01:00
|
|
|
|
2018-03-26 14:23:23 +02:00
|
|
|
def resetwheels(self):
|
|
|
|
self._wheel_l._motor.position = 0
|
|
|
|
self._wheel_r._motor.position = 0
|
|
|
|
|
2018-03-19 00:03:35 +01:00
|
|
|
def traversetonextstation(self, isknownstation):
|
2018-03-24 06:09:48 +01:00
|
|
|
self._wheel_l.speed_set(self._sensor.edgebrightness//2)
|
|
|
|
self._wheel_r.speed_set(self._sensor.edgebrightness//2)
|
2018-03-19 00:03:35 +01:00
|
|
|
self._wheel_l.run()
|
|
|
|
self._wheel_r.run()
|
2018-03-24 17:35:40 +01:00
|
|
|
while (not self._sensor.bumperwaspressed):
|
2018-03-24 04:43:01 +01:00
|
|
|
self._sensor.refresh()
|
|
|
|
self._sensor.checkbumper()
|
2018-03-24 17:35:40 +01:00
|
|
|
self._sensor.getcolor()
|
2018-03-26 07:05:55 +02:00
|
|
|
if(self._sensor.lastcolor is not None):
|
2018-03-24 17:35:40 +01:00
|
|
|
break
|
2018-03-24 06:09:48 +01:00
|
|
|
self._wheel_l.speed_set(capat100(self._sensor.edgebrightness/2 - self._sensor.getbrightness()/2)+self.defaultspeed)
|
|
|
|
self._wheel_r.speed_set(capat100(self._sensor.getbrightness()/2 - self._sensor.edgebrightness/2)+self.defaultspeed)
|
2018-03-22 17:40:19 +01:00
|
|
|
if(not isknownstation):
|
2018-03-24 04:43:01 +01:00
|
|
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
2018-03-19 00:03:35 +01:00
|
|
|
self._wheel_l.stop()
|
|
|
|
self._wheel_r.stop()
|
2018-03-26 09:10:13 +02:00
|
|
|
if(self._sensor.bumperwaspressed is True):
|
2018-03-26 07:05:55 +02:00
|
|
|
self._wheel_l.turnbyamount(-200, 120)
|
|
|
|
self._wheel_r.turnbyamount(-200, 120)
|
|
|
|
sleep(1)
|
|
|
|
self._wheel_l.turnbyamount(320, 120)
|
|
|
|
self._wheel_r.turnbyamount(-320, 120)
|
|
|
|
sleep(2)
|
|
|
|
self._aligntoedge()
|
|
|
|
self._wheel_l.run()
|
|
|
|
self._wheel_r.run()
|
|
|
|
while(True):
|
|
|
|
self._sensor.refresh()
|
|
|
|
self._sensor.getcolor()
|
|
|
|
if(self._sensor.lastcolor is not None):
|
|
|
|
break
|
|
|
|
self._wheel_l.speed_set(capat100(self._sensor.edgebrightness/2 - self._sensor.getbrightness()/2)+self.defaultspeed)
|
|
|
|
self._wheel_r.speed_set(capat100(self._sensor.getbrightness()/2 - self._sensor.edgebrightness/2)+self.defaultspeed)
|
|
|
|
if(not isknownstation):
|
|
|
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
|
|
|
|
2018-03-26 03:10:27 +02:00
|
|
|
self._wheel_l.turnbyamount(200, 90)
|
|
|
|
self._wheel_r.turnbyamount(200, 90)
|
|
|
|
sleep(2)
|