-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
144 lines (110 loc) · 4.09 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, TouchSensor, ColorSensor, UltrasonicSensor
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
class MazeRobot:
"""
Objekter av klassen har metoder som lar en robot bevege seg, og finne vegen gjennom en labyrint
"""
wheel_diam = 55.5 # Diameter på hjula. Klassevariabel
axle_track = 124 # Avstand mellom hjula. Klassevariabel
def __init__(self, left_port, right_port, head_port, us_port):
"""
__init__ -> MazeRobot
Konstruktør for klassen, som tar inn portplassering av den gjeldende
robotens porter og konstruerer et objekt av klassen 'MazeRobot'
Dette objektet arver axle_track og wheel_diam som klassevariabler
og danner nye objektvariabler gitt i konstruktøren
@params left_port, right_port, head_port, us_port
"""
self.left_motor = Motor(left_port)
self.right_motor = Motor(right_port)
self.head = Motor(head_port)
self.sensor = UltrasonicSensor(us_port)
self.base = DriveBase(self.left_motor, self.right_motor, wheel_diameter = MazeRobot.wheel_diam, axle_track = MazeRobot.axle_track)
"""
================================================
-- Grunnleggende metoder for robotbevegelse
================================================
"""
def drive(self, distance):
"""Kjører 200 mm (20cm) rett fram."""
self.base.straight(distance)
def turn_right(self):
"""Roboten roterer 90 grader mot høyre"""
self.base.turn(90)
def turn_left(self):
"""Roboten roterer 90 grader mot venstre"""
self.base.turn(-90)
def forward(self):
"""
Kjører 20 cm fram
"""
self.drive(200)
"""
================================================
-- Metoder for styring av UL-sensor
================================================
"""
def turn_head(self, deg):
"""
Snur huet til en vinkel deg fra normal.
(Positiv retning mot høyre)
"""
# Snur huet med mål deg grader fra normal
# Hastighet 180 grader i sekundet
self.head.run_target(180, deg)
def turn_head_right(self):
"""
Snur huet mot høyre (90 grader)
"""
#Snur hodet 90 grader mot høyre
self.turn_head(90)
def turn_head_straight(self):
"""
Snur huet rett fram
"""
#Snur hodet rett fram
self.turn_head(0)
def sees_wall(self, distance):
"""
Returnerer True om sensoren kan se noe som er nærmere enn distance mm.
"""
return (self.sensor.distance() <= distance)
def check_right(self):
"""
Snur huet til høyre, kikker etter vegger, og snur tilbake
Returnerer True om den har sett en vegg.
"""
self.turn_head_right() # Snur huet mot høyre
r = self.sees_wall(300) # Er det en vegg der? Lagrer i r
self.turn_head_straight() # Snur huet fram igjen
return r
def check_front(self):
"""Returnerer True om den ser en vegg nærmere enn 20 cm foran"""
self.turn_head_straight()
return self.sees_wall(200)
"""
================================================
-- Metoder for navigering
================================================
"""
def enter_right(self):
"""Kjører inn i en åpning til høyre"""
self.drive(150)
self.turn_right()
self.drive(150)
def direction(self):
if not self.check_right():
self.enter_right()
elif self.check_front():
self.turn_left()
else:
self.drive(20)
def follow_right(self):
for i in range(100):
self.direction()
robot = MazeRobot(Port.A, Port.D, Port.C, Port.S3)
robot.follow_right()