Commit e415c173 authored by Matthew Hausknecht's avatar Matthew Hausknecht

took HFO from pr9

parent 63820e45
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
# encoding: utf-8 # encoding: utf-8
import subprocess, os, time, numpy, sys import subprocess, os, time, numpy, sys
from signal import SIGKILL
# Global list of all/essential running processes # Global list of all/essential running processes
processes, necProcesses = [], [] processes, necProcesses = [], []
...@@ -11,37 +10,26 @@ SERVER_BIN = 'rcssserver' ...@@ -11,37 +10,26 @@ SERVER_BIN = 'rcssserver'
# Command to run the monitor. Edit as needed. # Command to run the monitor. Edit as needed.
MONITOR_BIN = 'soccerwindow2' MONITOR_BIN = 'soccerwindow2'
def getAgentDirCmd(binary_dir, teamname, server_port=6000, coach_port=6002, def launch(cmd, name = 'Unknown', necessary = True, supressOutput = True):
logDir='log', record=False):
""" Returns the team name, command, and directory to run a team. """
cmd = 'start.sh -t %s -p %i -P %i --log-dir %s'%(teamname, server_port,
coach_port, logDir)
if record:
cmd += ' --record'
cmd = os.path.join(binary_dir, cmd)
return teamname, cmd
def launch(cmd, necessary=True, supressOutput=True, name='Unknown'):
"""Launch a process. """Launch a process.
Appends to list of processes and (optionally) necProcesses if Appends to list of processes and (optionally) necProcesses if
necessary flag is True. necessary flag is True.
Returns: The launched process. Returns: The launched process.
""" """
kwargs = {} kwargs = {}
if supressOutput: if supressOutput:
kwargs = {'stdout':open('/dev/null','w'),'stderr':open('/dev/null','w')} kwargs = {'stdout': open('/dev/null', 'w'),
p = subprocess.Popen(cmd.split(' '),shell=False,**kwargs) 'stderr': open('/dev/null', 'w')}
p = subprocess.Popen(cmd.split(' '), shell = False, **kwargs)
processes.append(p) processes.append(p)
if necessary: if necessary:
necProcesses.append([p,name]) necProcesses.append([p,name])
return p return p
def main(args, team1='left', team2='right', rng=numpy.random.RandomState()): def main(args, team1='left', team2='right', rng=numpy.random.RandomState()):
"""Sets up the teams, launches the server and monitor, starts the """Sets up the teams, launches the server and monitor, starts the trainer.
trainer.
""" """
if args.seed: if args.seed:
print '[start.py] Seeding RNG with seed: ', args.seed print '[start.py] Seeding RNG with seed: ', args.seed
...@@ -65,10 +53,6 @@ def main(args, team1='left', team2='right', rng=numpy.random.RandomState()): ...@@ -65,10 +53,6 @@ def main(args, team1='left', team2='right', rng=numpy.random.RandomState()):
args.logDir, args.logDir, args.logDir, args.logDir,
args.sync, args.sync,
args.fullstate, args.fullstate) args.fullstate, args.fullstate)
team1, team1Cmd = getAgentDirCmd(binary_dir, team1, server_port, coach_port,
args.logDir, args.record)
team2, team2Cmd = getAgentDirCmd(binary_dir, team2, server_port, coach_port,
args.logDir, args.record)
try: try:
# Launch the Server # Launch the Server
server = launch(serverCommand + serverOptions, name='server') server = launch(serverCommand + serverOptions, name='server')
...@@ -85,27 +69,23 @@ def main(args, team1='left', team2='right', rng=numpy.random.RandomState()): ...@@ -85,27 +69,23 @@ def main(args, team1='left', team2='right', rng=numpy.random.RandomState()):
trainer = Trainer(args=args, rng=rng, server_port=server_port, trainer = Trainer(args=args, rng=rng, server_port=server_port,
coach_port=coach_port) coach_port=coach_port)
trainer.initComm() trainer.initComm()
# Start Team1 # Add Team1
launch(team1Cmd,False) trainer.addTeam(team1)
trainer.waitOnTeam(True) # wait to make sure of team order # Add Team2
# Start Team2 trainer.addTeam(team2)
launch(team2Cmd,False) # Run
trainer.waitOnTeam(False)
# Make sure all players are connected
trainer.checkIfAllPlayersConnected()
trainer.setTeams()
# Run HFO
trainer.run(necProcesses) trainer.run(necProcesses)
except KeyboardInterrupt: except KeyboardInterrupt:
print '[start.py] Exiting for CTRL-C' print '[start.py] Exiting for CTRL-C'
finally: finally:
print '[start.py] Cleaning up server and other processes' print '[start.py] Cleaning up server and other processes'
for p in processes: for p in reversed(processes):
try: try:
p.send_signal(SIGKILL) p.terminate()
time.sleep(0.1)
p.kill()
except: except:
pass pass
time.sleep(0.1)
def parseArgs(): def parseArgs():
import argparse import argparse
...@@ -145,10 +125,26 @@ def parseArgs(): ...@@ -145,10 +125,26 @@ def parseArgs():
p.add_argument('--seed', dest='seed', type=int, p.add_argument('--seed', dest='seed', type=int,
help='Seed the trainer\'s RNG. Default: time.') help='Seed the trainer\'s RNG. Default: time.')
args = p.parse_args() args = p.parse_args()
assert args.offenseAgents + args.offenseNPCs in xrange(0, 11), \ if args.offenseAgents not in xrange(0, 11):
'Invalid number of offensive players: (choose from [0,10])' p.error('argument --offense-agents: invalid choice: '\
assert args.defenseAgents + args.defenseNPCs in xrange(0, 12), \ + str(args.offenseAgents) + ' (choose from [0-10])')
'Invalid number of defensive players: (choose from [0,11])' if args.offenseNPCs not in xrange(0, 11):
p.error('argument --offense-npcs: invalid choice: '\
+ str(args.offenseNPCs) + ' (choose from [0-10])')
if args.defenseAgents not in xrange(0, 12):
p.error('argument --defense-agents: invalid choice: '\
+ str(args.defenseAgents) + ' (choose from [0-11])')
if args.defenseNPCs not in xrange(0, 12):
p.error('argument --offense-npcs: invalid choice: '\
+ str(args.defenseNPCs) + ' (choose from [0-11])')
if args.offenseAgents + args.offenseNPCs not in xrange(1, 11):
p.error('Offense players (offense-agents + offense-npcs): '\
'invalid choice: ' + str(args.offenseAgents + args.offenseNPCs) +\
' (choose from [1,10])')
if args.defenseAgents + args.defenseNPCs not in xrange(0, 12):
p.error('Defense players (defense-agents + defense-npcs): '\
'invalid choice: ' + str(args.defenseAgents + args.defenseNPCs) +\
' (choose from [0,11])')
return args return args
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment