v0.1.5
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
- Class to dict conversion
|
||||
- Path parsing
|
||||
'''
|
||||
import yaml
|
||||
from argparse import ArgumentParser
|
||||
from pathlib import Path
|
||||
from robogauge import ROBOGAUGE_ROOT_DIR
|
||||
@@ -49,6 +50,8 @@ def parse_args():
|
||||
parameters = [
|
||||
{"name": "--task-name", "type": str, "default": "base", "help": "Name of the task to run."},
|
||||
{"name": "--experiment-name", "type": str, "help": "Name of the experiment to run."},
|
||||
{"name": "--run-name", "type": str, "default": "run1", "help": "Name of the run."},
|
||||
{"name": "--model-path", "type": str, "help": "Path to the model file."},
|
||||
{"name": "--headless", "action": "store_true", "default": False, "help": "Run in headless mode."},
|
||||
{"name": "--save-video", "action": "store_true", "default": False, "help": "Save video output."},
|
||||
]
|
||||
@@ -56,5 +59,5 @@ def parse_args():
|
||||
parser.add_argument(param['name'], **{k: v for k, v in param.items() if k != 'name'})
|
||||
args = parser.parse_args()
|
||||
if args.experiment_name is None:
|
||||
args.experiment_name = f"{args.task_name}_exp"
|
||||
args.experiment_name = f"exp"
|
||||
return args
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
import time
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from robogauge import ROBOGAUGE_ROOT_DIR
|
||||
from robogauge import ROBOGAUGE_LOGS_DIR
|
||||
from torch.utils.tensorboard import SummaryWriter
|
||||
|
||||
class LogColor:
|
||||
@@ -56,6 +56,7 @@ class Logger:
|
||||
|
||||
def create(self,
|
||||
experiment_name,
|
||||
run_name,
|
||||
console_output=True, color_output=True,
|
||||
log_level=logging.DEBUG, save_file_mode='a'
|
||||
):
|
||||
@@ -75,6 +76,9 @@ class Logger:
|
||||
self.logger = logging.getLogger(experiment_name + "_logger")
|
||||
self.logger.setLevel(log_level)
|
||||
self.logger.propagate = False
|
||||
self.time_tag = time.strftime("%Y%m%d-%H-%M-%S")
|
||||
self.tag = f"{self.time_tag}_{run_name}"
|
||||
self.experiment_name = experiment_name
|
||||
|
||||
console_formatter = ColorFormatter( # console output format
|
||||
fmt="%(asctime)s - %(color_level)s - %(filename)s:%(lineno)d - %(message)s",
|
||||
@@ -91,19 +95,21 @@ class Logger:
|
||||
sh.setFormatter(console_formatter)
|
||||
self.logger.addHandler(sh)
|
||||
|
||||
self.log_dir = Path(ROBOGAUGE_ROOT_DIR) / "logs" / experiment_name / time.strftime("%Y%m%d-%H-%M-%S")
|
||||
self.log_dir = Path(ROBOGAUGE_LOGS_DIR) / experiment_name / self.tag
|
||||
self.log_dir.mkdir(parents=True, exist_ok=True)
|
||||
path_log_file = self.log_dir / "stdout.log"
|
||||
if path_log_file:
|
||||
fh = logging.FileHandler(path_log_file, mode=save_file_mode, encoding='utf-8')
|
||||
fh.setFormatter(file_formatter)
|
||||
self.logger.addHandler(fh)
|
||||
self.info(f"Logs saved at: {path_log_file}")
|
||||
|
||||
def create_tensorboard(self, run_name: str):
|
||||
def create_tensorboard(self, robot_name: str, model_name: str, goal_name: str):
|
||||
if self.writer is not None:
|
||||
self.writer.close()
|
||||
self.writer = SummaryWriter(str(self.log_dir / run_name))
|
||||
self.info(f"Tensorboard writer created at: {self.log_dir / run_name}")
|
||||
data_path = Path(ROBOGAUGE_LOGS_DIR) / self.experiment_name / 'data' / robot_name / model_name / goal_name / self.tag
|
||||
self.writer = SummaryWriter(str(data_path))
|
||||
self.info(f"Tensorboard writer created at: {data_path}")
|
||||
|
||||
def debug(self, msg, *args, **kwargs):
|
||||
self.logger.debug(msg, *args, **kwargs, stacklevel=2)
|
||||
|
||||
13
robogauge/utils/measure.py
Normal file
13
robogauge/utils/measure.py
Normal file
@@ -0,0 +1,13 @@
|
||||
class Average:
|
||||
def __init__(self):
|
||||
self.avg = 0.0
|
||||
self.count = 0
|
||||
|
||||
def update(self, value: float):
|
||||
self.avg += (value - self.avg) / (self.count + 1)
|
||||
self.count += 1
|
||||
return self.avg
|
||||
|
||||
@property
|
||||
def mean(self):
|
||||
return self.avg
|
||||
@@ -7,6 +7,8 @@
|
||||
@Blog : https://wty-yy.github.io/
|
||||
@Desc : Task Registration Utility
|
||||
'''
|
||||
from robogauge.utils.helpers import parse_args
|
||||
|
||||
class TaskRegister():
|
||||
def __init__(self):
|
||||
self.pipeline_classes = {}
|
||||
@@ -33,8 +35,10 @@ class TaskRegister():
|
||||
robot_cfg = self.robot_cfgs[name]
|
||||
return sim_cfg, gauger_cfg, robot_cfg
|
||||
|
||||
def make_pipeline(self, name, args=None, sim_cfg=None, gauger_cfg=None, robot_cfg=None, run_name='0'):
|
||||
default_cfgs = self.get_cfgs(name)
|
||||
def make_pipeline(self, args=None, sim_cfg=None, gauger_cfg=None, robot_cfg=None):
|
||||
if args is None:
|
||||
args = parse_args()
|
||||
default_cfgs = self.get_cfgs(args.task_name)
|
||||
if sim_cfg is None:
|
||||
sim_cfg = default_cfgs[0]
|
||||
if gauger_cfg is None:
|
||||
@@ -43,10 +47,12 @@ class TaskRegister():
|
||||
robot_cfg = default_cfgs[2]
|
||||
if args is not None:
|
||||
self.update_args_to_cfg(sim_cfg, gauger_cfg, robot_cfg, args)
|
||||
pipeline_class = self.get_pipeline_class(name)
|
||||
return pipeline_class(run_name, sim_cfg, robot_cfg, gauger_cfg)
|
||||
pipeline_class = self.get_pipeline_class(args.task_name)
|
||||
return pipeline_class(args.run_name, sim_cfg, robot_cfg, gauger_cfg)
|
||||
|
||||
def update_args_to_cfg(self, sim_cfg, gauger_cfg, robot_cfg, args):
|
||||
if args.model_path is not None:
|
||||
robot_cfg.control.model_path = args.model_path
|
||||
if args.headless is not None:
|
||||
sim_cfg.viewer.headless = args.headless
|
||||
if args.save_video is not None:
|
||||
|
||||
Reference in New Issue
Block a user