00001
00002
00003 from optparse import OptionParser
00004 import os
00005 import subprocess
00006 import shutil
00007
00008
00009
00010 class Configuration(object):
00011 def __init__(self, configfile):
00012 assert(len(configfile) > 0)
00013 self.config = configfile
00014
00015 root,ext = os.path.splitext(configfile)
00016 assert(len(root) > 0)
00017 self.name = os.path.basename(root)
00018 assert(len(self.name) > 0)
00019 def dump(self):
00020 print "Config \"%s\" at %s" % (self.name, self.config)
00021 def set(self):
00022 """ Set config in ROS for planner call """
00023 cmd = "rosparam load %s /tfd_modules" % self.config
00024 code = os.system(cmd)
00025 assert(code == 0)
00026
00027 class Problem(object):
00028 def __init__(self, path, domain, problem):
00029 self.domain = domain
00030 self.problem = problem
00031 self.path = path
00032 def dump(self):
00033 print "Base path: %s Domain: %s, Problem: %s" % (self.path, self.domain, self.problem)
00034 def run(self, outdir):
00035
00036 probDir = os.path.join(outdir, self.path)
00037 if not os.path.exists(probDir):
00038 os.makedirs(probDir)
00039
00040
00041 pipe = subprocess.Popen(["rospack", "find", "planner_benchmarks"], stdout=subprocess.PIPE)
00042 base_path = pipe.communicate()[0].strip()
00043
00044 domain_path = os.path.join(base_path, self.path, self.domain)
00045 problem_path = os.path.join(base_path, self.path, self.problem)
00046
00047
00048 cmd = "rosparam set /tfd_modules/plan_name %s" % (os.path.join(outdir, self.path, "plan." + self.problem))
00049 code = os.system(cmd)
00050 assert(code == 0)
00051 cmd = "rosparam set /tfd_modules/time_debug_file %s" % (os.path.join(outdir, self.path, "times." + self.problem))
00052 code = os.system(cmd)
00053 assert(code == 0)
00054
00055 print "Exec run for %s, %s" % (domain_path, problem_path)
00056
00057
00058 cmd = "rosrun tfd_modules tfd_plan %s %s" % \
00059 (domain_path, problem_path)
00060
00061
00062 code = os.system(cmd)
00063 print "%s run with %d" % (self.problem, code)
00064 def parse(line):
00065 dp = line.split()
00066 assert(len(dp) == 3)
00067 return Problem(dp[0], dp[1], dp[2])
00068 parse = staticmethod(parse)
00069
00070
00071 def main():
00072 parser = OptionParser("usage: %prog PROBLEMS")
00073 parser.add_option("-p", "--problems", dest="problems", type="string", action="store")
00074
00075 parser.add_option("-r", "--results-dir", dest="results_dir", type="string", action="store")
00076 parser.add_option("-c", "--config", dest="config", type="string", action="store")
00077 opts, args = parser.parse_args()
00078 print "Problems file: %s" % opts.problems
00079 print "Results dir: %s" % opts.results_dir
00080
00081 config = Configuration(opts.config)
00082 config.dump()
00083 config.set()
00084
00085 problems = []
00086 with open(opts.problems) as f:
00087 for line in f:
00088 prob = Problem.parse(line)
00089 problems.append(prob)
00090 for i in problems:
00091 i.dump()
00092
00093 if not os.path.exists(opts.results_dir):
00094 os.mkdir(opts.results_dir)
00095 outdir = os.path.join(opts.results_dir, config.name)
00096 if os.path.exists(outdir):
00097 print "WARNING outdir %s already exists!" % outdir
00098 else:
00099 os.mkdir(outdir)
00100
00101
00102 shutil.copy(config.config, outdir)
00103
00104 pipe = subprocess.Popen(["rospack", "find", "tfd_modules"], stdout=subprocess.PIPE)
00105 tfd_path = pipe.communicate()[0].strip()
00106 shutil.copy(os.path.join(tfd_path, "scripts/tfd_plan"), outdir)
00107
00108
00109 for num, i in enumerate(problems):
00110 print "Running: %s: %s - %s (%.1f %%)" % (i.path, i.domain, i.problem, 100.0*num/len(problems))
00111 i.run(outdir)
00112
00113 if __name__ == "__main__":
00114 main()
00115