File size: 3,270 Bytes
1a0d68d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import os
import time
from stable_baselines3 import SAC
from stable_baselines3.common.vec_env import DummyVecEnv, VecFrameStack

# rc_car_envs.py dosyasından sınıfları çekiyoruz (Senin dosya yapınla aynı)
from rc_car_envs import RcCarTargetEnv, RcCarDriveEnv, RcCarComplexEnv

# ==========================================
# AYARLAR: HANGİ MODU TEST EDECEKSİN?
# ==========================================
# Burası eğitimdeki MODE ile aynı olmalı veya test etmek istediğin mod olmalı.
# Seçenekler: "target", "drive", "complex"
MODE = "complex"

def main():
    print(f"🔍 {MODE.upper()} Modu için test başlatılıyor...")

    # 1. Ortamı Seç (Eğitim kodundaki mantığın aynısı)
    if MODE == "target":
        env = RcCarTargetEnv()
    elif MODE == "drive":
        env = RcCarDriveEnv()
    elif MODE == "complex":
        env = RcCarComplexEnv()
    else:
        raise ValueError("Geçersiz Mod! 'target', 'drive' veya 'complex' seçin.")

    # 2. Wrapperlar (Eğitimdekiyle BİREBİR AYNI olmalı)
    # Eğitimde FrameStack=4 kullandığın için burada da kullanmazsan hata alırsın.
    env = DummyVecEnv([lambda: env])
    env = VecFrameStack(env, n_stack=4)

    # 3. Model Dosyasını Bul
    model_dir = f"./models_{MODE}/"
    final_model_path = f"{model_dir}/sac_rc_car_{MODE}_final.zip"
    interrupted_model_path = f"{model_dir}/sac_rc_car_{MODE}_interrupted.zip"

    if os.path.exists(final_model_path):
        model_path = final_model_path
        print(f"✅ Final modeli bulundu: {model_path}")
    elif os.path.exists(interrupted_model_path):
        model_path = interrupted_model_path
        print(f"⚠️ Final model yok, yarıda kesilen model yükleniyor: {model_path}")
    else:
        print(f"❌ Model dosyası bulunamadı! Şu klasöre bakıldı: {model_dir}")
        return

    # 4. Modeli Yükle
    try:
        model = SAC.load(model_path, env=env)
    except Exception as e:
        print(f"Hata oluştu: {e}")
        return

    # 5. Test Döngüsü
    print("🚗 Test Sürüşü Başlıyor... (Çıkmak için CTRL+C)")
    obs = env.reset()
    
    total_reward = 0
    steps = 0

    try:
        while True:
            # deterministic=True: Model macera aramaz, öğrendiği en iyi hareketi yapar.
            action, _states = model.predict(obs, deterministic=True)
            
            obs, rewards, dones, info = env.step(action)
            
            total_reward += rewards[0]
            steps += 1

            # Konsol Çıktısı (Anlık durumu görmek için)
            if steps % 10 == 0:
                # Action[0][0] -> Gaz, Action[0][1] -> Direksiyon
                throttle = action[0][0]
                steering = action[0][1]
                print(f"Adım: {steps} | Gaz: {throttle:.2f} | Yön: {steering:.2f} | Ödül: {rewards[0]:.2f}")

            if dones[0]:
                print(f"🏁 Episode Bitti! Toplam Puan: {total_reward:.2f}")
                obs = env.reset()
                total_reward = 0
                steps = 0
                time.sleep(1.0) # Yeni tur başlamadan önce kısa bekleme

    except KeyboardInterrupt:
        print("\n🛑 Test sonlandırıldı.")
    finally:
        env.close()

if __name__ == "__main__":
    main()