This commit is contained in:
wty-yy
2025-12-30 15:59:07 +08:00
parent 5a5500668b
commit de7d740012
7 changed files with 46 additions and 26 deletions

View File

@@ -21,6 +21,7 @@ from robogauge.tasks.robots import RobotConfig
from robogauge.tasks.gauge.base_gauge_config import BaseGaugeConfig
from robogauge.tasks.gauge.goal_data import GoalData, VelocityGoal, PositionGoal
from robogauge.tasks.simulator.sim_data import SimData
from robogauge.tasks.gauge.gauge_configs.terrain_levels_config import SEARCH_LEVELS_TERRAINS
from robogauge.tasks.gauge.goals import *
from robogauge.tasks.gauge.metrics import *
@@ -149,7 +150,7 @@ class BaseGauge:
for metric_name, quantiles in self.results[goal].items():
for quantile, val in quantiles.items():
metrics[metric_name][quantile].append(val)
self.results['summary'] = {}
self.results['summary'] = {'quality_score': {}, 'terrain_quality_score': {}}
for metric_name, quantiles in metrics.items():
if metric_name not in self.results['summary']:
self.results['summary'][metric_name] = {}
@@ -157,14 +158,19 @@ class BaseGauge:
mean = float(np.mean(vals))
std = float(np.std(vals))
self.results['summary'][metric_name][quantile] = f"{mean:.4f} ± {std:.4f}"
if metric_name == 'quality_score':
tqs = mean
if self.cfg.assets.terrain_name in SEARCH_LEVELS_TERRAINS:
tqs = 0.09 * (self.cfg.assets.terrain_level - 1) + 0.19 * mean
self.results['summary']['terrain_quality_score'][quantile] = f"{tqs:.4f} ± {std:.4f}"
save_path = Path(logger.log_dir) / "results.yaml"
self.results["terrain_name"] = self.cfg.assets.terrain_name
self.results["terrain_level"] = self.cfg.assets.terrain_level
with open(save_path, 'w') as file:
yaml.dump(self.results, file, allow_unicode=True, sort_keys=False)
with open(save_path, 'w', encoding='utf-8') as file:
yaml_str = yaml.dump(self.results, allow_unicode=True, sort_keys=False)
file.write(yaml_str)
logger.info(
f"""\n{'='*20} Goals and Metrics results {'='*20}\n"""
f"""{yaml_str}"""

View File

@@ -9,6 +9,15 @@
'''
from robogauge.utils.config import Config
QUALITY_WEIGHTS = { # Weights for geometric average, to calculate quality score
'lin_vel_err': 2,
'ang_vel_err': 2,
'dof_limits': 1,
'dof_power': 1,
'orientation_stability': 1,
'torque_smoothness': 1,
}
class BaseGaugeConfig(Config):
gauge_class = 'BaseGauge'
write_tensorboard = False # Whether to write tensorboard logs

View File

@@ -12,6 +12,7 @@ from collections import defaultdict
from robogauge.utils.measure import Average
from robogauge.tasks.gauge.goal_data import GoalData
from robogauge.tasks.simulator.sim_data import SimData
from robogauge.tasks.gauge.base_gauge_config import QUALITY_WEIGHTS
class BaseGoal:
name = 'base_goal'
@@ -21,7 +22,8 @@ class BaseGoal:
self.total = 0 # total tasks
self.sub_name = None
self._goal_mean_metrics = defaultdict(list)
self.goal_metrics = defaultdict(list)
self.goal_quality_scores = []
def pre_get_goal(self) -> bool:
raise NotImplementedError
@@ -42,13 +44,19 @@ class BaseGoal:
def update_metrics(self, metrics: dict):
""" Update step metrics for the current goal."""
quality_score = 1.0
for metric_name, value in metrics.items():
self._goal_mean_metrics[metric_name].append(value)
self.goal_metrics[metric_name].append(value)
quality_score *= min(max(1e-9, value), 1.0) ** QUALITY_WEIGHTS[metric_name]
quality_score = quality_score ** (1.0 / sum(QUALITY_WEIGHTS.values()))
self.goal_quality_scores.append(quality_score)
@property
def goal_mean_metrics(self):
""" Get the mean metrics for the current goal. """
return {k: self._analysis_metrics(v) for k, v in self._goal_mean_metrics.items()}
result = {k: self._analysis_metrics(v) for k, v in self.goal_metrics.items()}
result['quality_score'] = self._analysis_metrics(self.goal_quality_scores)
return result
@staticmethod
def _analysis_metrics(metrics: list):