Skip to content

Instantly share code, notes, and snippets.

@4geru
Created February 7, 2017 11:06
Show Gist options
  • Save 4geru/ae2289927b31fa5cc2daa9a877f15fc0 to your computer and use it in GitHub Desktop.
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.
#!/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