From a82f3d8930ed27a0b1702bbd18e261e27156cfce Mon Sep 17 00:00:00 2001 From: wty-yy <993660140@qq.com> Date: Sat, 10 Jan 2026 02:11:44 +0800 Subject: [PATCH] v1.1.0; fix metrics bugs --- UPDATE.md | 7 +++++++ robogauge/tasks/custom/go2/go2_flat_task.py | 2 +- robogauge/tasks/custom/go2/go2_obstacle_task.py | 2 +- robogauge/tasks/custom/go2/go2_slope_task.py | 4 ++-- robogauge/tasks/custom/go2/go2_stairs_task.py | 4 ++-- robogauge/tasks/custom/go2/go2_wave_task.py | 2 +- robogauge/tasks/gauge/metrics/dof_metrics.py | 13 +++++++++++-- robogauge/tasks/gauge/metrics/stable_metric.py | 7 ++++--- robogauge/tasks/pipeline/base_pipeline.py | 2 +- setup.py | 2 +- 10 files changed, 31 insertions(+), 14 deletions(-) diff --git a/UPDATE.md b/UPDATE.md index 6bf0bba..f770da6 100644 --- a/UPDATE.md +++ b/UPDATE.md @@ -1,4 +1,11 @@ # UPDATE +## 20260110 +### v1.1.0 +1. 修复三个Metric计算错误 + 1. DofLimitsMetric中soft_lower_limit, soft_upper_limit范围计算错误,通过原来比例为0.7但是按照整个范围对单边做限制,修改为0.4比例等价之前的限制,表示关节超过总范围的40%开始惩罚 + 2. OrientationStabilityMetric中错误将roll计算成了pitch,修改为正确的roll计算,不然slope会一直扣分 + 3. TorqueSmoothnessMetric计算错误,之前的last_torque一直忘记更新了,完全错误,修改为上一步的torque +2. 修复delay action中actions_start_decimation随机数范围错误,之前是[0, frame_skip],修改为[0, frame_skip-1],避免出现不执行action的bug ## 20260106 ### v1.0.5 1. `robogauge/scripts/server.py`加入`--port`设置端口配置选项, 加入`--num-processes`设置并行进程数量 diff --git a/robogauge/tasks/custom/go2/go2_flat_task.py b/robogauge/tasks/custom/go2/go2_flat_task.py index 7264f43..fe38396 100644 --- a/robogauge/tasks/custom/go2/go2_flat_task.py +++ b/robogauge/tasks/custom/go2/go2_flat_task.py @@ -14,7 +14,7 @@ class Go2FlatGaugeConfig(FlatGaugeConfig): class metrics(FlatGaugeConfig.metrics): class dof_limits(FlatGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all class goals(FlatGaugeConfig.goals): diff --git a/robogauge/tasks/custom/go2/go2_obstacle_task.py b/robogauge/tasks/custom/go2/go2_obstacle_task.py index a2b3aa9..8b6c655 100644 --- a/robogauge/tasks/custom/go2/go2_obstacle_task.py +++ b/robogauge/tasks/custom/go2/go2_obstacle_task.py @@ -14,5 +14,5 @@ class Go2ObstacleGaugeConfig(ObstacleGaugeConfig): class metrics(ObstacleGaugeConfig.metrics): class dof_limits(ObstacleGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all diff --git a/robogauge/tasks/custom/go2/go2_slope_task.py b/robogauge/tasks/custom/go2/go2_slope_task.py index a3d47ab..2f8bdac 100644 --- a/robogauge/tasks/custom/go2/go2_slope_task.py +++ b/robogauge/tasks/custom/go2/go2_slope_task.py @@ -14,12 +14,12 @@ class Go2SlopeForwardGaugeConfig(SlopeForwardGaugeConfig): class metrics(SlopeForwardGaugeConfig.metrics): class dof_limits(SlopeForwardGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all class Go2SlopeBackwardGaugeConfig(SlopeBackwardGaugeConfig): class metrics(SlopeBackwardGaugeConfig.metrics): class dof_limits(SlopeBackwardGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all diff --git a/robogauge/tasks/custom/go2/go2_stairs_task.py b/robogauge/tasks/custom/go2/go2_stairs_task.py index fc82678..c75bbe6 100644 --- a/robogauge/tasks/custom/go2/go2_stairs_task.py +++ b/robogauge/tasks/custom/go2/go2_stairs_task.py @@ -14,12 +14,12 @@ class Go2StairsForwardGaugeConfig(StairsForwardGaugeConfig): class metrics(StairsForwardGaugeConfig.metrics): class dof_limits(StairsForwardGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all class Go2StairsBackwardGaugeConfig(StairsBackwardGaugeConfig): class metrics(StairsBackwardGaugeConfig.metrics): class dof_limits(StairsBackwardGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all diff --git a/robogauge/tasks/custom/go2/go2_wave_task.py b/robogauge/tasks/custom/go2/go2_wave_task.py index c52cd16..ca4a680 100644 --- a/robogauge/tasks/custom/go2/go2_wave_task.py +++ b/robogauge/tasks/custom/go2/go2_wave_task.py @@ -14,5 +14,5 @@ class Go2WaveGaugeConfig(WaveGaugeConfig): class metrics(WaveGaugeConfig.metrics): class dof_limits(WaveGaugeConfig.metrics.dof_limits): enabled = True - soft_dof_limit_ratio = 0.7 + soft_dof_limit_ratio = 0.4 dof_names = ['hip', 'thigh'] # List of DOF names to monitor, None for all diff --git a/robogauge/tasks/gauge/metrics/dof_metrics.py b/robogauge/tasks/gauge/metrics/dof_metrics.py index bc4816b..24bcdb8 100644 --- a/robogauge/tasks/gauge/metrics/dof_metrics.py +++ b/robogauge/tasks/gauge/metrics/dof_metrics.py @@ -35,8 +35,12 @@ class DofLimitsMetric(BaseMetric): lower_limit = sim_data.proprio.joint.limits[i, 0] upper_limit = sim_data.proprio.joint.limits[i, 1] dof_range = upper_limit - lower_limit - soft_lower_limit = lower_limit + (1 - self.soft_dof_limit_ratio) * dof_range - soft_upper_limit = upper_limit - (1 - self.soft_dof_limit_ratio) * dof_range + if dof_range <= 1e-6: + logger.warning(f"DOF range for {sim_data.proprio.joint.names[i]} is too small ({dof_range:.6f}), skipping metric calculation.") + continue + + soft_lower_limit = lower_limit + (1 - self.soft_dof_limit_ratio) * dof_range / 2 + soft_upper_limit = upper_limit - (1 - self.soft_dof_limit_ratio) * dof_range / 2 pos = sim_data.proprio.joint.pos[i] dof_name = sim_data.proprio.joint.names[i] @@ -53,6 +57,11 @@ class DofLimitsMetric(BaseMetric): values.append(value) else: values.append(value) + + if len(values) == 0: + logger.warning("No DOF limit values calculated, returning 0.0.") + return 0.0 + rms_value = 1 - np.sqrt(np.mean(np.square(values))) logger.log(1 - rms_value, f'dof_limits/rms', step=sim_data.n_step) return rms_value diff --git a/robogauge/tasks/gauge/metrics/stable_metric.py b/robogauge/tasks/gauge/metrics/stable_metric.py index 024a3fb..d5d0ef6 100644 --- a/robogauge/tasks/gauge/metrics/stable_metric.py +++ b/robogauge/tasks/gauge/metrics/stable_metric.py @@ -28,9 +28,9 @@ class OrientationStabilityMetric(BaseMetric): def __call__(self, sim_data: SimData, goal_data: GoalData) -> float: projected_gravity = get_projected_gravity(sim_data.proprio.base.quat) - projected_x = projected_gravity[0] - metric_value = 1 - abs(projected_x) # consider roll only - logger.log(abs(projected_x), f'stable_metric/projected_x_abs', step=sim_data.n_step) + projected_y = projected_gravity[1] + metric_value = 1 - abs(projected_y) # consider roll only + logger.log(abs(projected_y), f'stable_metric/projected_y_abs', step=sim_data.n_step) return metric_value class TorqueSmoothnessMetric(BaseMetric): @@ -55,6 +55,7 @@ class TorqueSmoothnessMetric(BaseMetric): self.last_torque = current_torque return 1.0 # No change at first step torque_diff = current_torque - self.last_torque + self.last_torque = current_torque rms_value = np.sqrt(np.mean(np.square(torque_diff))) metric_value = 1.0 - rms_value / self.scaling_factor logger.log(rms_value, f'stable_metric/torque_rms_diff', step=sim_data.n_step) diff --git a/robogauge/tasks/pipeline/base_pipeline.py b/robogauge/tasks/pipeline/base_pipeline.py index 1f44960..dc6ddbe 100644 --- a/robogauge/tasks/pipeline/base_pipeline.py +++ b/robogauge/tasks/pipeline/base_pipeline.py @@ -101,7 +101,7 @@ class BasePipeline: action, p_gains, d_gains, control_type = self.robot.get_action(obs) if self.sim_cfg.domain_rand.action_delay: - actions_start_decimation = random.randint(0, frame_skip) + actions_start_decimation = random.randint(0, frame_skip - 1) else: self.sim.setup_action(action, p_gains, d_gains, control_type) for i in range(frame_skip): diff --git a/setup.py b/setup.py index 9fb93c5..fca4209 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="robogauge", # 包名 - version="1.0.5", # 版本号 + version="1.1.0", # 版本号 author="Wu Tianyang", # 你的名字 author_email="993660140@qq.com", description="A generic robot RL model evaluation library based on MuJoCo",