def turnToBall(player): """ Rotate to align with the ball. When we get close, we will approach it """ ball = player.brain.ball if player.firstFrame(): player.hasAlignedOnce = False player.brain.tracker.trackBall() player.brain.CoA.setRobotGait(player.brain.motion) # Determine the speed to turn to the ball turnRate = MyMath.clip(ball.bearing*constants.BALL_SPIN_GAIN, -constants.BALL_SPIN_SPEED, constants.BALL_SPIN_SPEED) # Avoid spinning so slowly that we step in place if fabs(turnRate) < constants.MIN_BALL_SPIN_MAGNITUDE: turnRate = MyMath.sign(turnRate)*constants.MIN_BALL_SPIN_MAGNITUDE if ball.on: player.setSpeed(x=0,y=0,theta=turnRate) if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldApproachBall(player): return player.goLater('approachBall') elif transitions.shouldScanFindBall(player): return player.goLater('scanFindBall') return player.stay()
def approachBall(player): """ Once we are aligned with the ball, approach it """ # Switch to other states if we should if player.penaltyKicking and \ player.brain.ball.inOppGoalBox(): return player.goNow('penaltyBallInOppGoalbox') elif player.brain.tracker.activeLocOn: if transitions.shouldScanFindBallActiveLoc(player): return player.goLater('scanFindBall') elif transitions.shouldScanFindBall(player): return player.goLater('scanFindBall') elif player.brain.play.isRole(GOALIE) and goalTran.dangerousBall(player): return player.goNow('approachDangerousBall') elif transitions.shouldDribble(player): return player.goNow('dribble') elif transitions.shouldSpinToBallClose(player): return player.goNow('spinToBallClose') elif transitions.shouldStopBeforeKick(player): return player.goNow('stopBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('decideKick') if player.firstFrame(): player.brain.nav.chaseBall() player.hasAlignedOnce = False player.brain.tracker.trackBall() return player.stay()
def turnToBall(player): """ Rotate to align with the ball. When we get close, we will approach it """ ball = player.brain.ball if player.firstFrame(): player.hasAlignedOnce = False player.brain.tracker.trackBall() player.brain.CoA.setRobotGait(player.brain.motion) # Determine the speed to turn to the ball turnRate = MyMath.clip(ball.bearing * constants.BALL_SPIN_GAIN, -constants.BALL_SPIN_SPEED, constants.BALL_SPIN_SPEED) # Avoid spinning so slowly that we step in place if fabs(turnRate) < constants.MIN_BALL_SPIN_MAGNITUDE: turnRate = MyMath.sign(turnRate) * constants.MIN_BALL_SPIN_MAGNITUDE if ball.on: player.setWalk(x=0, y=0, theta=turnRate) if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldApproachBall(player): return player.goLater('approachBall') elif transitions.shouldScanFindBall(player): return player.goLater('scanFindBall') return player.stay()
def followPotentialField(player): """ This state is based on electric field potential vector paths. The ball is treated as an attractive force where on the side that will be kicked. The opposite side is treated as a repulsive force of smaller magnitude. """ if player.brain.nav.dodging: return player.stay() if player.firstFrame(): player.brain.tracker.trackBall() ball = player.brain.ball heading = player.brain.loc.h relH = player.decider.normalizeAngle(player.kick.setupH - heading) if (transitions.shouldPositionForKick(player, ball, relH)): player.brain.nav.stand() destinationX = player.kick.destinationX destinationY = player.kick.destinationY player.kick = kicks.chooseAlignedKickFromKick(player, player.kick) player.kick.destinationX = destinationX player.kick.destinationY = destinationY return player.goNow('positionForKick') else: attractorX = ball.rel_x - constants.ATTRACTOR_BALL_DIST*cos(radians(heading - player.kick.setupH)) attractorY = ball.rel_y - constants.ATTRACTOR_BALL_DIST*sin(-radians(heading - player.kick.setupH)) attractorDist = (attractorX**2 + attractorY**2)**.5 if attractorDist == 0: attractorDist = .00000000001 repulsorX = ball.rel_x - constants.REPULSOR_BALL_DIST*cos(radians(heading - player.kick.setupH)) repulsorY = ball.rel_y - constants.REPULSOR_BALL_DIST*sin(-radians(heading - player.kick.setupH)) repulsorDist = (repulsorX**2 + repulsorY**2)**.5 if repulsorDist == 0: repulsorDist = .00000000001 # super position of an attractive potential field and arepulsive one xComp = constants.ATTRACTOR_REPULSOR_RATIO*attractorX/attractorDist**3 - repulsorX/repulsorDist**3 yComp = constants.ATTRACTOR_REPULSOR_RATIO*attractorY/attractorDist**3 - repulsorY/repulsorDist**3 if xComp == 0 and yComp == 0: player.setWalk(0, 0, copysign(MAX_SPEED, ball.bearing_deg)) else: normalizer = Navigator.FAST_SPEED/(xComp**2 + yComp**2)**.5 if fabs(ball.bearing_deg) < 2*constants.FACING_KICK_ACCEPTABLE_BEARING: hComp = 0 elif attractorDist < constants.CLOSE_TO_ATTRACTOR_DIST: hComp = copysign(Navigator.FAST_SPEED, ball.bearing_deg) else: hComp = copysign(Navigator.MEDIUM_SPEED, ball.bearing_deg) player.setWalk(normalizer*xComp, normalizer*yComp, hComp) return player.stay()
def followPotentialField(player): """ This state is based on electric field potential vector paths. The ball is treated as an attractive force where on the side that will be kicked. The opposite side is treated as a repulsive force of smaller magnitude. """ if player.firstFrame(): player.brain.tracker.trackBall() ball = player.brain.ball heading = player.brain.loc.h relH = player.decider.normalizeAngle(player.kick.setupH - heading) if (transitions.shouldPositionForKick(player, ball, relH)): destinationX = player.kick.destinationX destinationY = player.kick.destinationY player.kick = kicks.chooseAlignedKickFromKick(player, player.kick) player.kick.destinationX = destinationX player.kick.destinationY = destinationY return player.goNow('positionForKick') else: attractorX = ball.rel_x - constants.ATTRACTOR_BALL_DIST * cos( radians(heading - player.kick.setupH)) attractorY = ball.rel_y - constants.ATTRACTOR_BALL_DIST * sin( -radians(heading - player.kick.setupH)) attractorDist = (attractorX**2 + attractorY**2)**.5 if attractorDist == 0: attractorDist = .00000000001 repulsorX = ball.rel_x - constants.REPULSOR_BALL_DIST * cos( radians(heading - player.kick.setupH)) repulsorY = ball.rel_y - constants.REPULSOR_BALL_DIST * sin( -radians(heading - player.kick.setupH)) repulsorDist = (repulsorX**2 + repulsorY**2)**.5 if repulsorDist == 0: repulsorDist = .00000000001 # super position of an attractive potential field and arepulsive one xComp = constants.ATTRACTOR_REPULSOR_RATIO * attractorX / attractorDist**3 - repulsorX / repulsorDist**3 yComp = constants.ATTRACTOR_REPULSOR_RATIO * attractorY / attractorDist**3 - repulsorY / repulsorDist**3 if xComp == 0 and yComp == 0: player.setWalk(0, 0, 0) else: normalizer = Navigator.FAST_SPEED / (xComp**2 + yComp**2)**.5 if ball.bearing_deg > constants.SHOULD_SPIN_TO_BALL_BEARING / 2: hComp = copysign(Navigator.GRADUAL_SPEED, ball.bearing_deg) else: hComp = copysign(Navigator.GRADUAL_SPEED, ball.bearing_deg) player.setWalk(normalizer * xComp, normalizer * yComp, hComp) return player.stay()
def approachBall(player): """ Once we are alligned with the ball, approach it """ if player.firstFrame(): player.hasAlignedOnce = False player.brain.tracker.trackBall() player.brain.CoA.setRobotGait(player.brain.motion) #if player.brain.ball.locDist > constants.APPROACH_ACTIVE_LOC_DIST: if transitions.shouldActiveLoc(player): player.brain.tracker.activeLoc() else : player.brain.tracker.trackBall() if player.penaltyKicking and \ player.ballInOppGoalBox(): return player.goNow('penaltyBallInOppGoalbox') # Switch to other states if we should if player.brain.playbook.role == pbc.GOALIE: if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldTurnToBall_ApproachBall(player): return player.goLater('turnToBall') elif not player.brain.tracker.activeLocOn and \ transitions.shouldScanFindBall(player): return player.goLater('scanFindBall') else: if transitions.shouldDribble(player): return player.goNow('dribble') elif transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') return approachBallWalk(player)
def approachBall(player): """ Once we are alligned with the ball, approach it """ if player.firstFrame(): player.hasAlignedOnce = False player.brain.tracker.trackBall() player.brain.CoA.setRobotGait(player.brain.motion) #if player.brain.ball.locDist > constants.APPROACH_ACTIVE_LOC_DIST: if transitions.shouldActiveLoc(player): player.brain.tracker.activeLoc() else: player.brain.tracker.trackBall() if player.penaltyKicking and \ player.ballInOppGoalBox(): return player.goNow('penaltyBallInOppGoalbox') # Switch to other states if we should if player.brain.play.isRole(GOALIE): if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldTurnToBall_ApproachBall(player): return player.goLater('turnToBall') elif not player.brain.tracker.activeLocOn and \ transitions.shouldScanFindBall(player): return player.goLater('scanFindBall') else: if transitions.shouldDribble(player): return player.goNow('dribble') elif transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') return approachBallWalk(player)
def penaltyKickShortDribble(player): if player.firstFrame(): player.penaltyMadeFirstKick = True if transitions.shouldStopPenaltyKickDribbling(player): if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') return ChaseBallStates.approachBallWalk(player)
def penaltyKickShortDribble(player): """ Acts as a layer above dribble for penalty shots. """ if player.firstFrame(): player.penaltyMadeFirstKick = True if transitions.shouldStopPenaltyKickDribbling(player): if transitions.shouldStopBeforeKick(player): return player.goLater("chase") elif transitions.shouldPositionForKick(player): return player.goLater("positionForKick") elif transitions.shouldChaseBall(player): return player.goLater("chase") return player.goLater("dribble")
def dribble(player): """ Keep running at the ball, but dribble """ if player.firstFrame(): player.brain.nav.dribble() # if we should stop dribbling, see what else we should do if transitions.shouldStopDribbling(player): # may not be appropriate due to turned out feet... if transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') return player.stay()
def goalieChase(player): """ TODO: make goalie more aggressive (different transitions?) """ # Check in order of importance if transitions.shouldScanFindBall(player): return player.goNow('scanFindBall') elif transitions.shouldSpinToBallClose(player): return player.goNow('spinToBallClose') elif transitions.shouldStopBeforeKick(player): return player.goNow('stopBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('decideKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') else: return player.goNow('scanFindBall')
def dribble(player): """ Keep running at the ball, but dribble """ if player.firstFrame(): player.brain.CoA.setRobotDribbleGait(player.brain.motion) # if we should stop dribbling, see what else we should do if transitions.shouldStopDribbling(player): if transitions.shouldKick(player): return player.goNow('waitBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('positionForKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') return approachBallWalk(player)
def dribble(player): """ Keep running at the ball, but dribble """ if player.firstFrame(): player.brain.nav.dribble() if transitions.shouldScanFindBallKick(player): return player.goLater('scanFindBall') # if we should stop dribbling, see what else we should do if transitions.shouldStopDribbling(player): # may not be appropriate due to turned out feet... if transitions.shouldStopBeforeKick(player): return player.goLater('stopBeforeKick') if transitions.shouldPositionForKick(player): return player.goLater('decideKick') elif transitions.shouldChaseBall(player): return player.goLater('chase') return player.stay()
def chase(player): """ Super State to determine what to do from various situations """ player.isChasing = True player.hasAlignedOnce = False if player.brain.play.isRole(GOALIE): return player.goNow('goalieChase') # Check in order of importance if transitions.shouldScanFindBall(player): return player.goNow('scanFindBall') elif transitions.shouldStopBeforeKick(player): return player.goNow('stopBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('decideKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') else: return player.goNow('scanFindBall')
def goalieChase(player): """ TODO: make goalie more aggressive (different transitions?) """ # Check in order of importance #tells the goalie what state its in if player.firstFrame(): player.isChasing = True player.isPositioning = False player.isSaving = False if transitions.shouldScanFindBall(player): return player.goNow('scanFindBall') elif transitions.shouldSpinToBallClose(player): return player.goNow('spinToBallClose') elif transitions.shouldStopBeforeKick(player): return player.goNow('stopBeforeKick') elif transitions.shouldPositionForKick(player): return player.goNow('decideKick') elif transitions.shouldApproachBall(player): return player.goNow('approachBall') else: return player.goNow('scanFindBall')