Index
2026-10-09 — Experiment

Isaac Lab Franka 타격: 시도하며 적응하는 정책

try-and-suc | EmbodiedSWE(Isaac Lab) 스택, front·wrist 카메라, 이미지 + state → 관절 목표 action chunk

TL;DR

12,288
학습 에피소드
98~100%
오라클 @3 (학습·보간)
49 / 67 / 42%
히스토리 정책 @3
29 / 65 / 27%
기억 없는 정책 @3

1 과제와 장면

테이블에 고정된 Franka Panda가 닫은 그리퍼 아래 둥근 말렛으로 파란 퍽을 쳐서, 빨간 목표 원(반경 5cm) 위에 멈추게 한다. 한 에피소드는 같은 숨은 물성으로 5번 시도한다. EmbodiedSWE의 robobench(Isaac Lab 2.3, Isaac Sim 5.1)에 scene을 런타임 등록해서 쓴다.

interp_views_0.webp
히스토리 정책이 5번 시도하는 모습. 왼쪽이 front 카메라, 오른쪽이 wrist 카메라(둘 다 224×224, 정책 입력과 같은 화면). 12.5fps로 녹화.
숨은 변수학습 범위처음 보는 범위(보간)범위 밖(외삽)
퍽-테이블 마찰0.012–0.0400.030–0.0350.009–0.012, 0.040–0.046
퍽 질량 [kg]0.10–0.300.22–0.260.07–0.10, 0.30–0.38
테이블 경사 [°]0–0.350.15–0.220.35–0.42

목표까지 거리 0.22–0.38m, 방향 ±30°. 시도마다 마찰 3% 변동과 퍽 위치 2mm 이동을 넣었고, GPU 물리 자체의 비결정성도 있다.

범위가 좁은 이유: 실제 Panda 관절 속도 한계 때문에 앞으로 미는 손 속도가 약 0.64 m/s에서 포화된다(측정). 한계를 풀지 않고 필요한 속도가 0.6 m/s 이하가 되도록 마찰과 거리를 잡았다. 경사는 PhysX에서 환경별 중력을 바꿀 수 없어 퍽에 같은 크기의 수평 힘을 주는 방식이다.

2 학습 데이터

규모: 12,288 에피소드(64개 병렬 환경 × 192 샤드, 70GB). 에피소드 하나 = 숨은 물성과 배치를 고정하고 컨텍스트 시도 4회 + 오라클 시연 1회. 총 61,440번의 스윙을 Isaac에서 실행했다. 생성 속도는 64 에피소드당 85~100초(B200 1장), 4개 잡으로 약 1시간 20분.

에피소드에 저장되는 것형태용도
컨텍스트 시도 영상 (front)4 × 8프레임 × 224×224×3과거 시도 토큰의 영상
컨텍스트 시도의 관절 목표 궤적4 × 64스텝 × 7과거 시도 토큰의 "실행한 action"
컨텍스트 시도의 로봇 state 궤적4 × 65스텝 × 10과거 시도 토큰의 손 위치 궤적
컨텍스트 시도의 퍽 정지 위치4 × 2수치 결과를 쓰는 변형(VAN, AN)에만
오라클 시연 관측 (front + wrist)4시점 × 224×224×6현재 관측 입력
오라클 시연 state / 관절 목표65 × 10 / 64 × 7state 입력 / 정답 라벨
숨은 물성, 배치, 오라클 스윙 파라미터스칼라들분석용(정책에는 주지 않음)

(a) 오라클 시연은 어떻게 만드나

스윙은 방향 θ와 접촉 속도 v 두 값으로 정해지는 스크립트 동작이다: 준비 자세 → 퍽 뒤 8cm 지점으로 이동(0.5초) → θ 방향으로 가속해 v에 도달 → 퍽을 6cm 밀고 → 4cm 안에 급정지해서 퍽을 떠나보낸다. 이 손 경로를 미분 IK로 관절 목표 궤적(25Hz, 64스텝)으로 바꾼 것이 action이다. 에피소드마다 "진짜 물성에서 퍽이 목표에 멈추는 (θ, v)"를 Broyden 방법으로 탐색한다(배치 시도 8회). 탐색 잔차는 평균 0.38cm, 99퍼센타일 1.38cm이고(3,072개 표본), 찾은 스윙을 다시 실행했을 때 12,288개 중 12,252개(99.7%)가 목표 안에 멈췄다. 학습에는 성공한 시연만 쓴다.

