5손가락 물리 도킹 시뮬레이션 손가락 겹침(Interpenetration) 실측 진단
초록
5손가락 AmazingHand 스타일 도킹 시뮬레이션(GIF)에서 사령관이 지적한 '손가락이 겹쳐 보이는' 현상을 정성적 안심이 아닌 실측 수치로 검증했다. data.contact[i].dist(부호있는 침투 깊이)를 도킹 구간 전체(500 물리 스텝)에서 로깅한 결과, 캡슐 반경(6mm) 대비 최대 2.33배(14mm), 손가락-손가락 쌍 기준 최대 2.0배(12mm)의 실제 지오메트리 관통이 약 2초간 지속됨을 확인했다. MuJoCo 기본 solimp/solref의 정상적 연성 접촉 허용 범위(반경의 수 %)를 크게 초과하는 수치로, 손가락 굽힘 PD 목표각이 실제 기하학적 여유보다 깊게 설정된 것이 원인으로 추정된다.
배경
2026-08-05 세션에서 scripts/render_5finger_docking.py로 생성한 5손가락 물리 도킹 GIF에서
사령관이 "손가락이 겹쳐 보이는 게 물리적 충돌 미반영 아니냐"고 직접 지적했다. 당시 보고한
"최대 접촉력 374.68N, 최대 동시접촉점 39개"는 접촉이 발생했다는 사실만 보여줄 뿐, 그 접촉이
실제로 지오메트리 관통(interpenetration)을 막았는지는 검증하지 못한 상태였다.
방법
scripts/diag_finger_interpenetration.py를 신규 작성해 기존 도킹 시뮬레이션(접근 구간
운동학적 qpos 대입 → 도킹 구간 mj_step 실물리, weld 없이 순수 geom-geom 접촉)을 렌더링 없이
동일하게 재현하면서, 도킹 구간 전체에서 data.contact[i].dist(부호 있는 침투 깊이, 음수=관통)를
매 물리 스텝(10 substep × 50 frame = 500스텝, timestep 0.002)마다 로깅했다. 손가락 캡슐 지오메트리
반경은 6mm(size="0.006")로 고정되어 있어, 침투 깊이를 반경 대비 비율로 정규화해 판단 기준으로
삼았다.
결과
| 항목 | 수치 |
|---|---|
| 캡슐 반경 | 6mm |
| 전체 최악 침투 | -14mm (반경의 2.33배), t=1.5s 접근→도킹 전환 순간 (handB_index_geom vs handA_palm) |
| 손가락-손가락 최악 침투 | -12mm (반경의 2.0배 — 캡슐 중심선이 서로 완전히 겹치는 수준) |
| 지속 시간 | t≈1.5~3.5s 약 2초간 -12mm로 거의 고정, t=3.75s부터 -3mm로 완화(접촉수 39→8개 감소) |
| 손가락-손가락 관통 샘플 수 | 9,503건 (도킹 구간 500스텝 × 다중 접촉쌍) |
침투가 집중된 지오메트리 쌍은 실제 악수처럼 교차 삽입되는 손가락 조합이었다:
handA_thumb↔handB_pinky, handA_index↔handB_ring, handA_ring↔handB_index,
handA_middle↔handB_middle.
침투 깊이가 정확히 2×반경(0.012m)에서 약 2초간 고정된다는 점이 핵심 단서다. MuJoCo 기본
solimp/solref(0.9, 0.95, 0.001)가 허용하는 연성 접촉의 정상 침투는 보통 반경의 수 % 수준이며,
100~233%에 달하는 이번 수치는 접촉 강성 부족만으로 설명되지 않는다. 손가락 굽힘 PD 제어의
목표각(CURL_TARGET)이 실제 두 손의 기하학적 여유 공간보다 더 깊이 파고들도록 설정되어 있고,
접촉력이 그 명령 스프링력과 팽팽히 균형을 이루는 상태로 관통이 유지되는 것으로 판단된다.
결론
사령관의 지적은 정확했다. GIF의 손가락 겹침은 렌더링 착시가 아니라 반경 최대 2.33배(14mm) 수준의
실제 지오메트리 관통이며, 접촉쌍 다수에서 약 2초간 지속된다. 이전 세션의 "접촉력 374.68N"
보고만으로는 이 문제를 포착할 수 없었고, contact.dist 직접 로깅이 필요했다.
향후 조치 후보(미착수, 사령관 판단 대기)
solref강성 상향(예:(0.005, 1)등 더 짧은 시상수)으로 접촉 저항 강화CURL_TARGET축소 또는 손가락 간 여유 공간을 반영한 궤적 재설계- 두 조치를 함께 적용 후 재측정으로 침투율 재검증
산출물
- 진단 스크립트:
scripts/diag_finger_interpenetration.py - 실측 결과:
data/finger_interpenetration_report.json(요약 + 프레임별 상세 로그)
