| 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
|
# A Subsumption Behavior-based Brain
# Subsumption.py
from pyrobot.brain import Brain
import time
import random
class SubsumptionBehavior:
def __init__(self):
self.translate = 0
self.rotate = 0
self.flag = 0
def setRobot(self, robot):
self.robot = robot
def move(self, translate, rotate):
self.translate = translate
self.rotate = rotate
self.flag = 1
class SubsumptionBrain(Brain):
def __init__(self, engine):
Brain.__init__(self, 'SubsumptionBrain', engine)
self.behaviors = []
self.robot = engine.robot
def add(self, behavior):
behavior.setRobot( self.robot )
self.behaviors.append( behavior )
def step(self):
b = self.updateAll()
print "%s is in control" % self.behaviors[b].__class__.__name__
self.move(self.behaviors[b].translate,
self.behaviors[b].rotate)
time.sleep(1)
def updateAll(self):
# for all except lowest:
for b in range(len(self.behaviors) - 1, 0, -1):
self.behaviors[b].flag = 0
self.behaviors[b].update()
# if it fired, return number:
if self.behaviors[b].flag:
return b
# if none fired, return lowest:
self.behaviors[0].update()
return 0
# -----------------------------------------------------
class Wander(SubsumptionBehavior):
def update(self):
self.move( .2, random.random() * 2 - 1)
class Avoid(SubsumptionBehavior):
def update(self):
if min([s.value for s in self.robot.range["front-all"]]) < 1:
self.move( -.2, 0)
def INIT(engine):
subsumption = SubsumptionBrain( engine )
# add behaviors, lowest priorities first:
subsumption.add( Wander() )
subsumption.add( Avoid() )
return subsumption |