interp_mean_vs_oracle_0.webp
같은 에피소드에서 왼쪽은 물성을 알고 찾은 오라클 스윙, 오른쪽은 평균 마찰을 가정한 스윙. 물성을 모르면 같은 배치에서도 빗나간다(마찰 0.0331, 평균 가정 0.026).

(b) 컨텍스트 시도는 어떻게 만드나

정책이 "이전에 이렇게 쳐 봤더니 이렇게 됐다"로 읽을 재료다. 오라클 스윙의 속도에 3–50% 크기의 무작위 오차(로그 정규), 방향에 그에 비례하는 오차를 넣은 스크립트 스윙이고, 에피소드의 절반은 첫 시도를 평균 마찰 가정 스윙으로 했다. 시도마다 마찰 3% 변동과 퍽 2mm 이동이 들어간다. 컨텍스트 시도의 속도 오차는 평균 |log(v/v*)| 0.18~0.20, 정지 위치 오차 중앙값 7.5cm, 시도별 성공률 약 34%다(3,072개 표본).

data_context.webp
학습 데이터의 한 에피소드에 저장된 컨텍스트 시도 4개(시도당 8프레임, 실제 저장된 화면). 마찰 0.0182, 질량 0.193kg, 경사 0.31°; 오라클 속도 0.288 m/s에 대해 0.352, 0.335, 0.170, 0.281 m/s로 쳤고 네 번째만 성공.
같은 컨텍스트 시도를 펼친 것. 한 줄이 시도 1회(0, 0.7, 1.1, 1.5, 1.9, 2.4, 3.2초, 정지 후).
오라클 시연에서 정책 질의 시점(0, 0.64, 1.28, 1.92초)의 관측. 위 front, 아래 wrist.

분할: 학습 데이터는 학습 범위에서만 뽑는다(보간 띠 제외). 마지막 600 에피소드는 검증용. 평가 에피소드는 다른 시드로 새로 뽑는다.

3 모델과 학습

현재 관측front + wrist RGB를 6채널로 쌓음(224×224) + state 10차원(관절 7, 손 xyz 3) + 질의 시점 번호(0–3)
+
과거 시도 0–4개시도마다: front 영상 8프레임(24채널) + 관절 목표 궤적·손 위치 궤적(2스텝 간격, 32×10=320차원)
→
트랜스포머토큰 = 과거 시도 4칸(없는 칸은 마스크) + 질의 1개. 4층, d=256, 4헤드, pre-norm
→
출력앞으로 32스텝의 관절 목표(7차원), 준비 자세 기준으로 정규화. 16스텝 실행 후 다시 질의
구성 요소구조파라미터
관측 CNNconv 5층(stride 2, 5×5, 32-64-128-256-256, GroupNorm+SiLU) + 좌표 채널, 7×7 펼쳐서 FC → 2566.00M
과거 영상 CNN같은 구조, 입력 24채널(8프레임을 채널로 쌓음)6.01M
궤적 MLP / state MLP320 → 512 → 256 / 10 → 256 → 2560.30M / 0.07M
트랜스포머 / 출력 head4층 d=256 / LayerNorm → 512 → 224(=32×7)3.16M / 0.25M
합계주 모델(영상+행동) 15.79M, 기억 없는 정책 9.48M

학습 문제: 표본 = (에피소드, 과거 시도 수 k ∈ 0–4, 질의 시점 j ∈ 0–3). 입력은 오라클 시연의 j번째 관측·state와 저장된 컨텍스트 시도 앞 k개, 정답은 오라클 시연의 다음 32스텝 관절 목표. 모델은 컨텍스트 시도를 따라 하도록 배우지 않는다. 그것을 읽고 오라클이 했을 동작을 맞히도록 배운다.

손실: 정규화한 action chunk의 MSE 최적화: AdamW lr 3e-4 (워밍업 1,000 step + 코사인), weight decay 0.01, batch 128, bf16, EMA 0.999, grad clip 1.0 학습량: 16,000 step, 500 step마다 검증, 검증 최고점 체크포인트 사용 (주 모델 14,500 step, 기억 없는 정책 4,500 step) 데이터: 학습 11,652 / 검증 600 에피소드, 전부 GPU 메모리에 올려 학습 소요: B200 1장, 주 모델 43 ms/step 약 15분, 기억 없는 정책 15 ms/step 약 6분 비교 모델: 같은 데이터·같은 라벨, 컨텍스트만 다름 (없음 / 영상 / 영상+행동 / 영상+행동+수치 / 행동+수치)
검증 오차 (정규화 chunk MSE)과거 시도 0개1개2개3개4개
영상+행동 (주 모델)0.007440.000550.000360.000300.00027
영상만0.007470.000640.000430.000360.00033
영상+행동+수치0.007430.000620.000390.000320.00028
행동+수치 (영상 없음)0.007690.000950.000610.000470.00042
기억 없는 정책0.00832(과거 시도를 보지 않음)

