-
Notifications
You must be signed in to change notification settings - Fork 29
/
GoalieTransitions.py
316 lines (267 loc) · 10 KB
/
GoalieTransitions.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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
from ..playbook import PBConstants
from .. import NogginConstants as Constants
import GoalieConstants as goalCon
import ChaseBallTransitions as chaseTran
#arbitrary, currently same as AIBO
DEBUG = False
def goalieRunChecks(player):
setRelX(player)
setRelY(player)
if shouldSave(player):
player.shouldSaveCounter+=1
if player.shouldSaveCounter >= 3:
player.isChasing = False
player.shouldChaseCounter = 0
return 'goalieSave'
elif not player.isChasing:
if shouldChaseLoc(player):
player.shouldChaseCounter+=1
if DEBUG: print "should chase: ", player.shouldChaseCounter
if player.shouldChaseCounter >= goalCon.START_CHASE_BUFFER:
player.shouldChaseCounter = 0
return 'chase'
else:
player.shouldChaseCounter = 0
elif player.isChasing and\
not chaseTran.shouldntStopChasing(player):
if shouldStopChaseLoc(player) :
player.shouldChaseCounter+=1
if DEBUG: print "should stop chase: ", player.shouldChaseCounter
if player.shouldChaseCounter >= goalCon.STOP_CHASE_BUFFER:
player.shouldChaseCounter = 0
player.isChasing = False
return 'goaliePosition'
else:
player.shouldChaseCounter = 0
elif player.currentState == 'gamePlaying':
player.isChasing = False
return 'goalieAtPosition'
return player.currentState
def useClosePosition(player):
return (0 < player.brain.ball.x <=
(PBConstants.BALL_LOC_LIMIT - goalCon.BUFFER))
def useFarPosition(player):
if player.penaltyKicking:
return False
ball = player.brain.ball
#switch out if we lose the ball for multiple frames
return (not (0 <= ball.x <= PBConstants.BALL_LOC_LIMIT + goalCon.BUFFER) or
ball.framesOff > 500)
def useLeftStrafeClose(player):
return (player.ballRelY > goalCon.CENTER_SAVE_THRESH and
player.stepsOffCenter < goalCon.MAX_STEPS_OFF_CENTER)
def useRightStrafeClose(player):
return (player.ballRelY < -goalCon.CENTER_SAVE_THRESH and\
player.stepsOffCenter > -goalCon.MAX_STEPS_OFF_CENTER)
def useLeftStrafeCloseSpeed(player):
strafeLeftThresh = getLeftStrafeThresh(player)
return (player.ballRelY > strafeLeftThresh and\
player.framesFromCenter < goalCon.MAX_FRAMES_OFF_CENTER )
def useRightStrafeCloseSpeed(player):
strafeRightThresh = getRightStrafeThresh(player)
return (player.ballRelY < strafeRightThresh and\
player.framesFromCenter > -goalCon.MAX_FRAMES_OFF_CENTER)
def useLeftStrafeFar(player):
return (player.stepsOffCenter <= -goalCon.STRAFE_STEPS)
def useLeftStrafeFarSpeed(player):
return (player.framesFromCenter <= -1)
def useRightStrafeFar(player):
return (player.stepsOffCenter >= goalCon.STRAFE_STEPS)
def useRightStrafeFarSpeed(player):
return (player.framesFromCenter >= 1)
def strafeLeftSpeed(player):
player.setWalk(-.75, goalCon.STRAFE_SPEED, .25)
player.framesFromCenter += 1
def strafeLeft(player):
if player.setSteps(0, goalCon.STRAFE_SPEED, 0, goalCon.STRAFE_STEPS):
player.stepsOffCenter += goalCon.STRAFE_STEPS
def strafeRightSpeed(player):
player.setWalk(-.75, -goalCon.STRAFE_SPEED, -.25)
player.framesFromCenter -= 1
def strafeRight(player):
if player.setSteps(0, -goalCon.STRAFE_SPEED, 0, goalCon.STRAFE_STEPS):
player.stepsOffCenter -= goalCon.STRAFE_STEPS
def getLeftStrafeThresh(player):
'''return a positive number'''
ffc = player.framesFromCenter
if abs(ffc) > goalCon.MAX_FRAMES_OFF_CENTER:
print "!! ffc: ", ffc
thresh = 0
if ffc < 0:
thresh = goalCon.STRAFE_THRESH_ONE
elif 0 <= ffc <= 100:
thresh = goalCon.STRAFE_THRESH_ONE
elif 100 < ffc <= 160:
thresh = goalCon.STRAFE_THRESH_TWO
elif 160 < ffc <= 220:
thresh = goalCon.STRAFE_THRESH_THREE
elif 220 < ffc <= 280:
thresh = goalCon.STRAFE_THRESH_FOUR
elif 280 < ffc <= 340:
thresh = goalCon.STRAFE_THRESH_FIVE
else:
thresh = goalCon.STRAFE_THRESH_SIX
return thresh
def getRightStrafeThresh(player):
'''return a negative number'''
ffc = player.framesFromCenter
if abs(ffc) > goalCon.MAX_FRAMES_OFF_CENTER:
print "!! ffc: ", ffc
thresh = 0
if ffc > 0:
thresh = -goalCon.STRAFE_THRESH_ONE
elif -100 <= ffc <= 0:
thresh = -goalCon.STRAFE_THRESH_ONE
elif -160 <= ffc <= -100:
thresh = -goalCon.STRAFE_THRESH_TWO
elif -220 <= ffc <= -160:
thresh = -goalCon.STRAFE_THRESH_THREE
elif -280 <= ffc <= -220:
thresh = -goalCon.STRAFE_THRESH_FOUR
elif -340 <= ffc <= -280:
thresh = -goalCon.STRAFE_THRESH_FIVE
else:
thresh = -goalCon.STRAFE_THRESH_SIX
return thresh
def shouldPositionForSave(player):
ball = player.brain.ball
# Test velocity values as to which one would work:
relVelX = ball.relVelX
timeUntilSave = getTimeUntilSave(player)
# No Time, Save now
if (5 > timeUntilSave > goalCon.BALL_SAVE_LIMIT_TIME and
ball.framesOn > 3. and relVelX < 0.
and player.ballRelX < goalCon.MOVE_TO_SAVE_DIST_THRESH):
if DEBUG: player.brain.sensors.saveFrame()
#player.printf("relVelX = %g timeUntilSave = %g" %
#(relVelX, timeUntilSave))
return True;
return False;
def strafeDirForSave(player):
ball = player.brain.ball
my = player.brain.my
timeUntilSave = getTimeUntilSave(player)
anticipatedY = (player.ballRelY + ball.relVelY * timeUntilSave)
if anticipatedY < my.y - goalCon.CENTER_SAVE_THRESH:
return -1
elif anticipatedY > my.y + goalCon.CENTER_SAVE_THRESH:
return 1
else:
return 0
def shouldSave(player):
ball = player.brain.ball
# Test velocity values as to which one would work:
relVelX = ball.relVelX
if player.saving :
return False
if relVelX < 0.0:
timeUntilSave = player.ballRelX / -relVelX
if DEBUG: player.printf(("relVelX = %g timeUntilSave = %g") %
(relVelX, timeUntilSave))
else:
timeUntilSave = -1
# No Time, Save now
if (timeUntilSave < goalCon.BALL_SAVE_LIMIT_TIME and
ball.framesOn > 3. and relVelX < 0.
and player.ballRelX < goalCon.MOVE_TO_SAVE_DIST_THRESH):
if DEBUG: player.brain.sensors.saveFrame()
#player.printf("relVelX = %g timeUntilSave = %g" %
#(relVelX, timeUntilSave))
return True;
return False;
def shouldHoldSave(player):
# same as shouldSave() except for the ball.framesOn check
# try to come up with better conditions to test
""" if the ball is still in front of me and coming at me, hold save
if it's going to arrive anytime soon """
ball = player.brain.ball
relVelX = ball.relVelX
timeUntilSave = getTimeUntilSave(player)
if timeUntilSave < goalCon.BALL_SAVE_LIMIT_TIME*2 and relVelX < 0 and\
0 < player.ballRelX < goalCon.MOVE_TO_SAVE_DIST_THRESH:
if DEBUG: player.brain.sensors.saveFrame()
return True
return False
def shouldChaseLoc(player):
if player.penaltyKicking or player.saving:
return False
ball = player.brain.ball
if (ball.y > Constants.MY_GOALBOX_BOTTOM_Y
and ball.y < Constants.MY_GOALBOX_TOP_Y
and ball.x < Constants.MY_GOALBOX_RIGHT_X +
goalCon.AGGRESSIVENESS_OFFSET):
return True
return False
def shouldStopChaseLoc(player):
ball = player.brain.ball
#change to use ball uncertainty
if ball.uncertX < Constants.GOOD_LOC_XY_UNCERT_THRESH:
if ball.x > (Constants.CENTER_FIELD_X/2):
return True
#makes sure we have seen the ball at least once for this method to return
#true STOP_CHASE_BUFFER-times
if ball.framesOff <= goalCon.STOP_CHASE_BUFFER - 1:
if (ball.y < (Constants.MY_GOALBOX_BOTTOM_Y -
goalCon.END_CLEAR_BUFFER) or
ball.y > (Constants.MY_GOALBOX_TOP_Y +
goalCon.END_CLEAR_BUFFER) or
ball.x > (Constants.MY_GOALBOX_RIGHT_X
+ goalCon.AGGRESSIVENESS_OFFSET +
goalCon.END_CLEAR_BUFFER )):
return True
"""
elif (my.x < Constants.MY_GOALBOX_RIGHT_X
or my.y < Constants.MY_GOALBOX_TOP_Y
or my.y > Constants.MY_GOALBOX_BOTTOM_Y) and\
(ball.locDist >= 70 or ball.dist >= 70):
return True
"""
return False
def outOfPosition(player):
if player.penaltyKicking:
return False
my = player.brain.my
if (my.x > Constants.MY_GOALBOX_RIGHT_X and my.uncertX < 90)\
or (my.x > Constants.MIDFIELD_X * 0.5):
#print "my.x ", my.x, " my.uncertX ", my.uncertX
return True
return False
def dangerousBall(player):
ball = player.brain.ball
if (ball.x < player.brain.my.x or
player.brain.myGoalLeftPost.on or
player.brain.myGoalRightPost.on or
player.brain.myGoalCrossbar.on) and ball.locDist <= 40:
return True
#idea: draw ray from me to ball, see if it intersects goal
return False
def useOmni(player):
"""the '+' and '-' for y are intentionally reversed because of the
difficulty of using omniGoTo to get back from the points outside
of the goalposts """
my = player.brain.my
if my.x < Constants.MY_GOALBOX_RIGHT_X + goalCon.BUFFER and\
my.y < Constants.MY_GOALBOX_TOP_Y - goalCon.BUFFER and\
my.y > Constants.MY_GOALBOX_BOTTOM_Y + goalCon.BUFFER:
return True
return False
def setRelY(player):
ball = player.brain.ball
if ball.on:
player.ballRelY = ball.relY
else:
player.ballRelY = ball.locRelY
def setRelX(player):
ball = player.brain.ball
if ball.on:
player.ballRelX = ball.relX
else:
player.ballRelX = ball.locRelX
def getTimeUntilSave(player):
ball = player.brain.ball
time = 0
if ball.relVelX < 0.0:
time = player.ballRelX/ -ball.relVelX
else:
time = -1
return time