73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
"""
|
|
ml/run_eval_training.py - Benchmark reward system across all curriculum phases.
|
|
"""
|
|
import time
|
|
import numpy as np
|
|
from ml.env import JackBotEnv, CurriculumPhase
|
|
import sys
|
|
from pathlib import Path
|
|
sys.path.append(str(Path(__file__).resolve().parent.parent))
|
|
|
|
def evaluate_kinematics(episode_length: int = 1000):
|
|
env = JackBotEnv(
|
|
use_gui=True,
|
|
random_command=False,
|
|
max_episode_steps=episode_length,
|
|
robot_mode="kinematics"
|
|
)
|
|
|
|
print("\n" + "=" * 70)
|
|
print(" RUNNING MULTI-PHASE REWARD BENCHMARK (KINEMATICS MODE)")
|
|
print("=" * 70 + "\n")
|
|
|
|
phase_configs = [
|
|
(CurriculumPhase.STAND_ONLY, "STAND", np.array([1.0, 0.0, 0.0], dtype=np.float32)),
|
|
(CurriculumPhase.FORWARD, "FORWARD GAIT", np.array([1.0, 0.0, 0.0], dtype=np.float32)),
|
|
(CurriculumPhase.TURN_AND_DIRECTION, "FORWARD + YAW TURN", np.array([0.5, 0.0, 0.4], dtype=np.float32)),
|
|
(CurriculumPhase.OMNI_DIRECTION, "STRIDE LATERAL", np.array([0.5, 0.5, 0.0], dtype=np.float32)),
|
|
(CurriculumPhase.FULL_COMMAND, "FULL OMNI COMBINATION",np.array([0.3, 0.2, 0.3], dtype=np.float32)),
|
|
]
|
|
|
|
for phase_enum, label, cmd in phase_configs:
|
|
obs, _ = env.reset()
|
|
|
|
env.curriculum_phase = phase_enum
|
|
env.command = cmd.copy()
|
|
|
|
done = False
|
|
total_reward = 0.0
|
|
step_count = 0
|
|
|
|
while not done:
|
|
dummy_action = np.zeros(18, dtype=np.float32)
|
|
obs, reward, terminated, truncated, _ = env.step(dummy_action)
|
|
total_reward += reward
|
|
step_count += 1
|
|
done = terminated or truncated
|
|
|
|
time.sleep(1.0 / 60.0)
|
|
|
|
comp_averages = env.get_reward_component_averages()
|
|
|
|
print(f"\n--- Episode Stage: [{phase_enum.name}] ({label}) ---")
|
|
print(f"Command Applied: vx={cmd[0]:.2f}, vy={cmd[1]:.2f}, yaw={cmd[2]:.2f}")
|
|
print(f"Total Episode Reward: {total_reward:.4f}")
|
|
print("Component Step Averages:")
|
|
for name, value in comp_averages.items():
|
|
print(f" • {name:<20}: {value:+.5f}")
|
|
|
|
metrics = env.get_current_robot_metrics()
|
|
dist = metrics[0]["distance_from_start"] if metrics else 0.0
|
|
speed = metrics[0]["speed"] if metrics else 0.0
|
|
avg_reward = total_reward / max(1, step_count)
|
|
|
|
print(f" ├─ Average Reward / Step: {avg_reward:.4f}")
|
|
print(f" ├─ Distance Travelled: {dist:.2f} m")
|
|
print(f" ├─ Actual Avg Speed: {speed:.2f} m/s")
|
|
print(f" └─ Steps Survived: {step_count} / {episode_length}")
|
|
print("-" * 70)
|
|
|
|
env.close()
|
|
|
|
if __name__ == "__main__":
|
|
evaluate_kinematics() |