low_level_random_kick_agent.py 1.57 KB
Newer Older
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
#!/usr/bin/env python3
# encoding: utf-8

from hfo import *
import argparse
import numpy as np
import math as m
import sys, os
import itertools

def rad_to_deg(rad):
  return rad/m.pi*180
def sign(x):
  return (int(x>=0)-0.5)*2

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--port', type=int, default=6000, help="Server port")
  args=parser.parse_args()

  hfo = HFOEnvironment()
  hfo.connectToServer(LOW_LEVEL_FEATURE_SET,
    '/bin/teams/base/config/formations-dt',
    args.port,'localhost','base_left',False)

  States, Actions, Statuses = [], [], []

  for episode in itertools.count():
    status=IN_GAME
    while status==IN_GAME:
      state = hfo.getState()

      if int(state[12]) == 1: # Kickable = 1
        goal_center_angle = rad_to_deg(m.acos(state[14])) * sign(m.asin(state[13]))
        # turn to goal center
        if abs(goal_center_angle) > 45:
          hfo.act(1, goal_center_angle)
        # kick
        else:
          power = np.random.uniform(0,100)
          hfo.act(3, power, goal_center_angle)
      else: # Kickable = -1
        ball_angle = rad_to_deg(m.acos(state[52])) * sign(m.asin(state[51]))
        # turn to ball
        if abs(ball_angle) > 10:
          hfo.act(1, ball_angle)
        # go to ball
        else:
          power = np.random.uniform(0,100)
          hfo.act(0, power, ball_angle)
        
      status = hfo.step()
    #--------------- end of while loop ------------------------------------------------------

    # Quit if the server goes down
    if status == SERVER_DOWN:
      hfo.act(QUIT)
      break