🏋️ PRD: 무게 모드 체계 v2.0

SPOEX 2026 체험용 · v2.0 — 2026-03-20
작성: 황호랑 🐯 · 확인: 황성우님
이전: v1.0 (2026-03-15)
📑 목차

1. 개요

1.1 한 줄 요약

6종 무게 모드 전체를 SPOEX 체험용으로 완성 — 리모컨 모달에서 안전한 범위 내 즉석 전환 + 실기 검증.

1.2 배경

1.3 목표

#목표완료 기준
1리모컨에서 6모드 전환모드 탭 → FW MODE_CHANGE → ACK
2모드별 파라미터 조절프리셋 선택 or 슬라이더 → 0xF5 05 → 체감 변화
3체험 안전 보장위험 파라미터 앱 단에서 원천 차단
4실기 안정성 검증모드 전환 + 부하 변화 시 모터 이상 없음

2. 무게 모드 전체 체계

2.1 6모드 맵

Constant
위치·속도 무관 일정 저항
FW ✅ 앱 ✅
↕️
Negative
이완(하강) 시 추가 저항
FW ✅ 앱 ✅
📈
Band
위치 비례 — 탄성밴드
FW ✅ 앱 ✅
Isokinetic
속도 제한 — 등속성
FW ✅ 앱 ❌
💧
Hydraulic
속도 비례 저항 — 유체
FW ✅ 앱 ❌
〰️
Vibration
주기적 부하 진동
FW ✅ 앱 ❌

2.2 모드별 물리 모델

Constant (case 0)

F = TargetWeight × OnOffScale

Negative (case 1)

수축(상승): F = TargetWeight × OnOffScale
이완(하강): F = (TargetWeight + EccWeight) × OnOffScale

Band (case 2)

F = TargetWeight × (position / rangeHigh) × OnOffScale

바닥: 가벼움, 끝점: 설정무게 100%

Isokinetic (case 3) ⚡

|v| ≤ v_target:  F = TargetWeight × OnOffScale
|v| > v_target:  F = TargetWeight × (1 + K × (|v| - vt) / vt) × OnOffScale

Hydraulic (case 4) 💧

spdRatio = (|v| / v_ref)^n       [clamp: 0 ~ (v_max/v_ref)^n]
F = TargetWeight × (minRatio + (1 - minRatio) × spdRatio) × OnOffScale

Vibration (case 5) 〰️

F = TargetWeight × (1 + amplitude × sin(2πft)) × OnOffScale

2.3 3중 안전 체인

F 계산
Slew Rate
50 kg/s
MaxWeight
Flash or 50kg
MaxCurrent
30A
안전장치역할적용 범위
Slew Rate토크 변화 속도 제한50 kg/s (ISR당 0.01kg)case 3/4/5
MaxWeight절대 kg 상한Flash값 or fallback 50kg모든 모드
MaxCurrent하드웨어 전류 보호30A모든 모드

3. 모드별 파라미터 & 체험 안전 범위

3.1 Isokinetic ⚡

파라미터변수명단위기본값체험 범위BLE paramId
목표 속도Iso_Vtargetmm/s200100~6000x10
제동 게인Iso_Kgain5.02.0~8.00x11

체험 프리셋:

프리셋v_targetK_gain체감
🐌 Slow150 mm/s5.0천천히만 — 재활 느낌
🚶 Normal300 mm/s5.0적당한 속도 제한 (기본)
🏃 Fast500 mm/s3.0빨라도 OK, 살짝 브레이크

3.2 Hydraulic 💧

파라미터변수명단위기본값체험 범위BLE paramId
기준속도Hydro_Vrefmm/s300100~6000x01
최대속도 capHydro_Vmaxmm/s600300~10000x02
속도 지수Hydro_n1.00.5~2.00x03
최소 텐션Hydro_minRatio0.100.05~0.300x04

체험 프리셋:

프리셋nminRatiov_ref체감
🌬️ Air2.00.05300저속 가볍고 고속에서 확 무거움
💧 Water1.50.10300물속 운동 (기본)
🫗 Oil1.00.15300선형, 직관적
🍯 Honey0.70.20300느려도 무거움