저장된(스크립트) 컨텍스트로 재면 과거 시도 하나만 봐도 오차가 13배 줄어든다. 이 이득이 폐루프 성공률로 이어지지 않는 것이 5절의 핵심 문제다.

평가 방식: 64개 병렬 환경에서 정책을 폐루프로 실행한다. 시도마다 4번(0, 0.64, 1.28, 1.92초) 카메라를 렌더하고 state를 읽어 chunk를 받고, 관절 목표를 25Hz로 실행한다. 2.56초 뒤 팔은 멈추고 퍽이 설 때까지 기다린다. 다음 시도에는 방금 시도의 영상 8프레임과 실행 궤적이 컨텍스트로 들어간다. 모든 정책이 같은 에피소드와 같은 시도별 변동을 쓴다.

4 학습된 정책이 실제로 하는 것

세 칸은 같은 에피소드(같은 숨은 물성, 같은 시도별 변동)다. 왼쪽은 물성을 아는 오라클 스윙, 가운데가 히스토리 정책, 오른쪽이 기억 없는 정책. 평가용 시드의 처음 세 에피소드를 고르지 않고 실었다.

interp_policies_0.webp
처음 보는 범위 #0 (마찰 0.0331, 질량 0.243kg, 경사 0.20°, 거리 0.261m). 히스토리 정책 1차 성공, 기억 없는 정책 2차 성공.
interp_policies_1.webp
처음 보는 범위 #1 (마찰 0.0340, 질량 0.247kg, 경사 0.19°, 거리 0.301m). 둘 다 1차 성공.
interp_policies_2.webp
처음 보는 범위 #2 (마찰 0.0340, 질량 0.238kg, 경사 0.19°, 거리 0.370m). 히스토리 정책 4차, 기억 없는 정책 3차 성공.

이 묶음 16개에서 첫 성공 시도는 히스토리 정책 [1, 1, 4, 실패, 1, 2, 1, 1, 1, 3, 1, 1, 1, 5, 1, 실패], 기억 없는 정책 [2, 1, 3, 2, 1, 3, 1, 1, 실패, 1, 1, 4, 실패, 2, 1, 실패]다. 장난감 버전처럼 "2~3번째에 확실히 고쳐 맞히는" 모습이 아니라, 두 정책 모두 맞을 때도 있고 빗나갈 때도 있다.

extrap_policies_fail.webp
범위 밖 물성에서의 실패 사례(일부러 고름; 마찰 0.0095, 질량 0.360kg, 경사 0.36°, 거리 0.361m). 히스토리 정책과 기억 없는 정책 모두 5번 안에 못 맞혔고, 오라클도 3차에야 성공했다.
interp_shuffle_0.webp
히스토리 바꿔치기. 왼쪽은 자기 시도를 본 경우, 오른쪽은 배치는 같고 물성이 다른 에피소드의 시도 기록을 보고 낸 명령을 그대로 실행한 경우.

5 수치와 진단

시도 횟수별 누적 성공률. 분할당 320 에피소드, 띠는 95% 신뢰구간.
3차까지 누적 성공률 (%)학습 범위보간외삽
오라클 스윙(물성 앎)97.8100.093.4
히스토리 정책 (영상+행동)49.467.242.2
같은 모델, 히스토리 삭제41.271.633.1
같은 모델, 다른 물성의 히스토리38.860.632.5
영상만50.367.239.4
행동+수치 결과(영상 없음)39.157.538.8
기억 없는 정책29.164.726.6
평균 마찰 가정 스크립트 스윙41.626.90.3
히스토리 − 기억 없음 (대응, %p)+20.3 [13.4, 27.5]+2.5 [−4.4, 9.4]+15.6 [9.7, 21.6]
게이트 기준(처음 보는 범위 +15%p, 셔플 시 소멸)으로 보면: 외삽은 +15.6%p로 턱걸이, 보간은 +2.5%p로 미달이다. 그리고 히스토리를 지운 같은 모델이 이미 기억 없는 정책보다 6.6~12.2%p 높아서, 격차의 상당 부분은 히스토리가 아니라 모델 차이에서 온다. 이 결과로 "통과"라고 말할 수 없다.
진단 1 — 실행 정밀도: 오라클 스윙은 같은 인터페이스(관절 목표)로 93~100% 성공한다. 학습된 정책은 노이즈를 0으로 해도 3차 69.1%(히스토리), 60.6%(기억 없음)라서 시도별 변동이 아니라 정책 출력의 오차가 한계다. 5cm 허용 오차는 거리 약 15%, 속도 약 8% 정밀도를 요구한다.
진단 2 — 컨텍스트 분포 이동: 보간 묶음 16개에서 히스토리 정책의 이동 거리 오차(절대값 평균)는 1차 12.8%인데 2~5차에 31~36%로 커진다. 손 최고 속도 오차도 5.6% → 12~15%. 학습 때 컨텍스트는 스크립트 스윙의 궤적이었고 평가 때는 자기가 낸 궤적이라, 히스토리가 들어오는 순간 출력이 흔들린다. 오프라인 검증 오차가 13배 줄어드는데 폐루프에서 이득이 없는 것과 맞아떨어진다.

