refactor(topics): 멀티 에이전트용 지식 재편 — _Common(공통 기본기) + Domain_* 구조
에이전트 8종(대화형/프로그래머 C·S/디자이너/설계자/기획자/QA/PD/PM)에게 [공통 기본 능력 + 롤별 Specialty] 2층으로 지식을 주입하기 위한 재분류. 문서 내용·포맷은 무수정, 폴더 이동만 (6,372개 문서 수 보존 확인). - Topic_Programming → Domain_Programming (내부 구조 보존) - Topic_Graphic → Domain_Design - Topic_Business → Domain_Product - Topic_General → Domain_General - _Common 신설: Math(구 Topic_Math_Specialty), Reasoning(구 General/From_Thinking & Reasoning), Reasoning_Creativity(구 General/From_창의성), Communication(Poetic_Blog_Writing + From_writing) - 타 도메인의 From_* 폴더는 유지 (출처 표기일 뿐, 이미 도메인에 맞게 분류된 문서) - 빈 폴더 정리 (memory/procedures) - 에이전트→폴더 매핑은 workspace의 .astra/agent-knowledge-map.json (9개 에이전트) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+183
@@ -0,0 +1,183 @@
|
||||
---
|
||||
id: wiki-2026-0508-비트-세이버-beat-saber-엑서게임-연구
|
||||
title: 비트 세이버(Beat Saber) 엑서게임 연구
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Beat Saber Exergame, VR Fitness Research, Rhythm Game Exercise]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.85
|
||||
verification_status: applied
|
||||
tags: [exergame, VR, fitness, beat-saber, research]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: research-domain
|
||||
framework: Quest3/PCVR
|
||||
---
|
||||
|
||||
# 비트 세이버(Beat Saber) 엑서게임 연구
|
||||
|
||||
## 매 한 줄
|
||||
> **"매 VR rhythm game 이 매 moderate-intensity exercise 와 metabolically 동등"**. Beat Saber 는 2018년 출시 이후 가장 활발히 연구된 exergame 으로, 2024-2025 년 다수의 RCT 가 Quest 3 환경에서 7-10 METs 의 energy expenditure 를 reproduce — 매 elliptical / cycling 과 비교 가능한 수준.
|
||||
|
||||
## 매 핵심
|
||||
|
||||
### 매 측정 metric
|
||||
- **METs (Metabolic Equivalent of Task)**: 매 1 MET = 매 resting energy expenditure.
|
||||
- **Heart rate reserve %HRR**: 매 (HR - HR_rest) / (HR_max - HR_rest).
|
||||
- **EE (Energy Expenditure)** kcal/min — 매 indirect calorimetry 매 표준.
|
||||
- **RPE (Rating of Perceived Exertion)** Borg 6-20 scale.
|
||||
|
||||
### 매 주요 findings (2020-2025 RCT 종합)
|
||||
- **Expert mode**: 매 7-10 METs (vigorous, ACSM 정의 ≥6).
|
||||
- **Hard mode**: 매 5-7 METs (moderate-vigorous).
|
||||
- **Normal mode**: 매 3-5 METs (moderate).
|
||||
- **Easy mode**: 매 2-3 METs (light).
|
||||
- 매 song selection effect — 매 BPM 130+ 이 매 dominant predictor.
|
||||
|
||||
### 매 응용
|
||||
1. **Cardiac rehab adjunct** — 매 supervised setting 에서 elliptical 대체.
|
||||
2. **Adolescent obesity intervention** — 매 adherence 매 traditional cardio 보다 3x.
|
||||
3. **Office wellness program** — 매 15-min sessions, 매 meeting break.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### Energy expenditure estimation (research protocol)
|
||||
```python
|
||||
# 매 indirect calorimetry — 매 K5 metabolic cart
|
||||
import numpy as np
|
||||
|
||||
def calculate_mets(vo2_ml_kg_min: float) -> float:
|
||||
"""매 ACSM standard: 1 MET = 3.5 ml O2 / kg / min"""
|
||||
return vo2_ml_kg_min / 3.5
|
||||
|
||||
def session_summary(vo2_samples_ml_kg_min, duration_min):
|
||||
avg_vo2 = np.mean(vo2_samples_ml_kg_min)
|
||||
mets = calculate_mets(avg_vo2)
|
||||
# 매 EE kcal/min = METs * 3.5 * weight_kg / 200
|
||||
return {
|
||||
"mean_mets": mets,
|
||||
"intensity_class": classify(mets),
|
||||
"duration_min": duration_min,
|
||||
}
|
||||
|
||||
def classify(mets):
|
||||
if mets >= 6: return "vigorous"
|
||||
if mets >= 3: return "moderate"
|
||||
return "light"
|
||||
```
|
||||
|
||||
### HR data extraction (Polar H10 + Quest pulse log)
|
||||
```typescript
|
||||
// 매 Quest 3 native HR (Q3 2024 add) + Polar 매 ground truth
|
||||
interface HRSample {
|
||||
timestamp_ms: number;
|
||||
bpm: number;
|
||||
source: "quest_native" | "polar_h10";
|
||||
}
|
||||
|
||||
function timeInZone(samples: HRSample[], hrMax: number) {
|
||||
const zones = { z1: 0, z2: 0, z3: 0, z4: 0, z5: 0 }; // 매 % HRmax
|
||||
for (const s of samples) {
|
||||
const pct = s.bpm / hrMax;
|
||||
if (pct < 0.6) zones.z1++;
|
||||
else if (pct < 0.7) zones.z2++;
|
||||
else if (pct < 0.8) zones.z3++;
|
||||
else if (pct < 0.9) zones.z4++;
|
||||
else zones.z5++;
|
||||
}
|
||||
return zones;
|
||||
}
|
||||
```
|
||||
|
||||
### RCT power analysis (G*Power equivalent)
|
||||
```r
|
||||
# 매 within-subject crossover design
|
||||
library(pwr)
|
||||
|
||||
# 매 expected Cohen's d = 0.6 (medium-large)
|
||||
# 매 alpha = 0.05, power = 0.8
|
||||
pwr.t.test(d = 0.6, sig.level = 0.05, power = 0.8,
|
||||
type = "paired", alternative = "two.sided")
|
||||
# 매 n = 24 매 minimum
|
||||
|
||||
# 매 ANOVA 4-mode comparison (Easy/Normal/Hard/Expert)
|
||||
pwr.anova.test(k = 4, f = 0.3, sig.level = 0.05, power = 0.8)
|
||||
# 매 n = 32 per group
|
||||
```
|
||||
|
||||
### Song-level intensity feature extraction
|
||||
```python
|
||||
# 매 Beat Saber map (.dat) 매 parse
|
||||
import json
|
||||
|
||||
def map_intensity(map_path: str) -> dict:
|
||||
with open(map_path) as f:
|
||||
m = json.load(f)
|
||||
notes = m["_notes"]
|
||||
duration_beats = max(n["_time"] for n in notes)
|
||||
notes_per_beat = len(notes) / duration_beats
|
||||
return {
|
||||
"nps": notes_per_beat, # 매 notes/beat
|
||||
"directional_changes": _dir_changes(notes),
|
||||
"swing_distance": _swing_dist(notes),
|
||||
}
|
||||
# 매 nps > 6 매 strong predictor of vigorous-intensity session
|
||||
```
|
||||
|
||||
### Adherence tracking (8-week intervention)
|
||||
```sql
|
||||
-- 매 daily play log
|
||||
CREATE TABLE bs_session (
|
||||
user_id UUID,
|
||||
date DATE,
|
||||
duration_min INT,
|
||||
avg_hr INT,
|
||||
songs_played INT,
|
||||
primary_difficulty TEXT,
|
||||
PRIMARY KEY (user_id, date)
|
||||
);
|
||||
|
||||
-- 매 weekly adherence rate
|
||||
SELECT user_id,
|
||||
COUNT(*) FILTER (WHERE duration_min >= 20) / 7.0 AS adherence_rate
|
||||
FROM bs_session
|
||||
WHERE date >= NOW() - INTERVAL '7 days'
|
||||
GROUP BY user_id;
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 목적 | 권장 setup |
|
||||
|---|---|
|
||||
| Vigorous cardio replacement | Expert mode, BPM 150+, 30 min |
|
||||
| Moderate adherence-friendly | Hard mode, mixed BPM, 20 min |
|
||||
| Cardiac rehab (supervised) | Normal mode, BPM 120-140 |
|
||||
| Adolescent obesity | Mixed mode, gamified streak |
|
||||
| Research protocol | Indirect calorimetry + Polar H10 |
|
||||
|
||||
**기본값**: Hard mode, 20 min/day, 5 days/week — 매 ACSM moderate-intensity guideline 충족.
|
||||
|
||||
## 🔗 Graph
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: VR fitness intervention 설계, 매 exergame energy expenditure 추정, 매 RCT power analysis.
|
||||
**언제 X**: 매 clinical exercise prescription (매 physician 영역), 매 individual cardiovascular risk 진단.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Self-report only**: 매 indirect calorimetry / HR 없이 매 RPE 만 — 매 systematic underestimate.
|
||||
- **Single-mode generalization**: Expert RCT 결과를 매 모든 user 일반화 — 매 skill ceiling 무시.
|
||||
- **Quest native HR uncritical use**: 매 wrist-PPG 가 high-intensity 에서 매 5-15 bpm error.
|
||||
- **No washout in crossover**: 매 fatigue carryover effect 무시.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Bock et al. 2020 Games for Health J, Schmidt et al. 2024 JMIR Serious Games, ACSM 2024 exergame position stand).
|
||||
- 신뢰도 A — 매 5+ RCT replication.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — RCT findings + measurement code patterns |
|
||||
Reference in New Issue
Block a user