3.3 Vibration 〰️

파라미터변수명단위기본값체험 범위BLE paramId
주파수Vib_FreqHz2.01.0~3.00x30
진폭Vib_Amplitude0.300.10~0.300x31

체험 프리셋:

프리셋FreqAmplitude체감
🌊 Gentle1.0 Hz0.15느긋한 파도
💪 Rehab2.0 Hz0.25리듬감 있는 진동 (기본)
⚡ Intense3.0 Hz0.30빠른 진동

3.4 체험 안전 제한 (앱 단 강제)

제한사유
Vibration 주파수 상한3.0 Hz5Hz+ → 떨림 체감, 모터 부담
Vibration 진폭 상한0.30 (±30%)40%+ → 무게 급변 불쾌
Isokinetic K_gain 상한8.010+ → 급정지 느낌, 안전 우려
Isokinetic v_target 하한100 mm/s그 이하 → 거의 움직이지 못함
Hydraulic n 상한2.03+ → 고속 시 폭증
공통 Slew Rate50 kg/s 고정FW 하드코딩, 변경 불가
공통 MaxWeightFlash값FW 하드코딩

4. BLE 프로토콜

4.1 MODE_CHANGE (0x68)

앱 → FW: [FF FF] [04] [68] [side] [mode] [CHK]
  side: 0=Left, 1=Right, 2=Both
  mode: 0~5
FW → 앱: ACK [FF FF] [04] [68] [side] [result] [CHK]
  result: 1=OK, 0=Fail

FW 8b9c555에서 mode ≤ 5 허용 완료

4.2 파라미터 변경 (0xF5 05)

앱 → FW: [FF FF] [psize] [F5] [05] [paramId] [value_H] [value_L] [CHK]
FW → 앱: ACK [FF FF] [02] [F5] [05]
paramId파라미터인코딩
0x01Hydro_Vrefuint16, mm/s
0x02Hydro_Vmaxuint16, mm/s
0x03Hydro_nuint16, ×100
0x04Hydro_minRatiouint16, ×100
0x10Iso_Vtargetuint16, mm/s
0x11Iso_Kgainuint16, ×100
0x20SlewRateuint16, kg/s (변경 불가)
0x30Vib_Frequint16, ×100
0x31Vib_Amplitudeuint16, ×100

4.3 앱→FW 시퀀스

  1. MODE_CHANGE(mode) → ACK 대기 (2초)
  2. 프리셋 선택 시 → 해당 모드 파라미터 0xF5 05 연속 전송 (각 paramId 별개 패킷, 간격 50ms)
  3. Weight ON 상태에서도 모드+파라미터 변경 가능 (단, SET_RANGE는 Weight OFF 필요)

5. 앱 설계 — 리모컨 모달 업그레이드

5.1 모드 셀렉터: 3개 → 6개

2행 3열 그리드 — 신규 모드는 accent 테두리로 구분:

Constant
↕️
Negative
📈
Band
Isokinetic
💧
Hydraulic
〰️
Vibration

5.2 모드별 파라미터 패널

Isokinetic (mode 3) 선택 시

┌─ ⚡ Isokinetic 설정 ──────────────────┐ │ 프리셋: [🐌 Slow] [🚶 Normal] [🏃 Fast] │ │ 목표 속도 ──●──────── 300 mm/s │ │ 제동 게인 ──●──────── 5.0× │ └──────────────────────────────────────┘

Hydraulic (mode 4) 선택 시

┌─ 💧 Hydraulic 설정 ──────────────────┐ │ 점성: [🌬️ Air] [💧 Water] [🫗 Oil] [🍯 Honey] │ │ 최소 텐션 ──●──── 10% │ └──────────────────────────────────────┘

Vibration (mode 5) 선택 시

┌─ 〰️ Vibration 설정 ──────────────────┐ │ 프리셋: [🌊 Gentle] [💪 Rehab] [⚡ Intense] │ │ 주파수 ──●──── 2.0 Hz │ │ 진폭 ──●──── 25% │ └──────────────────────────────────────┘

5.3 BLE 전송 타이밍

