jongchullee commited on
Commit
c252f92
·
verified ·
1 Parent(s): b0759ac

Upload lunar_env_adapter.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. 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