전체 표: 학습 범위 (N=320)

정책1차까지2차까지3차까지4차까지5차까지
오라클 스윙(물성 앎)97.8 [96, 99]97.8 [96, 99]97.8 [96, 99]97.8 [96, 99]97.8 [96, 99]
히스토리 정책: 영상+행동 (주 모델)24.4 [20, 29]40.9 [35, 46]49.4 [44, 55]54.4 [49, 60]58.1 [53, 64]
히스토리: 영상만23.8 [19, 28]39.1 [34, 45]50.3 [45, 56]54.1 [48, 60]59.1 [53, 65]
히스토리: 영상+행동+수치 결과22.2 [18, 27]33.8 [28, 39]41.2 [36, 47]45.9 [40, 52]48.4 [43, 54]
히스토리: 행동+수치 결과(영상 없음)22.2 [18, 27]31.9 [27, 37]39.1 [34, 44]45.0 [40, 50]50.3 [45, 56]
주 모델, 히스토리 삭제21.2 [17, 26]35.0 [30, 40]41.2 [36, 47]45.3 [40, 51]50.9 [46, 56]
주 모델, 다른 물성의 히스토리21.9 [17, 27]33.8 [28, 39]38.8 [33, 44]41.2 [36, 47]44.7 [39, 50]
기억 없는 정책14.7 [11, 19]24.1 [19, 29]29.1 [24, 34]34.1 [29, 39]40.9 [36, 46]
평균 마찰 가정 스크립트 스윙35.6 [30, 41]40.6 [36, 46]41.6 [37, 47]42.8 [38, 48]42.8 [38, 48]

전체 표: 처음 보는 범위(보간) (N=320)

정책1차까지2차까지3차까지4차까지5차까지
오라클 스윙(물성 앎)100.0 [100, 100]100.0 [100, 100]100.0 [100, 100]100.0 [100, 100]100.0 [100, 100]
히스토리 정책: 영상+행동 (주 모델)46.6 [41, 52]62.5 [57, 68]67.2 [62, 72]69.4 [64, 74]72.2 [67, 77]
히스토리: 영상만49.1 [44, 55]60.6 [55, 66]67.2 [62, 72]71.6 [67, 76]76.2 [72, 81]
히스토리: 영상+행동+수치 결과50.3 [45, 56]61.3 [56, 67]67.8 [62, 73]68.8 [63, 74]70.3 [65, 75]
히스토리: 행동+수치 결과(영상 없음)40.6 [35, 46]51.6 [46, 57]57.5 [52, 63]63.7 [58, 69]65.9 [61, 71]
주 모델, 히스토리 삭제46.6 [42, 52]60.0 [55, 65]71.6 [67, 76]80.3 [76, 84]82.8 [79, 87]
주 모델, 다른 물성의 히스토리44.4 [39, 50]57.2 [52, 63]60.6 [55, 66]63.7 [58, 69]65.0 [59, 70]
기억 없는 정책35.6 [31, 41]53.4 [48, 59]64.7 [59, 70]67.2 [62, 72]72.2 [67, 77]
평균 마찰 가정 스크립트 스윙18.8 [14, 23]21.6 [17, 26]26.9 [22, 32]30.3 [25, 35]33.4 [28, 38]

전체 표: 범위 밖(외삽) (N=320)

