def calculateHomePosition(player): """ Calculate home position. """ # We've seen the ball recently enough if player.brain.ball.vis.frames_off < 20: ball = player.brain.ball bearing = ball.bearing_deg elif player.brain.sharedBall.ball_on: ball = player.brain.sharedBall bearing = degrees(atan2(ball.y - player.brain.loc.y, ball.x - player.brain.loc.x)) - player.brain.loc.h else: ball = None if ball != None and not (role.isDefender(player.role) and NogginConstants.FIXED_D_HOME): if role.isLeftDefender(player.role): home = findDefenderHomeWithBall(player, True, ball, bearing + player.brain.loc.h) elif role.isRightDefender(player.role): home = findDefenderHomeWithBall(player, False, ball, bearing + player.brain.loc.h) elif role.isStriker(player.role): home = findStrikerHome(ball, bearing + player.brain.loc.h) else: home = player.homePosition else: if role.isLeftDefender(player.role): home = findDefenderHomeNoBall(player, True) elif role.isRightDefender(player.role): home = findDefenderHomeNoBall(player, False) else: home = player.homePosition return home
def watchForBall(player): """ The player is at home, waiting for the ball to be within box. """ if player.firstFrame(): # print "-----------Player at home - Watching for ball-----------" player.brain.tracker.trackBall() player.brain.nav.stand() # I commented this out because we were getting strange oscillations # between this and positonAtHome, and honestly we never go here unless # we are already at home... dumb... # if transitions.tooFarFromHome(player, 50, 20): # return player.goLater('positionAtHome') if role.isFirstChaser(player.role): if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME: return player.goNow('spinAtHome') elif role.isStriker(player.role): if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME * 2: return player.goNow('spinAtHome') else: if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME * 2: return player.goNow('spinAtHome')
def calculateHomePosition(player): """ Calculate home position. """ if player.brain.ball.vis.frames_off < 10: ball = player.brain.ball bearing = ball.bearing_deg elif player.brain.sharedBall.ball_on: ball = player.brain.sharedBall bearing = degrees( atan2(ball.y - player.brain.loc.y, ball.x - player.brain.loc.x)) - player.brain.loc.h else: ball = None if ball != None and not (role.isDefender(player.role) and NogginConstants.FIXED_D_HOME): if role.isLeftDefender(player.role): home = findDefenderHome(True, ball, bearing + player.brain.loc.h) elif role.isRightDefender(player.role): home = findDefenderHome(False, ball, bearing + player.brain.loc.h) elif role.isStriker(player.role): home = findStrikerHome(ball, bearing + player.brain.loc.h) else: home = player.homePosition else: home = player.homePosition return home
def tooFarFromHome(threshold, player): """ Returns true if LOC thinks we're more than *distance* away from our home position """ if player.brain.ball.vis.frames_off < 10: ball = player.brain.ball elif player.brain.sharedBall.ball_on: ball = player.brain.sharedBall else: ball = None home = player.homePosition if ball != None: if role.isLeftDefender(player.role): home = findDefenderHome(True, ball, player.homePosition.h) elif role.isRightDefender(player.role): home = findDefenderHome(False, ball, player.homePosition.h) elif role.isStriker(player.role): home = findStrikerHome(ball, player.homePosition.h) else: home = player.homePosition distance = ((player.brain.loc.x - home.x) ** 2 + (player.brain.loc.y - home.y) ** 2) ** 0.5 return distance > threshold
def branchOnRole(player): """ Chasers are going to have a different behavior again. We will branch on behavior based on role here """ # print "----------In branch on role----------" # print "Entered Branch on Role" # print "----- evenDefenderIsForward, lastEvenDefenderForwardVal ----" # print player.brain.evenDefenderIsForward, lastEvenDefenderForwardVal # global lastEvenDefenderForwardVal # player.brain.evenDefenderIsForward = not lastEvenDefenderForwardVal # newEvenDefenderForwardVal = True # print("TIME SINCE PLAYING:", player.brain.gameController.timeSincePlaying) if role.isFirstChaser(player.role): if transitions.shouldFindSharedBall(player) and player.brain.gameController.timeSincePlaying > 75: return player.goNow('searchFieldForSharedBall') return player.goNow('playerFourSearchBehavior') elif role.isStriker(player.role): return player.goNow('playerFiveSearchBehavior') elif role.isLeftDefender(player.role): # print "Player Brain Left Forward 1: " + str(leftDefenderIsForward) # if (player.brain.sharedBall.ball_on) and (player.brain.sharedBall.x < NogginConstants.MIDFIELD_X): # print "WE ARE IN HERE" # return player.goNow('leftDefenderBack') if leftDefenderIsForward: # print "Changing to False" global leftDefenderIsForward leftDefenderIsForward = False # print "Player Brain Left Forward 2: " + str(leftDefenderIsForward) return player.goNow('leftDefenderForward') else: # print "Changing to True" global leftDefenderIsForward leftDefenderIsForward = True # print "Player Brain Left Forward 3: " + str(leftDefenderIsForward) return player.goNow('leftDefenderBack') else: return player.goNow('positionAtHome')
def getSupporterPosition(player, r): """ Returns a position to stand at to support teammate who is chasing the ball. Used in positionAsSupporter in PlayOffBallStates. """ if role.isLeftDefender(r): return leftDefender(player) elif role.isRightDefender(r): return rightDefender(player) elif role.isFirstChaser(r): return chaser(player) elif role.isStriker(r): return striker(player) else: # cherry picker return cherryPicker(player)
def chaser(player): """ Chasers position off to one side of the ball about a meter away if a chaser or cherry picker is calling them off. Chasers position further away up field if a defender is calling them off. """ if role.isStriker(player.roleOfClaimer): return striker(player) if role.isDefender(player.roleOfClaimer): if player.brain.ball.y >= player.brain.loc.y: return RobotLocation( player.brain.ball.x + 250, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) return RobotLocation( player.brain.ball.x + 250, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) else: southEast = RobotLocation( player.brain.ball.x - CHASER_DISTANCE, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) southWest = RobotLocation( player.brain.ball.x - CHASER_DISTANCE, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) northEast = RobotLocation( player.brain.ball.x + CHASER_DISTANCE, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) northWest = RobotLocation( player.brain.ball.x + CHASER_DISTANCE, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) supportPostitions = [southEast, southWest, northEast, northWest] positionsFilteredByInBounds = [ position for position in supportPostitions if (inBounds(position) and notBlockingGoal(position)) ] if len(positionsFilteredByInBounds) > 0: return min(positionsFilteredByInBounds, key=distanceToPosition(player)) # print "no in bounds position" return southEast
def doPan(player): """ Wide pan for 5 seconds. """ if player.firstFrame(): # print "------------Doing Pan-------------" player.stand() player.brain.tracker.trackBall() if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME: if role.isFirstChaser(player.role): return player.goNow('playerFourSearchBehavior') elif role.isStriker(player.role): return player.goNow('playerFiveSearchBehavior') else: return player.goNow('doSecondHalfSpin')
def positionAtHome(player): """ Go to the player's home position. Defenders look in the direction of the shared ball if it is on with reliability >= 2. Cherry pickers look in the direction of the shared ball if it is on with reliability >= 1. """ if role.isFirstChaser(player.role) and transitions.shouldFindSharedBall(player): return player.goLater('searchFieldForSharedBall') if player.brain.ball.vis.frames_off < 10: ball = player.brain.ball bearing = ball.bearing_deg elif player.brain.sharedBall.ball_on: ball = player.brain.sharedBall bearing = degrees(atan2(ball.y - player.brain.loc.y, ball.x - player.brain.loc.x)) - player.brain.loc.h else: ball = None home = player.homePosition if ball != None: if role.isLeftDefender(player.role): home = findDefenderHome(True, ball, bearing + player.brain.loc.h) elif role.isRightDefender(player.role): home = findDefenderHome(False, ball, bearing + player.brain.loc.h) elif role.isStriker(player.role): home = findStrikerHome(ball, bearing + player.brain.loc.h) else: home = player.homePosition if player.firstFrame(): if role.isCherryPicker(player.role): player.brain.tracker.repeatBasicPan() else: player.brain.tracker.trackBall() fastWalk = role.isChaser(player.role) player.brain.nav.goTo(home, precision = nav.HOME, speed = nav.QUICK_SPEED, avoidObstacles = True, fast = fastWalk, pb = False) player.brain.nav.updateDest(home)
def panAtWayPoint(player): if player.firstFrame(): player.stand() player.brain.tracker.trackBall() # if role.isFirstChaser(player.role) and not playerFourSearchBehavior.pointIndex % len(playerFourPoints) == 0: # if player.stateTime >= FULL_WIDE_PAN_TIME: # return player.goNow("playerFourSearchBehavior") # elif player.stateTime >= FULL_WIDE_PAN_TIME * 2: # return player.goNow("spinAtHome") if role.isFirstChaser(player.role) and not playerFourSearchBehavior.pointIndex % len(playerFourPoints) == 0: if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME: return player.goNow("playerFourSearchBehavior") elif role.isStriker(player.role): if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME * 2: return player.goNow('spinAtHome') else: if player.stateTime >= tracking.INITIALIZE_HEADING_TIME + tracking.FULL_WIDE_PAN_TIME: return player.goNow('spinAtHome')
def chaser(player): """ Chasers position off to one side of the ball about a meter away if a chaser or cherry picker is calling them off. Chasers position further away up field if a defender is calling them off. """ if role.isStriker(player.roleOfClaimer): return striker(player) if role.isDefender(player.roleOfClaimer): if player.brain.ball.y >= player.brain.loc.y: return RobotLocation(player.brain.ball.x + 250, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) return RobotLocation(player.brain.ball.x + 250, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) else: southEast = RobotLocation(player.brain.ball.x - CHASER_DISTANCE, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) southWest = RobotLocation(player.brain.ball.x - CHASER_DISTANCE, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) northEast = RobotLocation(player.brain.ball.x + CHASER_DISTANCE, player.brain.ball.y - CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) northWest = RobotLocation(player.brain.ball.x + CHASER_DISTANCE, player.brain.ball.y + CHASER_DISTANCE, player.brain.ball.bearing_deg + player.brain.loc.h) supportPostitions = [southEast,southWest,northEast,northWest] positionsFilteredByInBounds = [position for position in supportPostitions if (inBounds(position) and notBlockingGoal(position))] if len(positionsFilteredByInBounds) > 0: return min(positionsFilteredByInBounds, key=distanceToPosition(player)) # print "no in bounds position" return southEast