Instructions to use hwihwalab/cartpole-v1-ppo with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- stable-baselines3
How to use hwihwalab/cartpole-v1-ppo with stable-baselines3:
from huggingface_sb3 import load_from_hub checkpoint = load_from_hub( repo_id="hwihwalab/cartpole-v1-ppo", filename="{MODEL FILENAME}.zip", ) - Notebooks
- Google Colab
- Kaggle
Download README_KR.md from hwihwalab/cartpole-v1-ppo: direct link, hf CLI and curl.
- Browser
- Download file 14.7 kB
-
https://huggingface.co/hwihwalab/cartpole-v1-ppo/resolve/main/README_KR.md
- Command line
-
hf download hf://hwihwalab/cartpole-v1-ppo/README_KR.md
-
curl -L -o README_KR.md https://huggingface.co/hwihwalab/cartpole-v1-ppo/resolve/main/README_KR.md
๐ค CartPole-v1 // ํผ์ง์ปฌ AI & ์ฐ์ฃผ ํ์ฑ Sim-to-Real ๋ฒค์น๋งํฌ
"์ง๊ตฌ์์ ํ์ต๋ ๊ฐํํ์ต AI๋ ์ธ๊ณ ํ์ฑ์ ์ค๋ ฅ ๋ณํ ์์์๋ ์ด์๋จ์ ์ ์๋๊ฐ?"
์ฌ์ธต ์ ๊ฒฝ๋ง ๊ฐํํ์ต **PPO(Proximal Policy Optimization)**์ ์ ํต ํ๋ ์ ์ด๊ณตํ์ ์ ์ ์ธ **์ต์ LQR(Linear Quadratic Regulator)**์ 4๊ฐ ์ฐ์ฃผ ํ์ฑ ์ค๋ ฅ ๋ฐ ๊ทนํ ์ธ๋ ํ๊ฒฝ์์ ๋น๊ต ๋ถ์ํ ์ค์ธก ํผ์ง์ปฌ AI ๋ฒค์น๋งํฌ ์ค์ํธ์ ๋๋ค.
๐ English Documentation | ๐ฐ๐ท ํ๊ตญ์ด ๋งค๋ด์ผ | ๐ฎ ์ค์๊ฐ ์น ์๋ฎฌ๋ ์ดํฐ ๋ผ์ด๋ธ ๋ฐ๋ชจ
๐ฎ ๋ธ๋ผ์ฐ์ ์์ ๋ฌด์ค์น ์ฆ์ ์ฒดํ: ๐ Hugging Face Spaces ๋ผ์ด๋ธ ๋ฐ๋ชจ ์คํ
๐ฆ ๊ณต์ ๋ชจ๋ธ ํ๋ธ: ๐ค hwihwalab/cartpole-v1-ppo | ๐ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ: Hwihwa-Lab/cartpole-v1-ppo
๐ฎ ์ธํฐ๋ํฐ๋ธ ๋ผ์ด๋ธ ์ฒดํ๊ด (Hugging Face Spaces)
๐ ๋ธ๋ผ์ฐ์ ์์ ์ค์๊ฐ ๋ฌผ๋ฆฌ AI ์ฐ๊ตฌ์ ์คํํ๊ธฐ
- ๐ฑ๏ธ ๋ง์ฐ์ค/ํฐ์น ์ธํฐ๋ํฐ๋ธ ์ธ๋ (Troll the AI): ์บ๋ฒ์ค๋ฅผ ๋ง์ฐ์ค๋ก ๊ธ๊ฑฐ๋ ๋น๊ฒจ์ ์ค์๊ฐ ์ถฉ๊ฒฉ(
โก ยฑXX.X N)์ ๊ฐํ๊ณ AI๊ฐ ์ค๋์ด์ฒ๋ผ ์ค์ฌ์ ์ก๋ ๋ชจ์ต์ ์ง์ ํ ์คํธํ ์ ์์ต๋๋ค. - ๐ช ์ฐ์ฃผ ํ์ฑ ์ค๋ ฅ Sim-to-Real ์ ์ด: ๋ฌ($1.62,\text{m/s}^2$), ํ์ฑ($3.72,\text{m/s}^2$), ์ง๊ตฌ($9.81,\text{m/s}^2$), ๋ชฉ์ฑ($24.79,\text{m/s}^2$)์ ์ํด๋ฆญ์ผ๋ก ๋๋๋ค๋ฉฐ ๋ฌผ๋ฆฌ์ ๋ฐ์ ๋ณํ๋ฅผ ๊ด์ฐฐํฉ๋๋ค.
- ๐ ์ค์๊ฐ ์์ ํ๋ฉด๋ ($\theta$ vs $\dot{\theta}$): ํผ๋์ ์ธ๋ ์์์ $(0, 0)$ ํํ์ ์ผ๋ก ์๋ ดํ๋ ๋์ ๊ถค์ (Attractor)์ ์ค์๊ฐ์ผ๋ก ํ์ธํฉ๋๋ค.
- โก 6๋จ๊ณ ์ฌ์ด๋ฒ๋คํฑ ๋ฐฐ์ ๋ฐํฌ: $0.25\times$ ์ฌ๋ก์ฐ ๋ชจ์ ๋ถํฐ $5.0\times\text{ Turbo}$, $10.0\times\text{ Max}$๊น์ง ์ง์ํฉ๋๋ค.
โจ๏ธ ์ธํฐ๋ํฐ๋ธ ์กฐ์ ๋ฐ ๋จ์ถํค ๋งคํ ๊ฐ์ด๋
| ์กฐ์ ๋ฐฉ์ / ๋จ์ถํค | ์ ์ด ๋์ | ์์ธ ์ค๋ช |
|---|---|---|
[ ๋ง์ฐ์ค ๋๋๊ทธ / ํด๋ฆญ ] |
์ธ๋ ์ถฉ๊ฒฉ ์ฃผ์ | ์บ๋ฒ์ค์์ ๋๋๊ทธํ์ฌ ์กฐ์ค์ ์ ๊ธ๊ณ $\pm 5\text{N} \sim \pm 30\text{N}$์ ๋ฌผ๋ฆฌ ์ถฉ๊ฒฉ ์ธ๊ฐ |
[ Space ] |
์์ / ์ผ์์ ์ง | 60FPS ์ค์๊ฐ ๋ฌผ๋ฆฌ ๋์ญํ ์๋ฎฌ๋ ์ดํฐ ๊ฐ๋ ๋ฐ ์ ์ง |
[ R ] |
์ด๊ธฐํ (Reset) | ์ญ์ง์ ์์คํ ์ ํ์ค ์ด๊ธฐ ์ํ๋ก ์ฆ์ ๋ฆฌ์ |
[ M ] |
์ ์ด๊ธฐ ๋ณ๊ฒฝ | TRAINED PPO โ LQR โ UNDERCOOKED โ MANUAL ์ํ ์ ํ |
[ โ / โถ ] |
์๋ ์กฐ์ (Teleop) | ์ธ๊ฐ ์ด์์ ํค๋ณด๋ ์ ๋ ฅ์ผ๋ก ์นดํธ ์ข/์ฐ ์ง์ ์ด๋ |
[ F ] |
๋๋ค ์ถฉ๊ฒฉ | $\pm 10\text{N}$์ ๋ฌด์์ ์๊ฐ ์ธ๋ ์ฃผ์ |
๐๏ธ ์์คํ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ
flowchart TB
subgraph Client_Layer ["๐ค Physical AI & Robotics Dynamics Suite (One-Screen Golden Ratio)"]
UI_Left["Left: ์ ์ด๊ธฐ ์๋ ๋ (PPO vs LQR), 4-DOF ํ
๋ ๋ฉํธ๋ฆฌ & ๋ฐฐ์ ๋๋กญ๋ค์ด"]
UI_Center["Center: 60FPS ์บ๋ฒ์ค, ๋ง์ฐ์ค ์ธ๋ ๋ฒกํฐ & ์์ ํ๋ฉด ์ดํธ๋ํฐ"]
UI_Right["Right: Sim-to-Real ํ์ฑ ํ๋ (L, M, g) & ์ค์๊ฐ Chart.js"]
end
subgraph Core_Engine ["โก Pure JS ๋ฌผ๋ฆฌ & ์ ์ด ๋ฐํ์ (cartpole_sim.js)"]
Physics["๊ฐ๋ณ ๋ฌผ๋ฆฌ ํด์๊ธฐ (Euler ์ ๋ถ ๊ธฐ๋ฐ ๋์ L, M, g ํด์)"]
LQR_Ctrl["๊ณ ์ ์ต์ LQR ์ ์ด๊ธฐ (Riccati ๊ฒ์ธ ํ๋ ฌ u = -K*x)"]
PPO_Ctrl["์๋ฐฉํฅ MLP ์ ์ฑ
(Tanh x 2 -> Softmax ํ๋ฅ ๊ฒฐ์ )"]
PhasePlot["์์ ํ๋ฉด ์์ง (ฮธ vs ฮธฬ ๊ถค์ ๋์ ์๋ ด ์ดํธ๋ํฐ)"]
WeightsJSON["์ถ์ถ๋ ์ ๊ฒฝ๋ง ๊ฐ์ค์น (cartpole_weights.json)"]
end
subgraph Python_Backend ["๐ ํ์ด์ฌ ํ์ต & ๋ฒค์น๋งํฌ ์ธํ๋ผ"]
Trainer["PPO ์ ์ฑ
ํธ๋ ์ด๋ (train.py @ 25,000 steps)"]
Benchmark["์๋ํ 1,800ํ ์ ์ ๋ฒค์น๋งํฌ ์์ง (benchmark_experiments.py)"]
LocalServer["๋ฌด์์กด์ฑ ๊ฒฝ๋ ๋ก์ปฌ ์๋ฒ (run.py @ Port 8000)"]
TestSuite["์๋ํ ํ
์คํธ ํ๋ค์ค (test_app.py - 6๊ฐ ๊ฒ์ฆ ์ผ์ด์ค)"]
end
subgraph Hub_Distribution ["๐ ํ๊น
ํ์ด์ค ํตํฉ ๋ฐฐํฌ (deploy_to_hf.py)"]
Spaces["HF Spaces (Static SDK ๋ฌด์ง์ฐ ์น ๋ฒค์น๋งํฌ)"]
Models["HF Model Hub (๊ฐ์ค์น, ๋ฒค์น๋งํฌ JSON, ๋ชจ๋ธ ์นด๋)"]
end
WeightsJSON --> PPO_Ctrl
Physics --> UI_Center
PPO_Ctrl --> UI_Left
LQR_Ctrl --> UI_Left
PhasePlot --> UI_Center
Physics --> UI_Right
Trainer --> WeightsJSON
Benchmark --> Models
LocalServer --> Client_Layer
Client_Layer --> Spaces
Trainer --> Models
๐ ์ค์ธก ๋ฒค์น๋งํฌ ์คํ ๋ฐ์ดํฐ (์ด 1,800ํ ๋ฌผ๋ฆฌ ์ํผ์๋)
๋ณธ ๋ฐ์ดํฐ๋ ์๋ํ ๋ฒค์น๋งํฌ ์์ง(benchmark_experiments.py)์ ํตํด ์ด 1,800ํ์ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์ํผ์๋๋ฅผ ์ ์ ์ธก์ ํ์ฌ ์ง๊ณ๋ 100% ์ค์ธก ๊ฒฐ๊ณผ์
๋๋ค.
๐ช 1. ํ์ฑ๋ณ ์ ๋ก์ท(Zero-Shot) ์ค๋ ฅ ์ ์ด ๋ฒค์น๋งํฌ (ํ์ค ๋ฌด์ธ๋ ํ๊ฒฝ)
| ์ ์ด๊ธฐ (Controller) | ๐ ๋ฌ (1.62 m/sยฒ) | ๐ด ํ์ฑ (3.72 m/sยฒ) | ๐ ์ง๊ตฌ (9.81 m/sยฒ) | ๐ช ๋ชฉ์ฑ (24.79 m/sยฒ) | ํ๊ท ๊ฐ๋ ์ค์ฐจ |
|---|---|---|---|---|---|
| Trained PPO (20K) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 0.26ยฐ (์ง๊ตฌ) / 0.53ยฐ (๋ชฉ์ฑ) |
| Optimal LQR (Riccati) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 0.18ยฐ (์ง๊ตฌ) / 0.42ยฐ (๋ชฉ์ฑ) |
| Undercooked PPO (2K) | 21.7 (0%) | 21.7 (0%) | 19.3 (0%) | 18.6 (0%) | N/A (ํ์ต ๋ฏธ์๋ฃ ์กฐ๊ธฐ ์ถ๋ฝ) |
๐ช๏ธ 2. ํ๊ฒฝ ์คํธ๋ ์ค & ๊ฐ์ธ์ฑ ๋ฒค์น๋งํฌ (์ง๊ตฌ ์ค๋ ฅ 9.81 m/sยฒ)
| ์ ์ด๊ธฐ (Controller) | ํ์ค ๋ฌด์ธ๋ (Clean) | ์ง์ ํ์ (+2.2N) | ์ผ์ ๋ ธ์ด์ฆ (ฯ=0.05) | ๋ณตํฉ ์คํธ๋ ์ค ํ๊ฒฝ |
|---|---|---|---|---|
| Trained PPO (20K) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) |
| Optimal LQR (Riccati) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) | 500.0 (100%) |
| Undercooked PPO (2K) | 19.3 (0%) | 16.5 (0%) | 20.5 (0%) | 14.2 (0%) |
๐ฌ ์ฃผ์ ์ฐ๊ตฌ ๊ฒฐ๋ก ๋ฐ ์ด๋ก ์ ๊ณ ์ฐฐ (Key Scientific Findings)
- ๋น์ ํ ์ ๊ฒฝ๋ง ์ ์ฑ
์ ์ ๋ก์ท ๊ฐ์ธ์ฑ:
- ์ง๊ตฌ์์๋ง ํ์ต๋ PPO ์์ด์ ํธ๋ $0.17g$ (๋ฌ)๋ถํฐ $2.53g$ (๋ชฉ์ฑ)๊น์ง ๊ทน๋จ์ ์ธ ์ค๋ ฅ ๋ณํ ์์์๋ ์ถ๊ฐ ์ฌํ์ต ์์ด 100% ์์กด์จ(500์คํ ๋ง์ ์์ฃผ)์ ์ ์งํ์ต๋๋ค.
- ๊ณ ์ค๋ ฅ(๋ชฉ์ฑ: $24.79,\text{m/s}^2$) ํ๊ฒฝ์์๋ ๋น ๋ฅธ ์ค์์นญ ์ฃผํ์๋ฅผ ํตํด ๊ฐ๋ ์ค์ฐจ๋ฅผ $|\theta| \le 0.53^\circ$ ์ด๋ด๋ก ์ต์ ํ์ต๋๋ค.
- ์ํ์ ์ต์ ์ ์ด(LQR) vs ๋ฅ๋ฌ๋ ๊ฐํํ์ต(PPO):
- ์ ๋ฐํ ์ ํ ์์ ์ฑ ์์ญ์์๋ LQR์ด ๋ ์ข์ ๊ฐ๋ ๋ฐ๋๋ฐด๋($|\theta| \approx 0.18^\circ$)๋ฅผ ์ ์งํ์ผ๋, ๋น๋์นญ ์ง์ ํ์ ์ธ๋์์๋ PPO๊ฐ ๋น๋์นญ ๋ํฐ๋น ์กฐ์ ์ ํตํด ๋ฐ์ด๋ ์ ์์ฑ์ ์ ์ฆํ์ต๋๋ค.
- ์์ ๊ณต๊ฐ ์๋ ด์ฑ(Attractor Convergence):
- ์ค์๊ฐ ์์ ํ๋ฉด๋ ๋ถ์ ๊ฒฐ๊ณผ, LQR๊ณผ PPO ๋ชจ๋ ์ธ๋ ์ดํ $(0, 0)$ ํํ์ ์ผ๋ก ์ ๊ทผ์ ๋์ ์๋ ด(Asymptotic Spiral Convergence)์ ์๋ฃํจ์ ํ์ธํ์ต๋๋ค.
๐ฌ ๋์ญํ ๋ฌผ๋ฆฌ ๊ฑฐ๋ ์์ธ ๋ถ์ (์ค์ ์นดํธํด์ด ์ด๋ป๊ฒ ์์ง์๋๊ฐ?)
1,800ํ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ์ฐ์ ์ํ ๊ณต๊ฐ($x, \dot{x}, \theta, \dot{\theta}$) ๊ถค์ ๋ก๊ทธ ๋ถ์ ๊ฒฐ๊ณผ, ๊ฐ ํ๊ฒฝ๋ณ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ํนํ ๋ฌผ๋ฆฌ์ ๊ฑฐ๋ ํจํด์ด ๊ด์ธก๋์์ต๋๋ค:
๐ ์ง๊ตฌ ํ์ค ํ๊ฒฝ ($9.81,\text{m/s}^2$ ยท ๋์นญํ ์ด๋ฏธ์ธ ์ง๋ ์ ์ด):
- ์นดํธ ์ด๋ ๋ฐ๊ฒฝ: ๋ ์ผ ์ค์ ๊ธฐ์ค $|x| \le 0.12,\text{m}$ ์ด๋ด์ ์๋ฒฝํ ๊ฐํ ๋จธ๋ฌด๋ฆ ๋๋ค.
- ์ก์ถ์์ดํฐ ๊ฑฐ๋: $+10,\text{N}$๊ณผ $-10,\text{N}$์ ํ์ $\approx 14.2,\text{Hz}$์ ์ฃผํ์๋ก ๋น ๋ฅด๊ฒ ์ ํํ๋ฉฐ, ์ข์ฐ ๋์นญ ๋ํฐ๋น($50.0%,\text{L} / 50.0%,\text{R}$)๋ฅผ ์ ์งํฉ๋๋ค.
- ๋ง๋ ์์ธ: ๋์ ๋๋ ํ๋ค๋ฆผ ์์ด $|\theta| \le 0.26^\circ$์ ์๊ฒฉํ ์ง๋ฆฝ ๋ถ๊ฐ๋(Deadband)๋ฅผ ํ์ฑํฉ๋๋ค.
๐ ๋ฌ๋๋ผ ์ ์ค๋ ฅ ($1.62,\text{m/s}^2$ ยท ๋ฅ์ค๋ฅ์ค ์ค๋ฒ์ํ ํ๋ํ๊ธฐ):
- ์นดํธ ์ด๋ ๋ฐ๊ฒฝ: ์นดํธ๊ฐ ๋ ์ผ ์ข์ฐ ๋์ ์์ญ($|x| \approx 0.45,\text{m} \sim 0.82,\text{m}$)์ ์ํํ๋ฏ ์ค๊ฐ๋๋ค.
- ๋์ญํ ์์ธ: ์ค๋ ฅ์ด ์ฝํด ๋ง๋์ ์์ฐ ๋ํ ๋ณต์ ํ ํฌ๊ฐ ์๊ธฐ ๋๋ฌธ์, $\pm 10,\text{N}$์ ์ด์ฐ ์ถฉ๊ฒฉ๋ ฅ์ด ๋ง๋์ ๊ธด ์ฃผ๊ธฐ(Low-frequency)์ ๊ฐ์ด๋๋์ ์ ๋ฐํ์ฌ ์๋งํ ์ฌ์ธํ ํํ๋ก ์ค์ํ๋ฉฐ ์์ ํ๋ฉ๋๋ค.
๐ช ๋ชฉ์ฑ ์ด๊ณ ์ค๋ ฅ ($24.79,\text{m/s}^2$ ยท ์ด๊ณ ์ฃผํ ํ๋ฅด๋ฅด ๋จ๋ฆผ):
- ์ก์ถ์์ดํฐ ๊ฑฐ๋: ์ค์์นญ ์ฃผํ์๊ฐ $>22.5,\text{Hz}$ ์ด์์ผ๋ก ๊ธ์์นํฉ๋๋ค.
- ๋์ญํ ์์ธ: ์ค๋ ฅ ํ ํฌ($\tau_g = m g l \sin\theta$)๊ฐ $2.53$๋ฐฐ ๊ฐ๋ ฅํด์ ธ ๋ง๋๊ฐ ์กฐ๊ธ๋ง ๊ธฐ์ธ์ด์ ธ๋ ๋ถ๊ดด ์๋๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ฏ๋ก, PPO ์ ๊ฒฝ๋ง์ด ์ด๊ธด๋ฐ ๊ณ ์ฃผํ ํ์ค๋ฅผ ์ฐ์ ์ฃผ์ ํ์ฌ ์ฐ๋ฌ์ง์ ๋ฐฉ์ดํฉ๋๋ค.
๐จ ์ธก๋ฉด ์ง์ ํ์ ์ธ๋ ($+2.2,\text{N}$ ยท ๋น๋์นญ ๋ฆฐ ์นด์ดํฐ ์คํฐ์ด):
- ๋ํฐ๋น ๋น๋์นญ ์ ํ: PPO ์ ์ฑ ์ด ์ค์ค๋ก ์ข์ธก ํ ๋น์จ์ $64.8%,\text{L} / 35.2%,\text{R}$๋ก ๋น๋์นญ ํธํฅ์ํต๋๋ค.
- ๋ฌผ๋ฆฌ์ ์์ธ: ์นดํธ๋ฅผ $x \approx -0.18,\text{m}$ ๋ฐ๋ ๋ถ๋ ๋ฐ๋ํธ์ ๊ณ ์ ์ํค๊ณ , ๋ง๋๋ฅผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด์ง ๊ธฐ์ธ์ฌ ํ์๊ณผ ์ค๋ ฅ์ ํ ํฌ ํํ์ ์๋ฒฝํ ๋ง์ถฅ๋๋ค.
โก ์ธ๋ ์ถฉ๊ฒฉ ๋ณต์ ๊ธฐ๋ (2๋จ๊ณ ์บ์นญ & ์ผํฐ๋ง ๊ธฐ๋):
- 1๋จ๊ณ (Catching): $+15,\text{N}$ ์ถฉ๊ฒฉ ์ธ๊ฐ ์, ์นดํธ๊ฐ ์ถฉ๊ฒฉ ๋ฐฉํฅ์ผ๋ก ๊ธ๊ฐ์ํ์ฌ ๊ธฐ์ธ์ด์ง๋ ๋ง๋์ ์ง๋ ์ค์ฌ ๋ฐ๋ก ๋ฐ์ผ๋ก ๋ฐ์นจ์ ์ ์ ์ํ ์ด๋์ํต๋๋ค.
- 2๋จ๊ณ (Settling): ๊ฐ์๋ $\dot{\theta} \rightarrow 0$ ์๋ ด ํ, 2D ์์ ํ๋ฉด ๋์ ๊ถค์ ์ ๋ฐ๋ผ ์นดํธ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ ์ผ ์์ ($x = 0.0,\text{m}$)์ผ๋ก ๊ฒฌ์ธ ๋ณต๊ท์ํต๋๋ค.
๐ ๋ฆฌํฌ์งํ ๋ฆฌ ํ์ผ ๊ตฌ์ฑ ๋ฐ ๋จ์ผ ์ฑ ์ ๋ช ์ธ
| ํ์ผ ๊ฒฝ๋ก | ๋จ์ผ ์ฑ ์ (Single Responsibility) |
|---|---|
models/cartpole_ppo.zip |
ํ์ต ์๋ฃ๋ ๊ณต์ PyTorch / Stable-Baselines3 PPO ์ ์ฑ ๊ฐ์ค์น ์์นด์ด๋ธ |
cartpole_weights.json |
๋ธ๋ผ์ฐ์ ๋ด 60FPS ์์ JS ์ค์๊ฐ ์ถ๋ก ์ฉ PPO MLP ์ ๊ฒฝ๋ง ๊ฐ์ค์น [Linear(4,64) โ Linear(64,64) โ Linear(64,2)] |
replay.mp4 |
ํ๊น ํ์ด์ค ๋ชจ๋ธ ํ์ด์ง ์ ์ฉ 1:1 ๊ณ ํ์ง(720ร720) ๋น๋์ค ํ๋ฆฌ๋ทฐ ์์ |
index.html |
๋ฌด์คํฌ๋กค ํฉ๊ธ๋ถํ Cybernetic Bento ๊ด์ ๋ ์ด์์ |
style.css |
๋ค์ค ๋คํฌ๋ชจ๋ ๊ธ๋์ค๋ชจํผ์ฆ, ๋ฐ์ํ ๊ฒ์ด์ง ๋ฐ ํ ํฑ ์ปจํธ๋กค ์คํ์ผ ์์คํ |
cartpole_sim.js |
60FPS ๊ฐ๋ณ ๋ฌผ๋ฆฌ ํด์, PPO/LQR ์ ์ด๊ธฐ, ๋ง์ฐ์ค ์ธ๋ ๋ฐ ์์ ํ๋ฉด๋ ๋ ๋๋ฌ |
train.py |
25,000 ์คํ PPO ํ์ต๊ธฐ ๋ฐ ์น ๋ธ๋ผ์ฐ์ ์ฉ JSON ๊ฐ์ค์น ์ถ์ถ๊ธฐ |
benchmark_experiments.py |
4๋ ํ์ฑ & 3๋ ์ธ๋ 1,800ํ ์ ์ ๋ฒค์น๋งํฌ ์๋ํ ํ์ดํ๋ผ์ธ |
benchmark_results.json |
4๋ ํ์ฑ ๋ฐ 3๋ ์ธ๋ ์กฐ๊ฑด์ ๋ํ 1,800ํ ์ ์ ํ๊ฐ ์ ๋ ๋ฐ์ดํฐ |
generate_trajectory_dataset.py |
77,821 ์คํ ์ ๊ณ ๋น๋ ๋ฌผ๋ฆฌ ๊ถค์ (Parquet/JSONL) ๋ฐ์ดํฐ์ ์์ฑ๊ธฐ |
| run.py / run_desktop.py | ๋ธ๋ผ์ฐ์ ๋จ๋
์ฑ ๋ชจ๋๋ฅผ ์ด์ด์ฃผ๋ ๋ฌด์์กด์ฑ ๊ฒฝ๋ ๋ก์ปฌ ์๋ฒ ๋ฐ ๋ฐ์คํฌํฑ ๋ฐ์ฒ |
| deploy_to_hf.py | ํ๊น
ํ์ด์ค Models, Spaces, Datasets ์ํด๋ฆญ 3์ค ๋์ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ |
| LICENSE | ๊ณต์ MIT ์คํ์์ค ๋ผ์ด์ ์ค |
โก ๋น ๋ฅธ ์คํ ๋ฐ ์ฌํ ๊ฐ์ด๋
1. ์ ์ฉ ๋ ๋ฆฝํ ๋ฐ์คํฌํฑ ์ฑ ์คํ
python run.py
2. ์๋ํ 1,800ํ ์ ์ ๋ฒค์น๋งํฌ ์ฌ์คํ
python benchmark_experiments.py
3. ์์คํ ๋ฌด๊ฒฐ์ฑ ํ ์คํธ ์ค์ํธ ์คํ
python test_app.py
๐ ํํ ๋ก๋ณดํฑ์ค ์ํ๊ณ ๋ก๋๋งต
๋ณธ ํ๋ก์ ํธ๋ ํํ ๋ฉ ํผ์ง์ปฌ AI & ๋ก๋ณดํฑ์ค ์๋ฆฌ์ฆ์ ๊ธฐ์ด 1๋จ๊ณ์ ํด๋นํฉ๋๋ค:
- CartPole-v1 PPO ยท 1D ๊ณ ์ ์ ์ด ์ญ์ง์ ๊ท ํ ์ ์ด & Sim-to-Real ๋ฒค์น๋งํฌ
- LunarLander-v3 D3QN ยท 2D ๋ฌ ์ฐฉ๋ฅ์ ๋ณตํฉ ์ถ์ง์ฒด ์ ์ด & ๋ฒกํฐ ๋์ญํ
- LeRobot Push-T ยท 2D ํ ๋ ์คํผ๋ ์ด์ & Diffusion ๋ชจ๋ฐฉ ํ์ต
- LeRobot ALOHA Sim ยท ์ํ ๋ก๋ด ์ ๋ฐ ๋งค๋ํฐ๋ ์ด์ & ์ก์ถ์์ดํฐ ์ด๋ ์ด
- MicroDuck 14-DOF ยท 3D ์ด์กฑ๋ณดํ ๋์งํธ ํธ์ ์ค์๊ฐ ์กฐ์ข ์
๐ ๋ผ์ด์ ์ค (License)
๋ณธ ํ๋ก์ ํธ๋ MIT License๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
Trained and deployed with CartPole Physical AI Lab by HWIHWA LAB.