5.4 상태 인디케이터

현재: ['Const', 'Neg', 'Band'] → 변경: ['Const', 'Neg', 'Band', 'Iso', 'Hydro', 'Vib']

6. FW 현황 — 이미 구현된 커밋

커밋내용
8b9c555MODE_CHANGE 상한 2→5 허용
c14abdcIsokinetic(case 3) + Hydraulic minRatio + Slew Rate + 0xF5 05 + 50ms_1 슬롯
6059401Vibration(case 5)
bc5ced2MaxWeight 공통 cap (모든 모드)
✅ FW 추가 작업: 없음. 플래싱만 하면 됨.
⚠️ 실기 테스트 결과에 따라 파라미터 기본값 튜닝은 필요할 수 있음.

7. 구현 순서

#작업예상 시간비고
1✅ 완료 PRD v2.0 작성본 문서
2앱: 모드 셀렉터 3→6 확장30분2행 3열 그리드
3앱: Isokinetic 파라미터 패널30분프리셋 + 슬라이더
4앱: Hydraulic 파라미터 패널30분점성 프리셋 + 슬라이더
5앱: Vibration 파라미터 패널20분프리셋 + 슬라이더
6앱: BLE 전송 연결20분0xF5 05 + 디바운스
7앱: 상태 인디케이터 6모드5분modeNames 확장
8FW: Windows 빌드 + 플래싱30분STM32 빌드 → J-Link
9실기 테스트: 모드 전환1시간6모드 순환 전환 안정성
10실기 테스트: 파라미터 변경1시간프리셋별 체감 + 안전 확인
11실기 테스트: 부하 안정성1시간급속 당김/놓기 + 모드 전환
총 예상: 앱 ~2.5시간 + FW 플래싱 30분 + 실기 테스트 3시간

8. 실기 테스트 체크리스트

8.1 기본 동작

#테스트기대Pass
T-16모드 순환 전환 (Weight OFF)모두 ACK OK
T-26모드 순환 전환 (Weight ON)모두 ACK OK, 부하 전환 부드러움
T-3Constant 10kg → Isokinetic 전환저속: 동일, 고속: 무거워짐
T-4Constant 10kg → Hydraulic 전환정지: 1kg 텐션, 빠르게: 10kg+
T-5Constant 10kg → Vibration 전환리듬감 있는 무게 변화

8.2 Isokinetic 세부

#테스트기대Pass
I-1Slow(150mm/s) → 빠르게 당김즉시 무거워짐 ("벽")
I-2Fast(500mm/s) → 빠르게 당김여유 있음, 살짝 브레이크
I-3K_gain 2→8 변경 → 속도 초과벽 강도 차이 체감

8.3 Hydraulic 세부

#테스트기대Pass
H-1Water → 천천히 당김가벼움 + 약간의 텐션
H-2Water → 빠르게 당김확실히 무거움
H-3Honey → 천천히 당김저속에서도 무거움
H-4Air → 천천히 당김거의 안 느껴짐

8.4 Vibration 세부

#테스트기대Pass
V-1Gentle(1Hz) 프리셋느긋한 무게 변화
V-2Rehab(2Hz) 프리셋리듬감 있는 진동
V-3Intense(3Hz) 프리셋빠른 무게 변화
V-4정지 상태에서 진동무게 흔들림 체감

8.5 안전성

#테스트기대Pass
S-1최대 무게(50kg) + Isokinetic 급속Slew Rate로 부드럽게 증가
S-2Vibration 3Hz + 30% 진폭모터 소음/진동 이상 없음
S-3모드 전환 중 급속 놓기안전하게 언로딩
S-4연속 모드 전환 (빠르게 탭탭탭)에러 없음, 마지막 모드 적용

9. 미결 사항


변경 이력
2026-03-14 v0.1 — Hydraulic 초안
2026-03-15 v1.0 — Isokinetic+Vibration 추가, 3중 안전 체인, BLE 프로토콜
2026-03-20 v2.0 — SPOEX 체험용 전면 재작성 — 6모드 통합, 체험 안전 범위, 리모컨 UI 설계, 실기 테스트 체크리스트