카메라로 진자(또는 진동)를 찍으면 → 추적 → Neural ODE로 동역학 학습 → 기호회귀로 명시적 방정식 도출.
θ̈ = -(g/L)sin(θ) - γω같은 운동방정식을 데이터에서 역추론한다. 팀 버그도 기능입니다 (2026 STEM+I 해커톤)
git clone https://github.com/onlineschoolentry/-22.git
cd -22/physics_kalmanpip install -r requirements-ml.txttorch가 제일 무거워(~200MB) 처음만 좀 걸림. Julia/PySR 설치 불필요(gplearn 폴백).
- Windows:
start_local_program.bat더블클릭 → 브라우저가 자동으로 열림 - 또는 터미널에서:
→ 브라우저에서 http://127.0.0.1:8843 열림
python launcher.py
python -c "import numpy,scipy,pandas,sympy,cv2,torch,torchdiffeq,gplearn; print('OK')"OK 나오면 끝.
- 브라우저 화면에서 Start (카메라 시작)
- Sample Color → 추(마커) 클릭 (색 지정)
- Calibrate → 진자: 줄 매단 점 클릭 → 추 클릭
- 진자를 크게(30°+) 흔들기 (10~20초)
- 발견:
- Fit Model = 빠른 STLSQ (즉시)
- Neural ODE = 풀 파이프라인 (1~2분 학습, 방정식 + 3방법 교차검증)
- Export CSV 로 데이터 저장 가능
녹화한 영상 → 각도 시계열:
python cv_tracker.py --video pendulum.mp4 --out theta.csv→ 창이 뜨면 피벗 클릭 → 추 클릭(추 클릭이 색도 샘플링) → 자동 추적 → theta.csv 저장
python discover_pipeline.py --csv theta.csv→ Neural ODE 학습 → 기호회귀 → θ̈ = ... 출력 + g/L
python discover_pipeline.py --synthetic| 파일 | 역할 |
|---|---|
start_local_program.bat |
더블클릭 실행 (Windows) |
launcher.py |
로컬 서버 띄우고 브라우저 열기 |
web_server.py |
백엔드 (웹 서빙 + 발견 API) |
web/ |
프론트엔드 (app.js, index.html, styles.css) — 카메라·추적·대시보드 |
cv_tracker.py |
OpenCV 영상 추적 → θ(t) CSV (파이프라인 ①단계) |
smoother.py |
운동학 칼만 스무더 (깨끗한 θ,ω,α) |
neural_ode.py |
Neural ODE (PyTorch + torchdiffeq) — 벡터필드 학습 |
discover_pipeline.py |
Neural ODE → 기호회귀 전체 파이프라인 |
equation_discovery.py |
STLSQ(SINDy) — 교차검증 baseline |
results.png, generalization.png |
발표/보고서용 결과 그림 |
카메라/영상
① 색 추적 (cv_tracker.py = OpenCV / web = 브라우저) → 각도 θ(t)
② 칼만 스무더 (smoother.py) → 깨끗한 [θ, ω]
③ Neural ODE (neural_ode.py, torchdiffeq RK4) → 벡터필드 f(θ,ω) 학습
④ 기호회귀 (discover_pipeline.py, PySR→gplearn) → 명시적 방정식
↓
θ̈ = -(g/L)sin(θ) - γω + g/L·γ 추출 + 주기 교차검증
- 진자(pendulum):
θ̈ = -(g/L)sin(θ) - γω(비선형) — g/L 추출 - 용수철/진동(spring):
ẍ = -(k/m)x(선형, 훅의 법칙) — k/m 추출
| 증상 | 해결 |
|---|---|
ModuleNotFoundError |
pip install -r requirements-ml.txt 다시 |
| Neural ODE 버튼 안 됨 | torch 설치 확인. 로컬 실행에서만 됨 |
| 카메라 안 열림 | 반드시 http://127.0.0.1:8843 (또는 localhost)로 접속 |
| 색 추적 안 됨 | 드롭다운 색 말고 Sample Color로 마커 직접 클릭 |
| 트래킹이 작게 나옴 | 스윙 평면을 카메라와 평행하게 (앞뒤로 흔들면 압축됨) |
| 비선형(sin) 발견 안 됨 | 진폭 30~40° 필요 (작으면 sin≈θ라 구분 불가) |
gplearn sklearn 에러 |
코드에 호환 패치 있음. 그래도 나면 pip install -U gplearn |
Python · PyTorch + torchdiffeq (Neural ODE) · PySR/gplearn (기호회귀) · OpenCV (추적) · NumPy/SciPy/SymPy · 브라우저 JS(실시간 UI)
- 합성: Neural ODE가 g/L 0.95% 오차로 복원, 기호회귀가 sin(θ) 선택
- 실데이터 (진폭 40°, 60fps):
θ̈ = -39.03·sin(θ) - 0.071·ω→ g/L Neural ODE 39.03 / STLSQ 38.45 / 주기 36.97 (3방법 일치) - 일반화: 학습 안 한 초기조건(내삽) 예측 0.05° 오차
- 전처리: 칼만 스무더가 유한차분 대비 가속도 55배 정확