/
alpharex.py
executable file
·151 lines (114 loc) · 4.45 KB
/
alpharex.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
145
146
147
148
149
150
r'''Alpha Rex API
A high-level, object-oriented programming interface to Lego MINDSTORMS
NXT's "Alpha Rex" model (see [1] for assembling instructions), along with a
small collection of functions demonstrating obvious usage scenarios.
1. http://www.active-robots.com/products/mindstorms4schools/building-instructions.shtml
'''
from time import sleep
from nxt.brick import Brick
from nxt.locator import find_one_brick
from nxt.motor import Motor, PORT_A, PORT_B, PORT_C
from nxt.sensor import Light, Sound, Touch, Ultrasonic
from nxt.sensor import PORT_1, PORT_2, PORT_3, PORT_4
FORTH = 100
BACK = -100
class AlphaRex(object):
r'''A high-level controller for the Alpha Rex model.
This class implements methods for the most obvious actions performable
by Alpha Rex, such as walk, wave its arms, and retrieve sensor samples.
Additionally, it also allows direct access to the robot's components
through public attributes.
'''
def __init__(self, brick='NXT'):
r'''Creates a new Alpha Rex controller.
brick
Either an nxt.brick.Brick object, or an NXT brick's name as a
string. If omitted, a Brick named 'NXT' is looked up.
'''
if isinstance(brick, str):
brick = find_one_brick(name=brick)
self.brick = brick
self.arms = Motor(brick, PORT_A)
self.legs = [Motor(brick, PORT_B), Motor(brick, PORT_C)]
self.touch = Touch(brick, PORT_1)
self.sound = Sound(brick, PORT_2)
self.light = Light(brick, PORT_3)
self.ultrasonic = Ultrasonic(brick, PORT_4)
def echolocate(self):
r'''Reads the Ultrasonic sensor's output.
'''
return self.ultrasonic.get_sample()
def feel(self):
r'''Reads the Touch sensor's output.
'''
return self.touch.get_sample()
def hear(self):
r'''Reads the Sound sensor's output.
'''
return self.sound.get_sample()
def say(self, line, times=1):
r'''Plays a sound file named (line + '.rso'), which is expected to be
stored in the brick. The file is played (times) times.
line
The name of a sound file stored in the brick.
times
How many times the sound file will be played before this method
returns.
'''
for i in range(0, times):
self.brick.play_sound_file(False, line + '.rso')
sleep(1)
def see(self):
r'''Reads the Light sensor's output.
'''
return self.light.get_sample()
def walk(self, secs, power=FORTH):
r'''Simultaneously activates the leg motors, causing Alpha Rex to walk.
secs
How long the motors will rotate.
power
The strength effected by the motors. Positive values will cause
Alpha Rex to walk forward, while negative values will cause it
to walk backwards. If you are unsure about how much force to
apply, the special values FORTH and BACK provide reasonable
defaults. If omitted, FORTH is used.
'''
for motor in self.legs:
motor.run(power=power)
sleep(secs)
for motor in self.legs:
motor.idle()
def wave(self, secs, power=100):
r'''Make Alpha Rex move its arms.
secs
How long the arms' motor will rotate.
power
The strength effected by the motor. If omitted, (100) is used.
'''
self.arms.run(power=power)
sleep(secs)
self.arms.idle()
def wave_and_talk():
r'''Connects to a nearby Alpha Rex, then commands it to wave its arms and
play the sound file 'Object.rso'.
'''
robot = AlphaRex()
robot.wave(1)
robot.say('Object')
def walk_forth_and_back():
r'''Connects to a nearby Alpha Rex, then commands it to walk forward and
then backwards.
'''
robot = AlphaRex()
robot.walk(10, FORTH)
robot.walk(10, BACK)
def walk_to_object():
r'''Connects to a nearby Alpha Rex, then commands it to walk until it
approaches an obstacle, then stop and say 'Object' three times.
'''
robot = AlphaRex()
while robot.echolocate() > 10:
robot.walk(1, FORTH)
robot.say('Object', 3)
if __name__ == '__main__':
walk_to_object()