TL;DR
- H2O 184 seq / 114,329 frame 전체가 실패 없이 변환되었고, v1 LeRobot dataset(
527 ep / 46,188 frame)을 v2.1·v3.0 모두 load 검증함.
- v1 채택률이 56%에 그친 주 원인은 두 가지 버그였음.
- IK recovery teleport: 126 seq, 0.4–6 rad 점프.
- z-score feature 오류: "평균 IK 오차 > 1 mm"를 outlier로 판정해 151 ep를 거부함.
- 세 가지를 수정함.
- joint-space transition: 모든 프레임 이동을 joint ≤ 0.12 rad, site ≤ 0.04 m로 제한.
- approach-roll slew limit: 5°/frame.
- z-score feature: motion 지표만 사용.
L1/L2 기준으로 694→715 ep, 61.1k→65.1k frame, joint jump 366→0.
- 최종: replan + vlm 재실행(197097, 1h51m, 실패 0)과 export(197120, 41 min) 완료. LeRobot
695 ep / 63,385 frame(후보 frame의 69.8%)을 v2.1·v3.0 모두 load 검증함. v1 대비 +168 ep, +37% frame. 새 피처 aux.ik_transition (2,) 추가.
1배경/목적
목표는 단일 sequence e2e 검증을 넘어 H2O 전체(train/val/test)를 학습용 bimanual ALOHA 데이터셋으로 만드는 것. 대규모 실행에서 나타나는 실패, 처리량, curation 통과율을 측정했음. 그런데 v1 export에서 후보 933 episode 중 527개만 채택되어, 손실 원인을 분석했음.
2Full run 결과 (v1)
segment (SAM 3)
74 min · cover 11.2%
main (IK·ProPainter·render)
65 min
export v2.1→v3.0
36 min · 705/674 MB
| split | 후보 ep | 채택 ep | 채택 frames |
| train | 569 | 252 | 20,843 |
| val | 122 | 79 | 6,935 |
| test (VLM label) | 242 | 196 | 18,410 |
| 단독 거부 사유 (v1) | episodes | 진단 |
| L2 dataset z-score outlier | 158 | 버그: 155개가 ik_pos_err_mean feature 때문 (cutoff 1.0 mm) |
| L2 IK joint jump > 8 rad/s | 123 | 버그: recovery multi-start가 step box 없이 teleport |
| L1 ik_fail_ratio > 0.1 | 36 | 실제 kinematic 한계 (in-air) |
| L2 gripper rate p99 | 16 | 손 개폐가 빠름 |
| L3 VLM | 9 | score 분포: 5점 857, 3점 75, 2점 1 |
로드 검증 (v2.1, v3.0 동일): max |action[k] − state[t+1+k]| = 0, max |state − robot.npz| = 1.1e-7, image와 composite의 평균 차이 2.76/255.
3원인 분석 → 수정
(a) IK recovery teleport
tracking은 step box(0.12 rad/frame)를 쓰지만, 그 상한에 막혀 target을 못 따라가면 rot err가 20°까지 쌓임. 그 시점에 _recover(multi-start, step box 없음)가 한 프레임에 0.4–6 rad를 점프했음.
- jump 377개 중 144개는 180° 대칭 flip 전환이었음.
- target 쪽 원인: 손이 펴질 때 fingertip 축이 최대 25°/frame 회전함. 6.9°/frame을 넘는 프레임 중 89.5%가 approach 축 roll이었음.

