# ๐Ÿ›๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Pusher-v5 RL & Live Web Platform) ## 1. ํ”„๋กœ์ ํŠธ ๋ชฉ์  ๋ฐ ๊ฐœ์š” Gymnasium MuJoCo 7์ž์œ ๋„ ๋กœ๋ด‡ ํŒ” ํ™˜๊ฒฝ(`Pusher-v5`)์—์„œ Stable-Baselines3 PPO ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•™์Šต์‹œํ‚ค๊ณ , **ํ•™์Šต ์ „ ๊ณผ์ •์„ ์‹ค์‹œ๊ฐ„ HUD ์˜ค๋ฒ„๋ ˆ์ด, ์ฒดํฌํฌ์ธํŠธ๋ณ„ MP4/GIF ๋น„๋””์˜ค, ๊ณ ํ•ด์ƒ๋„ ๋ถ„์„ ์ฐจํŠธ, ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ HTML ์›น ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋ธŒ๋ผ์šฐ์ € ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ(FastAPI + WebSocket)**๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ ์ตœ์ข… ๋ชจ๋ธ ๋ฐ ๋ชจ๋“  ์‚ฐ์ถœ๋ฌผ์„ **๋‹จ์ผ ZIP ์••์ถ• ํŒจํ‚ค์ง€**๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. --- ## 2. ๊ธฐ์ˆ  ์Šคํƒ (Tech Stack) * **RL Framework:** Gymnasium 1.3.0 (`Pusher-v5` MuJoCo physics engine) * **Algorithm:** Stable-Baselines3 2.9.0 (PPO, `MlpPolicy`, PyTorch backend) * **Web Server & WebSocket:** FastAPI, Uvicorn, Starlette, WebSockets * **Frontend Client:** HTML5/CSS3/JavaScript (Dark Futuristic Glassmorphism), Chart.js (Real-time Telemetry Dynamics) * **Visualization & Media:** Pillow (PIL HUD Text Overlay), imageio (MP4/GIF), Matplotlib (Dark Theme 4-panel analysis) * **Packaging:** Python `zipfile` (Deflated compression) --- ## 3. ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ (Execution Flow) ```mermaid flowchart TD subgraph Live_Web_Cockpit [Live Web Simulation & Control Center] W1[Browser Web Client - web/index.html] <-->|WebSocket /ws/simulation| S1[FastAPI Server - app.py] S1 -->|30 FPS Stream & Telemetry| W1 W1 -->|Control Commands: Start, Pause, Reset, Policy| S1 W1 -->|REST API: Start Train, Status, Checkpoints| S1 end subgraph RL_Training_Pipeline [RL Training & Offline Artifacts] T1[train.py / Background Thread] --> T2[PPO Model & Env] T2 --> T3[VisualProgressCallback] T3 -->|Step 0, Checkpoints, Final| T4[HUD Frames & MP4/GIFs] T3 --> T5[Metrics & 4-Panel Plots] T4 & T5 --> T6[dashboard.html] T6 --> T7[ZIP Bundle ppo_pusher_bundle.zip] end S1 <--> RL_Training_Pipeline ``` --- ## 4. ํด๋” ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ ๊ทœ์น™ (Directory Structure) * `app.py` : FastAPI ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์›น ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ŠคํŠธ๋ฆฌ๋ฐ, WebSocket ์„œ๋ฒ„, REST API ๋ฐ ์‹ค์‹œ๊ฐ„ PPO ํ•™์Šต ๋กœ๊ฑฐ * `web/` : ์‹ค์‹œ๊ฐ„ ๊ด€์ œ ํ”„๋ก ํŠธ์—”๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (1-Screen Zero-Scroll Architecture) * `web/index.html` : ์˜๋ฌธ ์ œ์–ด ๋ฒ„ํŠผ, 7-DOF ๋ฐ”์ดํด๋ผ ํ† ํฌ ๊ฒŒ์ด์ง€, ํ•™์Šต ํ”„๋ฆฌ์…‹ ์…€๋ ‰ํ„ฐ, 4ํƒญ ๋ฑ(์ฐจํŠธ, ๋งˆ์ผ์Šคํ†ค ๋น„๋””์˜ค, ์‹ค์‹œ๊ฐ„ ํ„ฐ๋ฏธ๋„ ๋กœ๊ทธ, ์ŠคํŽ™) UI * `web/style.css` : OLED ํ•˜์ด์ฝ˜ํŠธ๋ผ์ŠคํŠธ ๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜ ์Šคํƒ€์ผ์‹œํŠธ, ๋ฐ”์ดํด๋ผ ๋ฐ”, ํˆดํŒ ์‹œ์Šคํ…œ * `web/app.js` : WebSocket ํด๋ผ์ด์–ธํŠธ, 3D ๋ฒกํ„ฐ ์นฉ, ์‹ค์‹œ๊ฐ„ ์ด๋™ํ‰๊ท  ์ฐจํŠธ, ๋งˆ์ผ์Šคํ†ค ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, PPO ํ„ฐ๋ฏธ๋„ ์ŠคํŠธ๋ฆฌ๋ฐ * `train.py` : PPO ํ•™์Šต ๋ฉ”์ธ ์ง„์ž…์ , ์‹œ๊ฐํ™” ์ฝœ๋ฐฑ, ์‚ฐ์ถœ๋ฌผ ์ž๋™ ํŒจํ‚ค์ง• * `visualizer.py` : HUD ์˜ค๋ฒ„๋ ˆ์ด, ๋ฏธ๋””์–ด ์ธ์ฝ”๋”ฉ, ์ฐจํŠธ ์ƒ์„ฑ, HTML ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ * `evaluate.py` : ํ•™์Šต ์™„๋ฃŒ๋œ `.zip` ๋ชจ๋ธ์˜ ๋…๋ฆฝ ํ‰๊ฐ€ ๋ฐ ๋น„๋””์˜ค ์ถ”์ถœ๊ธฐ * `.cursorrules` : AI Vibe-Coding ๋ฐฉ์–ด ๊ทœ์น™ * `DOCS_*.md` : AI ๋งˆ์Šคํ„ฐ ํ”„๋กœํ† ์ฝœ ๋ฐ ๋ฐ์ดํ„ฐ ๊ทœ๊ฒฉ์„œ * `results/` : ํ•™์Šต ์‚ฐ์ถœ๋ฌผ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ * `ppo_pusher.zip` : SB3 PPO ๋ชจ๋ธ ๋ฐ”์ด๋„ˆ๋ฆฌ * `dashboard.html` : ์›น ๋Œ€์‹œ๋ณด๋“œ * `metrics.json` : ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ก * `config.json` : ์‹คํ–‰ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ * `plots/training_metrics.png` : ๋ถ„์„ ์ฐจํŠธ * `videos/*.mp4, *.gif` : ํ•™์Šต ๋‹จ๊ณ„๋ณ„ ๋ Œ๋”๋ง ํŒŒ์ผ * `ppo_pusher_bundle.zip` : ์ „์ฒด ๊ฒฐ๊ณผ๋ฌผ ํ†ตํ•ฉ ์••์ถ• ์•„์นด์ด๋ธŒ