# 영상 기준 동작 → 물리 시뮬레이션 → 관절 피드백 제어

MuJoCo 3.13.0 · 원래160 + 추가240 = 총400개 평가 에피소드 · 개발60개 별도

이 실험은 기존 포즈 비교에 실제 토크 구동 물리 시뮬레이션과 관절 상태 피드백을 추가했다. 영상에서 목표를 만들고, 모터 토크가 관성·중력·감쇠가 있는 팔을 움직이며, 피드백 제어기가 관절 오차를 수정한다. 실제 로봇이나 카메라 피드백 제어 실험은 아니다.

## 추가 검증: 같은 PD 이득에서 사전 토크 계획의 기여 분리

초기160개 결과에서 Open-loop가 약한 기준선임을 확인한 뒤, 같은 PD 이득의 PD-only 조건을 추가했다. 새 시드200–219를 보기 전에 별도 설정을 고정했고,4조건×20시드×3제어기=240개 에피소드를 추가 실행했다. 총400개 평가 에피소드이며 개발용60개는 별도다. 원래160개 평가의 결과와 설정을 바꾸거나 새 결과에 맞춰 이득을 조정하지 않았다.

**아래 표를 세 제어기의 직접 비교로 읽어야 한다.** PD-only는 동일한 PD 보정을 쓰고 사전 토크 표만0으로 만든 조건이다. 각 제어기를 따로 최적화한 성능 경쟁이 아니다.

| 조건 | FF-only RMSE | PD-only RMSE | FF+PD RMSE | 전체 완료 FF / PD / FF+PD | FF 추가의 짝지은 RMSE 개선95%구간 |
|---|---:|---:|---:|---:|---:|
| 기본 모델 + 초기 각도 미세 오차 | 69.60° | 3.11° | 0.66° | 0/20 · 20/20 · 20/20 | 2.45–2.45° |
| 외란 토크 | 65.76° | 3.13° | 0.76° | 0/20 · 20/20 · 20/20 | 2.36–2.38° |
| 모터 출력 저하 | 56.25° | 4.75° | 2.31° | 0/20 · 20/20 · 20/20 | 2.41–2.48° |
| 출력·질량·감쇠 변화 + 외란 | 60.50° | 11.66° | 10.02° | 0/20 · 13/20 · 14/20 | 1.30–1.96° |

개선값은 PD-only 오차에서 FF+PD 오차를 뺀 값이다. 음수이면 이 사전 토크 계획이 같은 이득의 PD-only보다 오차를 키운 것이다. 원시 결과·완료 차이와 모든 시드의 로그는 results/ablation/에 있다. 추가 계획은 초기 결과를 본 뒤 수립했으므로 사후 설계라는 점을 명시한다. 새 시드는 내부 시뮬레이션 반복이며 외부 사람·동작·로봇의 검증이 아니다.
새 복합 조건에서 FF+PD는 PD-only보다 평균1.632도 낮았고 짝지은95%구간은1.299–1.964도였다. 그러나 완료 수는13/20→14/20으로1개 차이이며 완료율 차이의95%구간은0–0.15다. 완료 성공률이 확실히 개선됐다고 주장하지 않는다. 원래 시드에서는8/20이었으므로 추가 시드의14/20만 선택해 전체 성능처럼 제시해서도 안 된다.

추가 설정 SHA256: `c3ef9d5fbce230d4b87a109e53ccffade53f6dc01f4008f5a213c7c11364c0e5`

재현: `python experiments/motion_control/ablation.py freeze` 후 `python experiments/motion_control/ablation.py evaluate`. 기존 고정/결과가 있으면 덮어쓰지 않는다.

## 원래160개 평가 결과


| 조건 | Open-loop RMSE | 피드백 RMSE | 전체 구간 완료: Open-loop / 피드백 | 짝지은 RMSE 개선 95% 구간 |
|---|---:|---:|---:|---:|
| 기본 모델 + 초기 각도 미세 오차 | 69.55° | 0.66° | 0/20 / 20/20 | 62.78–74.96° |
| 외란 토크 | 60.43° | 0.75° | 0/20 / 20/20 | 54.97–65.21° |
| 모터 출력 저하 | 56.27° | 2.31° | 0/20 / 20/20 | 53.70–54.23° |
| 출력·질량·감쇠 변화 + 외란 | 60.63° | 13.93° | 0/20 / 8/20 | 43.44–49.85° |

**복합 조건에서 피드백도 12/20개 에피소드를 완료하지 못했다.** 평균 각도 오차가 작아졌다는 것과 모든 구간을 제시간에 수행했다는 것은 다르다. 이 실패를 포함한 모든 에피소드를 기록했다.

부트스트랩 구간은 짝지은 시드 20개의 내부 시뮬레이터 변동에 대한 구간이다. 다른 사람·동작·로봇·현실 환경으로의 일반화 신뢰구간이 아니다.

## 공정한 비교와 기준 제어기의 한계

두 제어기는 같은 역동역학 토크 계획, 초기 상태, 외란과 모터 제한을 사용한다. Open-loop는 명목 모델의 목표 q/q̇/q̈에서 미리 계산한 토크만 재생한다. 피드백은 여기에 실제 관절 q/q̇ 기반 PD 보정을 더하고 같은 총 토크 제한을 적용한다. Open-loop의 실제 상태는 제어 명령에 들어가지 않는다.

**명목 토크 계획 자체가 예산을 만족하지 않는 구간이 있다.** 어깨 원시 토크는 좌우 14.90/19.29Nm까지 올라가지만 허용치는 각각12Nm다. 전체 관절-시점의 0.3571%가 잘렸고, 7.25–9.64s 사이 100개 적분 시점에서 적어도 하나의 토크가 잘렸다.
따라서 기본 조건의 큰 Open-loop 오차를 초기 각도 잡음만의 결과나 순수한 외란 제거 효과로 해석하면 안 된다. 토크 예산 불충족, 불안정한 팔 자세의 민감도, 적분·재생 오차가 함께 영향을 준다. 같은 제한을 썼다는 비교의 조건은 유지되지만, 강한 최적 제어 기준선과의 비교는 아니다. 독립 역동역학 점검은 별도의 audit 파일을 참고한다.

## 기준 영상과 리타게팅

기존 generated_reference의 원시 COCO17 포즈를 사용했다. 영상 평면에서 양쪽 어깨 및 팔꿈치 각도를 계산하고 몸통 방향을 빼 고정 몸통의 네 힌지에 대응시켰다. 기준 포즈 관측률은 네 관절 모두100%였다. 원시 각도, 평활화 전후 목표 및 제한 전 목표를 reference.npz에 보존했다.
평활화 후 관절 제한에 잘린 비율은 0.00%다. 원시 관절별 초과율은 [0.0, 0.346, 0.0, 0.692]%이며 순서는 왼어깨·왼팔꿈치·오른어깨·오른팔꿈치다.
2D 투영에는 깊이와 축 회전의 모호성이 있다. 합성 인물의 2D 자세를 완전한 3D 인체 동작으로 복원한 것이 아니다. 팔 충돌은 비활성화했고 몸통은 고정되어 있다. 다리·균형·보행·접촉·손 조작은 구현 범위 밖이다.

## 동작 완료와 복구의 정의

14초 에피소드에 1초 시작 대기, 원본 12초, 약1초 끝 대기를 둔다. 원본 시간 기준 다섯 창(2.6–3.5,4.75–5.75,6.75–7.75,8.75–9.75,10.75–11.9초) 각각에서 네 관절 모두12도 이내 오차를0.35초 유지해야 전체 완료다. 마지막 창에는 실제 neutral 전이 일부가 포함되어 있다. 이는 사전에 고정한 시간창의 **목표 궤적 추종 조건**이며 정확한 의미적 동작 경계나 춤 품질 정답이 아니다.

외란 끝 이후 처음12도 이내를0.35초 유지한 시작 시점까지를 복구 시간으로 계산한다. 외란 조건의 피드백은 대부분 이미 허용 오차 안에 있어 약1ms라는 값은 다음 적분 표본의 위치를 뜻한다. 밀리초 만에 무너진 동작을 복원했다는 성능 주장으로 쓰지 않는다. Open-loop가 끝부분 중립 자세에서 뒤늦게 오차 범위에 들어온 것도 복구로 기록될 수 있으므로 완료 지표와 함께 읽어야 한다.

| 외란 조건 | 제어기 | 관측된 복구 | 복구된 경우 평균 시간 |
|---|---|---:|---:|
| 외란 토크 | open_loop | 20/20 | 6.756s |
| 외란 토크 | feedback | 20/20 | 0.001s |
| 출력·질량·감쇠 변화 + 외란 | open_loop | 18/20 | 6.731s |
| 출력·질량·감쇠 변화 + 외란 | feedback | 20/20 | 1.081s |

MuJoCo의 관절 제한은 연성 제약이다. Open-loop의 최대 제한 초과는 약5.20도였고, 피드백 조건에는 측정된 제한 초과가 없었다. 명령 포화, 실제 모터 토크, 외부 외란 토크 및 절대 기계적 일을 별도로 기록했다. 서로 다른 모터 출력 이득은 짝지은 두 제어기에 동일하게 적용된다.

## 고정 및 재현

고정 설정 SHA256: `a5c1323c02bc27c5fa54b08375658def70712d88825db5e8b8c896f8ca9571b3`

개발용 시드0–4에서 세 가지 PD 설정을 평균 RMSE로 비교해 선택한 후 코드·물리 모델·기준 궤적·토크 계획 해시를 고정했다. 미관측 시드100–119의4조건×20시드×2제어기=160개 평가를 한 번 실행했고 이후 튜닝하지 않았다. 명목 피드백의 관절 KP는[65,26,65,26], KD는[9,3.5,9,3.5]다.

combined/seed100의 영상 선택은 평가 전에 고정했다. results/comparison.mp4는 실제 물리 적분 궤적을 MuJoCo로 렌더링한 것으로, 초록 팔이 실제 상태, 주황 선이 영상 기반 목표다. 이 예시에도 피드백 오차가 남는다. 렌더링 시 저장된 qpos를 재생하지만, 평가 에피소드 안에서 qpos를 목표로 덮어쓰지 않는다.

```sh
python -m pip install mujoco==3.13.0 numpy imageio-ffmpeg pillow matplotlib
# 기존 결과는 보존된다. 새 실험 폴더에서 다음을 순서대로 실행한다.
python experiments/motion_control/benchmark.py develop
python experiments/motion_control/benchmark.py evaluate
python experiments/motion_control/render_simulation.py
python experiments/motion_control/report_results.py
python experiments/motion_control/test_benchmark.py
```

develop는 고정 파일이 있으면 중단하고 evaluate는 결과가 있거나 고정 해시가 달라지면 중단한다. 원본 입력은 sibling motion_compliance/results/generated_reference/poses.json이다. 독립 구현 점검은 본 평가 결과와 분리해 실행한다.

## 근거 파일과 범위

- frozen_config.json: 평가 전 고정 조건·시드·해시
- development_results.json: 개발 후보 전체 결과
- results/summary.json: 조건별 결과와 짝지은 불확실성
- results/episodes.json:160개 에피소드의 시드·외란·지표
- results/trajectories/:조건별 seed100 실제500Hz NPZ 및약29.4Hz JSON
- results/actuator_budget_audit.json: 명목 토크 예산 점검
- results/open_loop.mp4,feedback.mp4,comparison.mp4: 실제 MuJoCo 렌더
- results/tracking_seed100.png: 관절별 목표·실제 추종 곡선

Physical AI의 입력 관측→목표 변환→물리 행동→센서 피드백 고리를 시뮬레이션으로 연결했다. 온라인 피드백은 이상적인 관절 센서이며 비전 피드백이 아니다. 정책 학습·실제 로봇 배치·안전 보증·사람 동작 정확도 벤치마크를 구현했다고 주장하지 않는다.

MuJoCo 공식 근거: [Python API](https://mujoco.readthedocs.io/en/stable/python.html), [동역학과 역동역학](https://mujoco.readthedocs.io/en/stable/computation/index.html).
