Reinforcement Learning
stable-baselines3
PyTorch
English
Korean
deep-reinforcement-learning
ppo
proximal-policy-optimization
cartpole-v1
gymnasium
openai-gym
classic-control
robotics
physical-ai
sim-to-real
zero-shot-transfer
domain-randomization
inverted-pendulum
optimal-control
lqr-control
control-theory
interactive-demo
Eval Results (legacy)
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
Hwihwa_Lab
chore: untrack and remove Korean jupyter notebook from public HF and GitHub repos
7115a00 |
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
14.7 kB
| # ๐ค CartPole-v1 // ํผ์ง์ปฌ AI & ์ฐ์ฃผ ํ์ฑ Sim-to-Real ๋ฒค์น๋งํฌ | |
| [](README.md) | |
| [](README_KR.md) | |
| [](https://huggingface.co/spaces/hwihwalab/cartpole-v1-ppo) | |
| [](https://huggingface.co/hwihwalab/cartpole-v1-ppo) | |
| [](https://gymnasium.farama.org/environments/classic_control/cart_pole/) | |
| [](https://pytorch.org/) | |
| [](https://stable-baselines3.readthedocs.io/) | |
| [](#-์ค์ธก-1800ํ-์ ์-๋ฒค์น๋งํฌ-์คํ-๊ฒฐ๊ณผ) | |
| [](https://github.com/Hwihwa-Lab/cartpole-v1-ppo) | |
| [](https://github.com/Hwihwa-Lab/cartpole-v1-ppo/blob/main/LICENSE) | |
| > **"์ง๊ตฌ์์ ํ์ต๋ ๊ฐํํ์ต AI๋ ์ธ๊ณ ํ์ฑ์ ์ค๋ ฅ ๋ณํ ์์์๋ ์ด์๋จ์ ์ ์๋๊ฐ?"** | |
| > ์ฌ์ธต ์ ๊ฒฝ๋ง ๊ฐํํ์ต **PPO(Proximal Policy Optimization)**์ ์ ํต ํ๋ ์ ์ด๊ณตํ์ ์ ์ ์ธ **์ต์ LQR(Linear Quadratic Regulator)**์ 4๊ฐ ์ฐ์ฃผ ํ์ฑ ์ค๋ ฅ ๋ฐ ๊ทนํ ์ธ๋ ํ๊ฒฝ์์ ๋น๊ต ๋ถ์ํ ์ค์ธก ํผ์ง์ปฌ AI ๋ฒค์น๋งํฌ ์ค์ํธ์ ๋๋ค. | |
| > *[ ๐ English Documentation ](README.md) | [ ๐ฐ๐ท ํ๊ตญ์ด ๋งค๋ด์ผ ](README_KR.md) | [ ๐ฎ ์ค์๊ฐ ์น ์๋ฎฌ๋ ์ดํฐ ๋ผ์ด๋ธ ๋ฐ๋ชจ ](https://huggingface.co/spaces/hwihwalab/cartpole-v1-ppo)* | |
| > [!TIP] | |
| > ๐ฎ **๋ธ๋ผ์ฐ์ ์์ ๋ฌด์ค์น ์ฆ์ ์ฒดํ**: [๐ Hugging Face Spaces ๋ผ์ด๋ธ ๋ฐ๋ชจ ์คํ](https://huggingface.co/spaces/hwihwalab/cartpole-v1-ppo) | |
| > ๐ฆ **๊ณต์ ๋ชจ๋ธ ํ๋ธ**: [๐ค hwihwalab/cartpole-v1-ppo](https://huggingface.co/hwihwalab/cartpole-v1-ppo) | ๐ **GitHub ๋ฆฌํฌ์งํ ๋ฆฌ**: [Hwihwa-Lab/cartpole-v1-ppo](https://github.com/Hwihwa-Lab/cartpole-v1-ppo) | |
| --- | |
| ## ๐ฎ ์ธํฐ๋ํฐ๋ธ ๋ผ์ด๋ธ ์ฒดํ๊ด (Hugging Face Spaces) | |
| ๐ **[๋ธ๋ผ์ฐ์ ์์ ์ค์๊ฐ ๋ฌผ๋ฆฌ AI ์ฐ๊ตฌ์ ์คํํ๊ธฐ](https://huggingface.co/spaces/hwihwalab/cartpole-v1-ppo)** | |
| * ๐ฑ๏ธ **๋ง์ฐ์ค/ํฐ์น ์ธํฐ๋ํฐ๋ธ ์ธ๋ (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}$์ ๋ฌด์์ ์๊ฐ ์ธ๋ ์ฃผ์ | | |
| --- | |
| ## ๐๏ธ ์์คํ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ | |
| ```mermaid | |
| 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) | |
| 1. **๋น์ ํ ์ ๊ฒฝ๋ง ์ ์ฑ ์ ์ ๋ก์ท ๊ฐ์ธ์ฑ**: | |
| - ์ง๊ตฌ์์๋ง ํ์ต๋ PPO ์์ด์ ํธ๋ $0.17g$ (๋ฌ)๋ถํฐ $2.53g$ (๋ชฉ์ฑ)๊น์ง ๊ทน๋จ์ ์ธ ์ค๋ ฅ ๋ณํ ์์์๋ ์ถ๊ฐ ์ฌํ์ต ์์ด 100% ์์กด์จ(500์คํ ๋ง์ ์์ฃผ)์ ์ ์งํ์ต๋๋ค. | |
| - ๊ณ ์ค๋ ฅ(๋ชฉ์ฑ: $24.79\,\text{m/s}^2$) ํ๊ฒฝ์์๋ ๋น ๋ฅธ ์ค์์นญ ์ฃผํ์๋ฅผ ํตํด ๊ฐ๋ ์ค์ฐจ๋ฅผ $|\theta| \le 0.53^\circ$ ์ด๋ด๋ก ์ต์ ํ์ต๋๋ค. | |
| 2. **์ํ์ ์ต์ ์ ์ด(LQR) vs ๋ฅ๋ฌ๋ ๊ฐํํ์ต(PPO)**: | |
| - ์ ๋ฐํ ์ ํ ์์ ์ฑ ์์ญ์์๋ LQR์ด ๋ ์ข์ ๊ฐ๋ ๋ฐ๋๋ฐด๋($|\theta| \approx 0.18^\circ$)๋ฅผ ์ ์งํ์ผ๋, ๋น๋์นญ ์ง์ ํ์ ์ธ๋์์๋ PPO๊ฐ ๋น๋์นญ ๋ํฐ๋น ์กฐ์ ์ ํตํด ๋ฐ์ด๋ ์ ์์ฑ์ ์ ์ฆํ์ต๋๋ค. | |
| 3. **์์ ๊ณต๊ฐ ์๋ ด์ฑ(Attractor Convergence)**: | |
| - ์ค์๊ฐ ์์ ํ๋ฉด๋ ๋ถ์ ๊ฒฐ๊ณผ, LQR๊ณผ PPO ๋ชจ๋ ์ธ๋ ์ดํ $(0, 0)$ ํํ์ ์ผ๋ก ์ ๊ทผ์ ๋์ ์๋ ด(Asymptotic Spiral Convergence)์ ์๋ฃํจ์ ํ์ธํ์ต๋๋ค. | |
| --- | |
| ## ๐ฌ ๋์ญํ ๋ฌผ๋ฆฌ ๊ฑฐ๋ ์์ธ ๋ถ์ (์ค์ ์นดํธํด์ด ์ด๋ป๊ฒ ์์ง์๋๊ฐ?) | |
| 1,800ํ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ์ฐ์ ์ํ ๊ณต๊ฐ($x, \dot{x}, \theta, \dot{\theta}$) ๊ถค์ ๋ก๊ทธ ๋ถ์ ๊ฒฐ๊ณผ, ๊ฐ ํ๊ฒฝ๋ณ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ํนํ ๋ฌผ๋ฆฌ์ ๊ฑฐ๋ ํจํด์ด ๊ด์ธก๋์์ต๋๋ค: | |
| 1. **๐ ์ง๊ตฌ ํ์ค ํ๊ฒฝ ($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)๋ฅผ ํ์ฑํฉ๋๋ค. | |
| 2. **๐ ๋ฌ๋๋ผ ์ ์ค๋ ฅ ($1.62\,\text{m/s}^2$ ยท ๋ฅ์ค๋ฅ์ค ์ค๋ฒ์ํ ํ๋ํ๊ธฐ)**: | |
| - **์นดํธ ์ด๋ ๋ฐ๊ฒฝ**: ์นดํธ๊ฐ ๋ ์ผ ์ข์ฐ ๋์ ์์ญ($|x| \approx 0.45\,\text{m} \sim 0.82\,\text{m}$)์ ์ํํ๋ฏ ์ค๊ฐ๋๋ค. | |
| - **๋์ญํ ์์ธ**: ์ค๋ ฅ์ด ์ฝํด ๋ง๋์ ์์ฐ ๋ํ ๋ณต์ ํ ํฌ๊ฐ ์๊ธฐ ๋๋ฌธ์, $\pm 10\,\text{N}$์ ์ด์ฐ ์ถฉ๊ฒฉ๋ ฅ์ด ๋ง๋์ ๊ธด ์ฃผ๊ธฐ(Low-frequency)์ ๊ฐ์ด๋๋์ ์ ๋ฐํ์ฌ ์๋งํ ์ฌ์ธํ ํํ๋ก ์ค์ํ๋ฉฐ ์์ ํ๋ฉ๋๋ค. | |
| 3. **๐ช ๋ชฉ์ฑ ์ด๊ณ ์ค๋ ฅ ($24.79\,\text{m/s}^2$ ยท ์ด๊ณ ์ฃผํ ํ๋ฅด๋ฅด ๋จ๋ฆผ)**: | |
| - **์ก์ถ์์ดํฐ ๊ฑฐ๋**: ์ค์์นญ ์ฃผํ์๊ฐ $>22.5\,\text{Hz}$ ์ด์์ผ๋ก ๊ธ์์นํฉ๋๋ค. | |
| - **๋์ญํ ์์ธ**: ์ค๋ ฅ ํ ํฌ($\tau_g = m g l \sin\theta$)๊ฐ $2.53$๋ฐฐ ๊ฐ๋ ฅํด์ ธ ๋ง๋๊ฐ ์กฐ๊ธ๋ง ๊ธฐ์ธ์ด์ ธ๋ ๋ถ๊ดด ์๋๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ฏ๋ก, PPO ์ ๊ฒฝ๋ง์ด ์ด๊ธด๋ฐ ๊ณ ์ฃผํ ํ์ค๋ฅผ ์ฐ์ ์ฃผ์ ํ์ฌ ์ฐ๋ฌ์ง์ ๋ฐฉ์ดํฉ๋๋ค. | |
| 4. **๐จ ์ธก๋ฉด ์ง์ ํ์ ์ธ๋ ($+2.2\,\text{N}$ ยท ๋น๋์นญ ๋ฆฐ ์นด์ดํฐ ์คํฐ์ด)**: | |
| - **๋ํฐ๋น ๋น๋์นญ ์ ํ**: PPO ์ ์ฑ ์ด ์ค์ค๋ก ์ข์ธก ํ ๋น์จ์ $64.8\%\,\text{L} / 35.2\%\,\text{R}$๋ก ๋น๋์นญ ํธํฅ์ํต๋๋ค. | |
| - **๋ฌผ๋ฆฌ์ ์์ธ**: ์นดํธ๋ฅผ $x \approx -0.18\,\text{m}$ ๋ฐ๋ ๋ถ๋ ๋ฐ๋ํธ์ ๊ณ ์ ์ํค๊ณ , ๋ง๋๋ฅผ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด์ง ๊ธฐ์ธ์ฌ ํ์๊ณผ ์ค๋ ฅ์ ํ ํฌ ํํ์ ์๋ฒฝํ ๋ง์ถฅ๋๋ค. | |
| 5. **โก ์ธ๋ ์ถฉ๊ฒฉ ๋ณต์ ๊ธฐ๋ (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. ์ ์ฉ ๋ ๋ฆฝํ ๋ฐ์คํฌํฑ ์ฑ ์คํ | |
| ```powershell | |
| python run.py | |
| ``` | |
| ### 2. ์๋ํ 1,800ํ ์ ์ ๋ฒค์น๋งํฌ ์ฌ์คํ | |
| ```powershell | |
| python benchmark_experiments.py | |
| ``` | |
| ### 3. ์์คํ ๋ฌด๊ฒฐ์ฑ ํ ์คํธ ์ค์ํธ ์คํ | |
| ```powershell | |
| python test_app.py | |
| ``` | |
| --- | |
| ## ๐ ํํ ๋ก๋ณดํฑ์ค ์ํ๊ณ ๋ก๋๋งต | |
| ๋ณธ ํ๋ก์ ํธ๋ ํํ ๋ฉ ํผ์ง์ปฌ AI & ๋ก๋ณดํฑ์ค ์๋ฆฌ์ฆ์ ๊ธฐ์ด 1๋จ๊ณ์ ํด๋นํฉ๋๋ค: | |
| 1. **CartPole-v1 PPO** ยท 1D ๊ณ ์ ์ ์ด ์ญ์ง์ ๊ท ํ ์ ์ด & Sim-to-Real ๋ฒค์น๋งํฌ | |
| 2. **LunarLander-v3 D3QN** ยท 2D ๋ฌ ์ฐฉ๋ฅ์ ๋ณตํฉ ์ถ์ง์ฒด ์ ์ด & ๋ฒกํฐ ๋์ญํ | |
| 3. **LeRobot Push-T** ยท 2D ํ ๋ ์คํผ๋ ์ด์ & Diffusion ๋ชจ๋ฐฉ ํ์ต | |
| 4. **LeRobot ALOHA Sim** ยท ์ํ ๋ก๋ด ์ ๋ฐ ๋งค๋ํฐ๋ ์ด์ & ์ก์ถ์์ดํฐ ์ด๋ ์ด | |
| 5. **MicroDuck 14-DOF** ยท 3D ์ด์กฑ๋ณดํ ๋์งํธ ํธ์ ์ค์๊ฐ ์กฐ์ข ์ | |
| --- | |
| ## ๐ ๋ผ์ด์ ์ค (License) | |
| ๋ณธ ํ๋ก์ ํธ๋ MIT License๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ [LICENSE](https://github.com/Hwihwa-Lab/cartpole-v1-ppo/blob/main/LICENSE) ํ์ผ์ ์ฐธ์กฐํ์ธ์. | |
| --- | |
| *Trained and deployed with [CartPole Physical AI Lab](https://huggingface.co/spaces/hwihwalab/cartpole-v1-ppo) by **HWIHWA LAB**.* | |