정책1차까지2차까지3차까지4차까지5차까지
오라클 스윙(물성 앎)90.3 [87, 93]92.8 [90, 95]93.4 [91, 96]94.1 [92, 97]94.1 [92, 97]
히스토리 정책: 영상+행동 (주 모델)18.8 [14, 23]33.4 [28, 38]42.2 [37, 48]45.6 [40, 51]48.1 [42, 53]
히스토리: 영상만17.8 [14, 22]31.6 [26, 37]39.4 [34, 45]44.7 [39, 50]46.6 [41, 52]
히스토리: 영상+행동+수치 결과23.8 [19, 28]34.7 [30, 40]43.1 [38, 48]44.1 [39, 49]47.2 [42, 53]
히스토리: 행동+수치 결과(영상 없음)17.5 [13, 22]29.1 [24, 34]38.8 [34, 44]42.8 [38, 48]45.6 [40, 51]
주 모델, 히스토리 삭제15.9 [12, 20]28.7 [24, 34]33.1 [28, 38]36.6 [31, 42]38.8 [33, 44]
주 모델, 다른 물성의 히스토리21.2 [17, 26]30.0 [25, 35]32.5 [27, 38]34.4 [29, 39]35.9 [31, 41]
기억 없는 정책13.8 [10, 18]20.6 [16, 25]26.6 [22, 32]29.7 [25, 35]31.6 [27, 37]
평균 마찰 가정 스크립트 스윙0.3 [0, 1]0.3 [0, 1]0.3 [0, 1]0.3 [0, 1]0.3 [0, 1]

괄호는 95% 부트스트랩 신뢰구간(에피소드 재표집 2,000회). 누적 성공률 = 그 시도까지 한 번이라도 목표 안에 멈춘 에피소드 비율.

히스토리 절제: 주 모델, 히스토리 삭제, 다른 물성의 히스토리, 기억 없는 정책.
과거 시도 표현 비교. 영상만 준 모델이 영상+행동과 같은 수준이고, 영상을 뺀 모델(행동+수치)이 가장 낮다.

시도별 변동 크기를 바꿨을 때 (보간, 3차까지 누적 %)

정책0x1x2x3x
오라클 스윙100.0100.099.798.4
히스토리 정책69.167.266.663.1
기억 없는 정책60.664.765.063.7

1x = 마찰 3% 변동 + 퍽 2mm 이동. 변동을 3배로 키워도 오라클이 98.4%라서 이 과제에서 시도별 변동은 거의 영향이 없다. 정책 성공률이 변동 크기와 무관하게 60~69%인 것은 한계가 정책 출력 쪽에 있다는 뜻이다.

수정 이력: 첫 버전(v1)은 시연 action이 "현재 관절 + 피드백 보정"이라 상태 차이에 민감했고 격차가 +11.7 / +5.5 / +9.0%p였다. 시연을 매끄러운 계획 궤적(절대 관절 목표)으로 바꾸고 chunk를 16 → 32스텝으로 늘린 것이 지금 수치(v2, +20.3 / +2.5 / +15.6%p)다.

6 이전 장난감 버전과의 차이, 다음 단계

의미

추상 타격 버전(로봇 없음, 타격 파라미터 2개)에서는 히스토리 정책이 3번 안에 87~90%, 기억 없는 정책이 0%였다. 현실적인 설정으로 옮기자 그 격차가 대부분 사라졌는데, 적응 능력이 없어서가 아니라 (1) 정책이 관절 궤적을 정밀하게 내지 못하고 (2) 자기 시도를 컨텍스트로 받는 상황을 학습 때 본 적이 없기 때문으로 보인다. 즉 "기억을 쓰면 된다"는 가설 자체보다, 그것을 visuomotor 정책에서 실현하는 데 필요한 조건이 드러난 결과다. 또 로봇 팔이 영상에 보이면 영상만으로도 행동을 읽을 수 있어서, 영상만 준 모델이 영상+행동 모델과 같은 수준이다.

다음 실험 (우선순위 순)

  • 자기 롤아웃으로 컨텍스트 재수집(DAgger식): 학습된 정책이 낸 시도들을 컨텍스트로 모으고 같은 오라클 시연으로 라벨링해 재학습. 진단 2를 직접 겨냥한다. 데이터 재수집 포함 약 3시간.
  • 출력 정밀도: 평가를 fp32로, chunk 시간 앙상블, 손실에 속도(연속 목표 차이) 항 추가, 필요하면 diffusion/flow head.
  • 과제 범위: 속도 한계 안에서 마찰 범위가 좁아 평균 스윙도 36~42% 맞는다. 스윙 방식(관절 1 회전을 쓰는 휘두르기)으로 손 속도를 올리면 범위를 넓힐 수 있다.
  • 위가 해결된 뒤 Long-WAM/π 계열 파인튜닝으로 넘어간다.

한계: 과제 1개(퍽), 학습 시드 1개, 분할당 320 에피소드. 히스토리 삭제·바꿔치기와의 차이는 점 추정이다. 코드 try-and-suc/isaac/, 수치 results_isaac/summary.md, v1 결과 results_isaac_v1/.