Upload lunar_env_adapter.py with huggingface_hub
Browse files- lunar_env_adapter.py +73 -0
lunar_env_adapter.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gymnasium as gym
|
| 2 |
+
import numpy as np
|
| 3 |
+
|
| 4 |
+
class LunarLanderAdapter:
|
| 5 |
+
"""
|
| 6 |
+
LunarLander 환경 래퍼:
|
| 7 |
+
- Gymnasium LunarLander-v3 / v2 호환
|
| 8 |
+
- 웹 Canvas 렌더링 및 HUD 텔레메트리용 구조화 데이터 추출
|
| 9 |
+
"""
|
| 10 |
+
def __init__(self, render_mode=None):
|
| 11 |
+
try:
|
| 12 |
+
self.env = gym.make("LunarLander-v3", render_mode=render_mode)
|
| 13 |
+
except Exception:
|
| 14 |
+
self.env = gym.make("LunarLander-v2", render_mode=render_mode)
|
| 15 |
+
|
| 16 |
+
self.observation_space = self.env.observation_space
|
| 17 |
+
self.action_space = self.env.action_space
|
| 18 |
+
|
| 19 |
+
def reset(self, seed=None):
|
| 20 |
+
obs, info = self.env.reset(seed=seed)
|
| 21 |
+
return obs, info
|
| 22 |
+
|
| 23 |
+
def step(self, action):
|
| 24 |
+
return self.env.step(action)
|
| 25 |
+
|
| 26 |
+
def close(self):
|
| 27 |
+
self.env.close()
|
| 28 |
+
|
| 29 |
+
def extract_telemetry(self, state, action=0, reward=0.0, done=False, info=None):
|
| 30 |
+
"""
|
| 31 |
+
State 구성:
|
| 32 |
+
[0]: x 좌표 (-1.0 ~ 1.0)
|
| 33 |
+
[1]: y 좌표 (0 ~ 1.5)
|
| 34 |
+
[2]: 수평 속도 vx
|
| 35 |
+
[3]: 수직 속도 vy
|
| 36 |
+
[4]: 각도 angle (라디안)
|
| 37 |
+
[5]: 각속도 angular_vel
|
| 38 |
+
[6]: 좌측 착륙 다리 지면 접촉 (0.0 or 1.0)
|
| 39 |
+
[7]: 우측 착륙 다리 지면 접촉 (0.0 or 1.0)
|
| 40 |
+
"""
|
| 41 |
+
x, y, vx, vy, angle, angular_vel, leg_l, leg_r = state
|
| 42 |
+
|
| 43 |
+
# 지형 정보 및 착륙 패드 정보 추출 (LunarLander 환경 내부 객체 활용 가능시)
|
| 44 |
+
helipad_x1 = -0.2
|
| 45 |
+
helipad_x2 = 0.2
|
| 46 |
+
helipad_y = 0.0
|
| 47 |
+
|
| 48 |
+
# 착륙 상태 판별
|
| 49 |
+
is_touchdown = bool(leg_l > 0.5 and leg_r > 0.5)
|
| 50 |
+
is_upright = abs(angle) < 0.1
|
| 51 |
+
is_slow = abs(vx) < 0.1 and abs(vy) < 0.1
|
| 52 |
+
is_safe_landing = is_touchdown and is_upright and is_slow and done
|
| 53 |
+
|
| 54 |
+
telemetry = {
|
| 55 |
+
"x": float(x),
|
| 56 |
+
"y": float(y),
|
| 57 |
+
"vx": float(vx),
|
| 58 |
+
"vy": float(vy),
|
| 59 |
+
"altitude": float(max(0.0, y)),
|
| 60 |
+
"vertical_speed": float(vy),
|
| 61 |
+
"horizontal_speed": float(vx),
|
| 62 |
+
"angle": float(angle),
|
| 63 |
+
"angle_deg": float(np.degrees(angle)),
|
| 64 |
+
"angular_velocity": float(angular_vel),
|
| 65 |
+
"leg_left_contact": bool(leg_l > 0.5),
|
| 66 |
+
"leg_right_contact": bool(leg_r > 0.5),
|
| 67 |
+
"action": int(action), # 0: None, 1: Left, 2: Main, 3: Right
|
| 68 |
+
"reward": float(reward),
|
| 69 |
+
"done": bool(done),
|
| 70 |
+
"is_safe_landing": bool(is_safe_landing),
|
| 71 |
+
"helipad": {"x1": helipad_x1, "x2": helipad_x2, "y": helipad_y}
|
| 72 |
+
}
|
| 73 |
+
return telemetry
|