← Blog디버깅 전쟁 일지· 3/7

joint 속도가 한도의 40배였다 — peak KPI가 숨긴 12,078 dps

물건을 집어 든 '최대 높이'만 보는 peak KPI는 로봇팔이 이동 중 물건을 떨어뜨려도 PASS를 줬다. 궤적(trajectory) KPI를 심자, 'PASS'였던 셀의 절반이 joint 속도 한도의 40배로 날뛰고 있었다.

약 2분
debuggingmanipulatorKPItrajectorywar-story

joint 속도가 한도의 40배였다

로봇팔이 물건을 집어 옮기는 시뮬레이션을 검증하고 있었습니다. KPI는 "PASS"였습니다. 그런데 영상을 보면 팔이 미친 듯이 날뛰며 물건을 집었다 놓쳤다 했습니다. 숫자는 통과인데 눈으로 보면 명백한 실패 — 어디가 잘못된 걸까요?

peak KPI의 맹점

원인은 측정 지표에 있었습니다. 당시 "물건을 들어 올렸는가"를 최대 높이(peak)로 쟀습니다 — 들림 = 최고 높이 − 시작 높이. 문제는, 팔이 이동 중에 물건을 떨어뜨려도 그 최고점은 기록에 남는다는 것입니다.

도식 렌더링 중…

peak는 "한순간이라도 들었으면" 통과시킵니다. 이동 중에 19번을 떨어뜨려도, 한 번 든 최고점만 있으면 PASS인 셈입니다.

궤적 KPI가 드러낸 진실

그래서 궤적(trajectory) KPI를 심었습니다 — 매 순간(10Hz) 물건의 위치, 잡고 있던 시간, 관절 속도, 손목 회전을 기록. 그러자 진실이 드러났습니다.

가장 심한 셀(다중 큐브 경유점 이동)의 측정값:

  • 관절 최대 속도 12,078 deg/s — ISO 권장 한도(약 300)의 40배
  • 손목 회전 누적 697°
  • 이동 중 물건 낙하 19회

셀별 최대 관절 속도(로그 스케일). peak KPI는 전부 통과시켰지만, 실제로는 PICKPLACE가 한도(300, 초록선)의 40배인 12,078 dps로 날뛰었다. 진짜 PASS 셀(시안)은 한도 부근에 있다.셀별 최대 관절 속도(로그 스케일). peak KPI는 전부 통과시켰지만, 실제로는 PICKPLACE가 한도(300, 초록선)의 40배인 12,078 dps로 날뛰었다. 진짜 PASS 셀(시안)은 한도 부근에 있다.

차트가 한눈에 보여줍니다 — "PASS"로 기록됐던 셀들 중 일부가 한도를 로그 스케일로 넘어 솟아 있습니다.

⚠️ peak는 거동을 숨긴다 — 최댓값 하나만 보는 지표는 "어떻게 거기 도달했는가"를 못 봅니다. 똑같이 "들어 올림 = 성공"이어도, 매끄럽게 든 것과 19번 떨어뜨리며 든 것은 완전히 다른 거동입니다. 궤적을 봐야 그 차이가 보입니다.

진짜 PASS는 어떻게 생겼나

전체 셀 중 진짜로 통과한 3개의 공통점은 분명했습니다.

  • 단일 큐브 짧은 동작 — 경유점이 적어 관절 속도가 한도 근처(약 299 dps).
  • 강화학습 정책 — 학습된 부드러운 동작이라 잡고 있던 시간이 가장 길었음(8.57초).

반대로 실패한 셀은 모두 다중 큐브 경유점 이동에서 경로 계획기가 공격적으로 자세를 전환하며 관절이 폭주했습니다.

💡 "숫자 PASS"를 믿지 말고 거동을 봐라 — 이 사건의 교훈은, KPI가 통과여도 어떻게 통과했는지를 궤적으로 확인해야 한다는 것입니다. 사용자가 "영상이 이상하다"고 한 직관이 정확했고, peak 숫자가 그 직관을 가리고 있었습니다.

한 줄 정리

📌 "최대 높이"만 보는 peak KPI는 이동 중 19번 떨어뜨려도 PASS를 줬다. 궤적 KPI(매 순간 위치·잡은 시간·관절속도)를 심자, PASS였던 셀이 관절 속도 한도의 40배(12,078 dps) 로 날뛰고 있었다. 숫자가 아니라 거동을 봐야 한다.