loss_start_step 222~663 step(10 Hz), 모두 p768 안.AD^ε식 실패→회복 데이터를 실제로 뽑아서, 실패가 영상에 보이는지와 회복이 자연스러운지 확인한다.
gen_recovery.py: LegV2 _measure를 감싸 opening + b로 믿게 한다. 채점은 참 geometry. 실패 이벤트(align/descend/settle → backoff/recover)마다 attempt += 1, b·schedule[attempt]. ε_iid는 align/descend에서만 넣는다.
| config | 안착 | usable | 평균 실패 | 실패 시 참 lateral (mm) |
|---|---|---|---|---|
| b8 (1,0) | 5/6 | 5/6 | 0.83 | 6.3~15.5 |
| b12 (1,0) | 6/6 | 6/6 | 1.0 | 9.7~14.5 |
| b15_dec (1,0.5,0) | 6/6 | 6/6 | 2.83 | 12~26 |
| iid4 | 6/6 | 4/6 | 0.83 | 2.5~13.7 |
| b12_iid3 | 6/6 | 6/6 | 1.0 | 6.5~14.1 |



실패 프레임에서 b 방향 가독성 정량화 → 신호 강화(b 15~20mm, rim에서 더 누르기, 부분 교정) → converter에 loss_start_step 추가 → 규모 확장.
| config | usable | 평균 실패 | 영상 판정 |
|---|---|---|---|
| b18 | 5/6 | 1.0 | 중간 |
| b22 (1,0) | 6/6 | 1.17 | wrist에 구멍 테두리 전체가 leg 옆에 보임 |
| b20_dec (1,0.5,0) | 6/6 | 2.33 | 테두리가 시도마다 leg 쪽으로 다가옴 |
| b12_press | 6/6 | 1.0 | 누르는 동안 변화 없음 |
| b20_drop / b25_drop | 1/6 / 3/6 | — | 쓰러짐은 잘 보이나 621~1321 step |




숨은 변수의 종류보다 "시도할수록 점점 나아지는" 형식이 핵심이라는 방향에 맞춰, b0 = 24 mm에서 시도마다 b를 줄였다. loss는 첫 시도를 context로 쓰고 이전보다 나아진 시도 전부에 건다(AD 방식).
| config | 안착 | 단조 개선 | 시도 수 | 나아진 시도 |
|---|---|---|---|---|
| lin5 | 6/6 | 6/6 | 5~6 | 25/25 |
| lin4 | 6/6 | 6/6 | 4 | 18/18 |
| lin3 | 6/6 | 6/6 | 3 | 12/12 |
| geo4 | 6/6 | 5/6 | 4~6 | 19/20 |
| lin4_iid | 6/6 | 6/6 | 4~5 | 20/20 |
| iid_lin4 (노이즈만) | 5/6 | 1/6 | 1~4 | 11/15 |

num_clean_frames)뿐이고, proprio는 현재 시점 1개([B, D])뿐이다. action은 anchor부터 시작하는 미래 chunk 32 step만 학습 타깃으로 쓴다. 실패 시도의 action은 영상으로만 history에 남는다.구현
gen_recovery.py
--randomize: episode별 curriculum. K∈{2..5}, b0~U[18,28]mm, lin/geo, 50%는 ε_iid 3mm.--save-train: action 직전 obs, state, 실행한 action, attempt를 저장한다.convert_recovery_to_longwam.py
meta/loss_segments.jsonl에는 감독 창 [t, t+33) 전체가 개선된 시도 안에 있는 anchor만 쓴다.robotta_longwam/loss_segment_dataset.py
dataset_uniform으로 원래 demo와 1:1로 섞는다.furniture_one_leg_recovery(p768: 801 frame, past 768), TASK=furniture_one_leg_recovery bash scripts/furniture/train_longwam_b200.sh| 확인 항목 | 결과 |
|---|---|
| smoke 1 ep (lin2, b0 19mm) | 실패 1회(17.9mm) → 안착 0.12mm @210 → 조립 473 frame, 31 s, npz 12 MB |
| anchor | [161, 473) 312개(66%). 시도 0인 frame 0–160은 context 전용 |
| 단위 테스트 | pass: 원래 175,145 frame 전부 anchor. 시도 0이나 개선 없는 시도를 감독하는 창 0개. action chunk가 생성기 action과 일치. history에 시도 0 frame 161개 포함 |
| p768 학습 smoke, batch 6 | OOM 178 GB (2 cam 224×448 → robocasa보다 token 2배) |
| p768 학습 smoke, batch 2 | 정상, 피크 94 GB, loss 1.64→1.26 (5 step), sampler dataset_uniform groups=2 |
진행 중: 대량 생성 job 192818–192821(seed 1000–1415, 416 ep, GPU 1장당 8 process, core-own).
| 항목 | 값 |
|---|---|
| 생성 job | 192818–192821, GPU 4장, 각 1:21–1:25 |
| 안착 / 전체 조립 / usable | 396 / 353 / 395 (총 416) |
| seat frame | median 399, max 1469. 768 초과 13개 |
| 통과율 낮은 curriculum | lin5_iid 16/22, geo5_iid 18/26 (시도가 많으면 seat가 늦거나 조립 미완) |
--gres=gpu:8을 물려받아 대기 → --gres=gpu:0으로 193006 재제출.| 변환 (193006, 4:39) | 결과 |
|---|---|
| 통과 / 탈락 | 348 통과. 탈락: 조립 미완 43, 미안착 20, 안착 늦음 5 |
| frame / anchor | 248,689 frame, anchor 154,778 (62.2%), context 전용(시도 0) 93,487 |
| 단위 테스트 (전체 데이터) | pass: 금지 창 0개, 무작위 8 샘플 action chunk 일치, history에 시도 0 frame 236–348개 |