subject1/h1/1 왼손. (좌) roll slew limit, (중) wrist_rotate: 기존 IK는 frame 164·194에서 teleport, (우) 최대 joint 속도: 기존 25 rad/s spike, 수정 후 ≤ 3.6 rad/s. 이 구간에서는 roll limit만으로 transition이 필요 없어짐.
IK (ego2robot/ik.py)
- recovery 해가 0.12 rad 또는 0.04 m보다 멀면 → joint-space transition
(직선 segment, FK target tracking, error는 실제 target 기준 → 정직하게 IK failure로 집계)
- recovery 중 재시드 안 된 팔은 step box 유지 (_StepBoxLimit.active)
- 먼 target은 max_tcp_step(0.04 m/frame)로 catch-up, 마지막 guard에서 site step ≤ 0.04 m 보장
Retarget (ego2robot/retarget.py)
- approach_roll (parallel transport) + zero-phase slew limit, max_roll_step_deg = 5
Curation (ego2robot/curation.py)
- z-score features = TCP speed mean/p99, joint vel mean/p99, gripper rate mean (IK error 제외)
(b) 재평가 (prepare + L1/L2, 184 seq, CPU sbatch)
| variant | accepted ep | frames | jump frames | max joint step | 비고 |
| 기존 (v1) | 694 | 61,057 | 366 | 6.12 rad | 126 seq teleport |
| A: transition (1차, 버그) | 686 | 62,113 | 17 | 2.93 | TCP jump 거부 71 ep |
| B5: + roll 5° | 712 | 64,641 | 0 | 0.12 | TCP jump 거부 41 ep |
| B3: + roll 3° | 732 | 66,317 | 0 | 0.12 | roll 편차 >10°가 6.9% 프레임 |
| C: B5 + TCP cap | 715 | 65,134 | 0 | 0.12 | TCP speed 거부 5 |
| D: C + site guard (채택) | 715 | 65,134 | 0 | 0.120 | site step max 0.0400 m |
B3가 episode 20개를 더 살리지만 closing 방향 충실도가 낮음. 그래서 B5를 채택함. roll 편차(mod 180°) >10° 비율: B5 2.2%, B3 6.9%.
IK failure frame 비율은 4.4%→7.4%로 증가함. teleport로 "성공 처리"되던 프레임이 이제 실제 target 기준으로 실패로 집계되기 때문임.
4최종 결과 (replan + export)
replan + vlm (197097, 4 GPU)
1h51m · 184/184
export v2.1→v3.0 (197120)
41 min · 959/914 MB
max joint step / site step
0.1200013 rad / 0.0400 m
IK fail / transition frames
7.40% / 2.54%
| split | 후보 ep | v1 채택 | 최종 채택 | 최종 frames |
| train | 569 | 252 | 368 | 32,621 |
| val | 122 | 79 | 101 | 9,045 |
| test (VLM label) | 242 | 196 | 226 | 21,719 |
| 합계 | 933 | 527 (46,188 fr) | 695 (74.5%) | 63,385 |
| 단독 거부 사유 | v1 | 최종 | 진단 |
| L2 dataset z-score outlier | 158 | 10 | motion 지표만 사용 |
| L2 IK joint jump | 123 | 0 | teleport 제거 |
| L1 ik_fail_ratio > 0.1 | 36 | 187 | teleport로 숨겨지던 실패가 정직하게 집계됨 |
| L2 gripper rate p99 | 16 | 18 | 손 개폐가 빠름 |
| L3 VLM | 9 | 10 | score 분포: 5점 869, 3점 61, 2점 3 |
ik_fail_ratio로 거부된 199 ep의 실패 프레임 12,073개 중 32.8%(3,960)가 transition 프레임임. 즉 flip이나 branch를 바꾸는 이동 비용임. transition을 줄이면 최대 107 ep가 기준(≤10%)을 넘을 수 있음. scene별로 고르게 분포함(o1 39, k2 37, k1 35, h2 33, h1 30, o2 25).
로드 검증 (v2.1, v3.0 동일): 695 ep / 63,385 frame / 36 task, label은 gt 469, vlm 226. max |action[k] − state[t+1+k]| = 0, max |state − robot.npz| = 1.1e-7, aux.ik_transition이 robot.npz["transition"]과 일치, image와 composite의 평균 차이 2.87/255.
5Takeaway
분석
full run의 데이터 손실 1, 2위는 vision 품질이나 로봇 한계가 아니었음. 속도 bound를 우회하던 recovery 경로와 0에 몰린 지표에 쓴 robust z-score였음. 이제 export되는 모든 action chunk가 joint 3.6 rad/s, TCP 1.2 m/s 안에 들어감. 즉 실제 ALOHA가 재현할 수 있는 trajectory임. 최종 채택률은 56%에서 74.5%로 올랐음(frame 기준 +37%). 남은 거부의 대부분(187/226 단독 사유)은 ik_fail_ratio임. 그 실패 프레임의 2/3는 ALOHA wrist의 kinematic 한계(in-air 조작)이고, 1/3은 greedy recovery가 만드는 transition임.
6Next
- 최종 데이터셋:
/home/nas_main/taewoongkang/Dataset/H2O_ego2robot/aloha/lerobot/h2o_ego2robot_aloha_{v21,v30}. v1은 _r1로 보존함.
- transition 감소: 지금은 greedy recovery라서 flip/branch 전환이 생김. sequence 전체를 보고 branch를 고르는 방식(DP나 look-ahead)으로 바꾸면 ik_fail 거부를 최대 107 ep까지 줄일 수 있다는 가설.
- 남은 한계:
- ALOHA stroke가 58 mm라서 넓은 물체를 관통함. 7-DOF arm으로 가려면 N-DOF 일반화가 필요함.
- test split의 VLM label 정확도.