Created
February 7, 2017 11:06
-
-
Save 4geru/ae2289927b31fa5cc2daa9a877f15fc0 to your computer and use it in GitHub Desktop.
It is the source code used for data analysis with Ri-one participating in the RoboCup simulation league.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import sys | |
import re | |
import pylab | |
import math | |
import copy | |
import glob | |
file_name = "" | |
class grid: | |
def __init__(self,x=0,y=0): | |
self.x = float(x) | |
self.y = float(y) | |
def getX(self): | |
return self.x | |
def getY(self): | |
return self.y | |
def show(self): | |
return "{0}\t,{1}".format(self.x,self.y) | |
def get_team_name(logfile): | |
logfile = logfile.split(".") | |
logfile = logfile[0] | |
team_name = [] | |
logfile = re.sub(r'^[0-9]*-', '', logfile) | |
logfile = re.sub(r'_[0-9].*-vs-|_[0-9]', ' ', logfile) | |
team_name = logfile.split() | |
return team_name | |
def initial_data(cycle): | |
save = [] | |
b = {"begin":grid(),"end":grid()} # ball begin position, end position | |
cycle = {"begin":int(cycle),"end":0} | |
distance = 0 | |
kicker = {"number":0,"team":"left"} # holder number, begin position, end position | |
receiver = {"number":0,"team":"left"} # receiver number, begin position, end position | |
mate = {"position":[]} ; opp = {"position":[]} | |
for i in range(12): | |
mate["position"].append(grid()) # mate position | |
opp["position"].append(grid()) # opp position | |
save = {\ | |
"cycle" : cycle,\ | |
"ball" : b,\ | |
"kicker" : kicker,\ | |
"receiver" : receiver,\ | |
"distance" : distance,\ | |
"mate" : mate,\ | |
"oppsite" : opp\ | |
} | |
return save | |
def judge_side(side): | |
return "Left" if get_team_name(file_name)[0]==side else "Right" | |
def get_distance(gridA,gridB): | |
return math.sqrt( pow(gridA.getX() - gridB.getX(),2) + \ | |
pow(gridA.getY() - gridB.getY(),2) ) | |
def printFied(): | |
color = "w" | |
x = [-52.5,-52.5,52.5,52.5,-52.5,0,0] | |
y = [-34.0,34.0,34.0,-34.0,-34.0,-34.0,34.0] | |
pylab.plot(x,y,color) | |
x = [52.5,35.5,35.5,52.5,52.5,47.0,47.0,52.5,52.5,54.0,54.0,52.5] | |
y = [20.0,20.0,-20.0,-20.0,9.5,9.5,-9.5,-9.5,7.0,7.0,-7.0,-7.0] | |
z = [] | |
for i in x : z.append(-i) | |
pylab.plot(x,y,color) | |
pylab.plot(z,y,color) | |
r = 9.15 | |
x = [] ; y = [] | |
pi = round(2*math.acos(-1),2)*1000 | |
for i in range(0,int(pi)): | |
u = i/1000.0 | |
x.append(r*math.sin(u)) ; y.append(r*math.cos(u)) | |
pylab.plot(x,y,color) | |
pylab.axvspan(-100,100, color='green', alpha=1) | |
pylab.xlim(-57, 57) ; pylab.ylim(37,-37) | |
def plot_data(ary): | |
x = [] ; y = [] | |
for item in ary: | |
x.append(item.getX()) | |
y.append(item.getY()) | |
return [x,y] | |
def select_through_pass(file_name): | |
game_line = "" | |
rcl_name = file_name + ".rcl" | |
rcg_name = file_name + ".rcg" | |
rcl = open(rcl_name, 'r') | |
gl = 0 ; last_player = '-1' | |
kicks = {} | |
for i in rcl: | |
i = re.split(r'[\(\) ,\t]', i) | |
k = 0 | |
j = i[3].split('_') | |
team = j[0] | |
player = j[len(j)-1].replace(":","") | |
for j in range(len(i)): | |
if i[j] == "kick": | |
kicks[i[0]] = [team,player] | |
datas = [initial_data(0)] ; side = "None" | |
data = initial_data(0) | |
rcg = open(rcg_name, 'r') | |
for i in rcg: | |
i = re.split(r'[\) ,\t]', i) | |
if i[0] != "(show": | |
in_pass = False | |
continue | |
elif int(i[1]) % 1000 == 0: | |
print i[1] | |
elif int(i[1]) == 2999: | |
print int(i[1]) + 1 | |
if kicks.has_key(i[1]): # キックリストに入っているか | |
#print kicks[i[1]] | |
data["cycle"]["end"] = int(i[1]) # ファイルの更新 | |
data["ball"]["end"] = grid(i[4],i[5]) | |
data["receiver"]["team"],data["receiver"]["number"] = kicks[i[1]] | |
# データの追加 | |
if(data["kicker"]["team"] != "left"): # 左側のチームがキッカーの時 | |
datas.append(data) | |
length = len(datas) - 1 | |
#print "{0} {1}->{2} {3}".format(datas[length]["kicker"]["team"],datas[length]["kicker"]["number"],datas[length]["receiver"]["team"],datas[length]["receiver"]["number"]) | |
kicker_side = "mate" if judge_side(datas[length]["kicker"]["team"]) == "Left" else "oppsite" | |
receiver_side = "mate" if judge_side(datas[length]["receiver"]["team"]) == "Left" else "oppsite" | |
kicker_number = int(datas[length]["kicker"]["number"])-1 | |
receiver_number = int(datas[length]["receiver"]["number"])-1 | |
if datas[length][receiver_side]["position"][receiver_number].getX() - datas[length-1][receiver_side]["position"][receiver_number].getX() > 15 and\ | |
datas[length][receiver_side]["position"][receiver_number].getX() > 0 and in_pass: | |
_begin = datas[length-1]["ball"]["begin"] | |
_end = datas[length-1]["ball"]["end"] | |
x,y = plot_data([_begin,_end]) | |
_begin.show() | |
_end.show() | |
_receiver = datas[length-k-1][receiver_side]["position"][receiver_number] | |
_kicker = datas[length-k-1][kicker_side]["position"][kicker_number] | |
mi = sys.maxint | |
for l in range(11): | |
distance = get_distance(_receiver,datas[length-k-1]["oppsite"]["position"][l]) | |
mi = min(mi,distance) | |
game_line += _receiver.show() + "\t," + _kicker.show() + "\t," + str(mi) + "\t,1\n" | |
pylab.plot(x,y,"w-o") | |
k = 1 ; cnt = 2 | |
while cnt < 5: | |
k += 1 | |
kicker_side = "mate" if judge_side(datas[length-k]["kicker"]["team"]) == "Left" else "oppsite" | |
receiver_side = "mate" if judge_side(datas[length-k]["receiver"]["team"]) == "Left" else "oppsite" | |
kicker_number = int(datas[length-k]["kicker"]["number"])-1 | |
receiver_number = int(datas[length-k]["receiver"]["number"])-1 | |
if kicker_side == receiver_side and kicker_number == receiver_number: | |
x,y = plot_data([datas[length-k]["ball"]["begin"],datas[length-k]["ball"]["end"]]) | |
continue | |
_begin = datas[length-k]["ball"]["begin"] | |
_end = datas[length-k]["ball"]["end"] | |
x,y = plot_data([_begin,_end]) | |
_receiver = datas[length-k-1][receiver_side]["position"][receiver_number] | |
_kicker = datas[length-k-1][kicker_side]["position"][kicker_number] | |
mi = sys.maxint | |
for l in range(11): | |
distance = get_distance(_receiver,datas[length-k-1]["oppsite"]["position"][l]) | |
mi = min(mi,distance) | |
game_line += _receiver.show() + "\t," + _kicker.show() + "\t," + str(mi) + "\t,1\n" | |
pylab.plot(x,y,"b-o") | |
cnt += 1 | |
elif kicker_side == receiver_side and kicker_number != receiver_number and in_pass and length > 1: | |
_begin = datas[length-1]["ball"]["begin"] | |
_end = datas[length-1]["ball"]["end"] | |
_kicker_info = datas[length-1]["kicker"] | |
_receiver_info = datas[length-1]["receiver"] | |
kicker_side = "mate" if judge_side(_kicker_info["team"]) == "Left" else "oppsite" | |
receiver_side = "mate" if judge_side(_receiver_info["team"]) == "Left" else "oppsite" | |
kicker_number = int(_kicker_info["number"])-1 | |
receiver_number = int(_receiver_info["number"])-1 | |
_receiver = datas[length-k-1][receiver_side]["position"][receiver_number] | |
_kicker = datas[length-k-1][kicker_side]["position"][kicker_number] | |
mi = sys.maxint | |
for l in range(11): | |
distance = get_distance(_receiver,datas[length-1]["oppsite"]["position"][l]) | |
mi = min(mi,distance) | |
game_line += _receiver.show() + "\t," + _kicker.show() + "\t," + str(mi) + "\t,0\n" | |
x,y = plot_data([_begin,_end]) | |
pylab.plot(x,y,"r-o") | |
# 次のファイルの作成 | |
save = [copy.deepcopy(data["ball"]["end"]),copy.deepcopy(data["kicker"])] | |
data = initial_data(i[1]) | |
data["kicker"]["team"],data["kicker"]["number"] = kicks[i[1]] | |
data["ball"]["begin"],data["receiver"] = save | |
for j in range(len(i)): | |
if i[j] == "((l" : | |
data["mate"]["position"][int(i[j+1])-1] = grid(i[j+5],i[j+6]) | |
if i[j] == "((r" : | |
data["oppsite"]["position"][int(i[j+1])-1] = grid(i[j+5],i[j+6]) | |
in_pass = True | |
return game_line | |
if __name__ == '__main__': | |
argvs = sys.argv | |
argc = len(argvs) | |
if argc != 2: | |
print "error" | |
sys.exit() | |
argvs = sys.argv | |
argc = len(argvs) | |
f = open("through_pas.csv","w") | |
logfiles = glob.glob('*'+argvs[1]+'*.rcg') | |
for logfile in logfiles: | |
logfile = logfile.split(".")[0] | |
file_name = logfile.split(".")[0] | |
print logfile | |
f.write(select_through_pass(logfile)) | |
f.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment