Index
2026-09-16 23:21 – 23:41 — Analysis

Source-IK causal 진단 확장 — 타이밍 가설 기각 & feedback preset 악화

R2S | G003 robot/original-action, job 130562 / 130572 / 130578

TL;DR

37.4%
q RMSE 감소(fit, vs DLS)
3.91x
preset 교체 시 악화
2170
1ms 적분 스텝

1 배경 / 목적

기존 260915 카드(cartesian_source_ik_bridge)에서 공식 DROID RobotIKSolver를 teacher-forced로 재현해 rows 9-40 전부 bitwise 일치(RMSE=0)를 확인했고, 70ms causal bridge smoke도 성공했다. 이번 세션은 그 다음 단계로 진짜 causal 폐루프(매 스텝 현재 시뮬레이션 상태로 fresh IK를 다시 푸는 방식)에서 오차가 어디서 오는지 — state drift인지, action 적용 타이밍인지, controller feedback gain인지 — 를 분리했다.

기존 한계: job 125568 원본 action Cartesian replay는 블록이 0.22mm만 움직여 lift/stack 완전 실패(HYPOTHETICAL_LOCAL_DLS...NOT_2023_CONTROLLER_OR_IK_TRUTH) 상태였다. 원인이 IK 알고리즘 자체(이미 260915에 배제)인지, 아니면 폐루프 상태 drift·타이밍·gain인지 확인이 필요했다.

2 작업 내용

Job 130562 — 사전등록된 causal source-IK 진단

rows 9-40 free space(테이블/오브젝트 없음), B125615 XML + 125316 hybrid 행렬(factor 0.5) 고정. 매 제어 스텝마다 현재 시뮬레이션 q/qvel + 해당 row raw 6-vector Cartesian velocity로 fresh IK를 새로 풀어 qdes를 얻고, non-finite 값·BADQPOS/QVEL/QACC 카운터 증가 시 즉시 중단하는 안전장치 포함. 32 read samples, 31 controls, 2170개 1ms step.

Own CPU8/32GiB, GPU0, COMPLETED 0:0, 54s 소스: r2s/source_ik_causal_diagnostic.py 사전 리뷰에서 controller_fit.py 등 4개 헬퍼가 hash-pin 누락 발견 → 수정 후 재검증 architect 요구사항: contact-free 여부를 engine contact count로 명시 (결과: 0건, 계약 만족)

Job 130572 — action-state 호스트 타이밍 감사

이전 결과가 "action-state를 관측 시점(66ms 이전)으로 되돌리면 나아지지 않을까"라는 가설을 테스트. control_start(env.step 이전)와 step_end(호스트 반환 이후) 사이를 관측 read-start 상태들로 선형보간해 action-state와 비교. 로봇 command 전송이 unjoined 백그라운드 스레드라 어느 시점도 실제 actuation timestamp는 아님을 명시.

Job 130578 — 공식 Fairo 기본 feedback preset 비교

Facebookresearch/fairo commit 0a01a7f의 franka_hardware.yaml 기본값(Kq/Kx/Kxd는 130562의 2배, Kqd는 동일)으로 완전히 교체 — gain sweep이 아니라 "공식 소스가 실제로 쓰는 preset 그대로"라는 단일 비교. 130562 커널을 그대로 복사해 production 경로는 항상 fresh IK를 재계산하도록 유지.

3 결과 (수치)

PartitionSource-IK q RMSE (130562)이전 DLSRecorded-target oracleDLS 대비 감소
Fit rows 9-300.02315894 rad0.03699890 rad0.00830596 rad37.4%
Holdout rows 31-40 (nonblind)0.04412068 rad0.06528948 rad0.01019340 rad32.4%

오차 분해 (sim_qdes − recorded_qdes = state term + delta term)

ControlsState term RMSEDelta term RMSE합성 target 차이
9–30 (22개)0.0246952 rad0.00379495 rad0.0225991 rad
31–39 (9개, nonblind)0.0443339 rad0.00606490 rad0.0435914 rad
State term(누적 시뮬레이션 상태 drift)이 delta term(IK 증분 오차)보다 6~7배 크다 — IK 자체보다 폐루프 상태 누적이 지배적 오차원.

타이밍 가설 검증 (130572)

비교 대상Fit RMSE (rad)Holdout RMSE (rad)
시뮬레이션 상태 vs recorded action state0.02469520.0443339
Control-start 보간 상태 vs action state0.000255910.00017120
Step-end 보간 상태 vs action state0.000898560.00074421

호스트 호출 시간은 2~6ms(median 3ms)에 불과 — action-state는 이미 control_start와 거의 일치하므로, action-state를 66ms 뒤로 옮기는 재해석은 근거 없음으로 기각.

Feedback preset 교체 (130578)

PresetFit q RMSEHoldout q RMSE
130562 (기존)0.02315894000.0441206816
Fairo 공식 기본값0.0906692770 (3.91x)0.1951873293 (4.42x)
공식 기본 preset이 오히려 4배 가까이 악화 — closed-loop에서는 gain이 상태 자체를 바꾸므로, "공식값이니 더 정확할 것"이라는 가정이 틀렸다. 두 결과 모두 채택하지 않고 보존만.

4 Takeaway

의미

이번 확장으로 original-action Cartesian replay 실패(125568)의 잔차 성격이 더 명확해졌다: IK 알고리즘 자체(260915에 이미 배제), action-timestamp 해석(오늘 배제) 모두 원인이 아니고, 폐루프 상태 누적 drift가 지배적이며 controller gain은 알려진 하나의 preset(130562) 근방에서 민감하다. 즉 다음 개입은 "숫자를 더 튜닝"하는 게 아니라 2023 실제 하드웨어 설정에 대한 소스 근거를 더 찾아야 하는 문제로 좁혀졌다.

5 Next Steps

미해결 한계

State term(0.025~0.044 rad)이 왜 이렇게 크게 누적되는지 아직 분해되지 않았다 — 원본 action-space가 velocity인지 다른 표현인지도 확정되지 않음. Full-task(오브젝트 포함) contact 재현 실패(125568)는 이번 robot-only 진단으로는 아직 복구되지 않았다.

다음 실험

1) gain/delay grid search는 금지 — 대신 소스 근거(2023 하드웨어 로그, 추가 공식 문서)가 확보될 때만 하나의 bounded intervention을 시도. 2) state term이 dominant이므로 state 초기화/누적 방식 자체를 다음 진단 대상으로 지정. 3) wall/camera 진단(260917-scene_camera_correspondence_chain.html)과 독립적으로 진행 — 두 트랙 모두 G001/G003 완료 조건에 필요.