한 행은 숫자의 묶음보다 강한 계약이다
로봇 학습용 데이터의 관측은 정책이 판단할 때 볼 수 있는 상태/영상 등의 입력이고, 행동은 그 관측에 대응해 실행하도록 정한 출력이다. 지시문은 무엇을 하려는지 조건을 제공한다. 에피소드는 하나의 시도에 속한 연속 기록이며 시작/종료와 결과를 묶는다. 한 파일에 행을 많이 쌓았다고 이 관계가 자동으로 보존되지는 않는다.
그림 M20.03-1. 각 칸은 서로 다른 역할/근거다. 아래 방향은 자료/처리의 연결이며 실제 성공을 자동으로 보장하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
합성 feature observation.state의 shape를 [3]으로 두고 성분 순서를 (관절 1,관절 2,그리퍼)라고 명시하자. 앞 두 값은 rad, 마지막은 0~100 정규화다. dtype=float32라는 저장 형식만으로 이 단위를 알 수 없다. 같은 shape의 action은 이 예제에서 안전 제한 후 전송한 절대 목표이며 성분 순서/표현도 동일하다고 정의한다. 이 뜻은 Dataset이 자동 정해 주는 보편 규칙이 아니라 수집/정책의 계약이다.
관측 (0.18,−0.12,48), 전송 목표 (0.2,−0.1,50)이면 현재 관측과 action은 다른 값이다. 행동을 다음 프레임의 실제 관측으로 대신하면 시스템의 추종/지연·제한을 포함한 결과와 명령을 섞게 된다. action이 증분이라면 같은 0.2를 현재 값에 더하는 전혀 다른 동작이 된다. 절대/증분·위치/속도와 제한 전/후 중 무엇을 기록했는지 명시하고, 다른 계약의 자료를 이름만 action으로 맞춰 합치지 않는다.
영상의 저장 shape와 학습 입력 shape를 나눈다
이 예제의 카메라 입력은 RGB/uint8/HWC=(240,320,3), 즉 높이/너비/색 채널 순서라고 정한다. 디코딩/전처리 뒤 학습 tensor는 CHW=(3,240,320)로 바꾼다고 별도로 정의한다. 저장 metadata와 로더 출력은 단계가 다르므로 축 순서를 확인한다. RGB/BGR, resize/crop과 카메라 이름·내부 보정도 연결해 기록한다. shape가 같아도 색 순서나 카메라 역할이 바뀌면 같은 관측이 아니다.
공식 LeRobotDataset v3 문서는 feature와 시간 창으로 반환되는 tensor를 구분하며, 시계열 영상의 [T,C,H,W] 예를 제공한다. 여기서 T는 선택한 시간 수, C는 채널 수다. 이 단위의 수치는 독자적인 작은 예이며 모든 저장/API 버전의 shape를 강제하지 않는다. 실제 사용 시 설치 commit·스키마와 전처리를 함께 확인한다.
지시문 '파란 블록을 오른쪽 트레이에 놓기'는 클래스/색·목표 관계를 제공하지만 실제 블록 ID나 트레이의 프레임을 저절로 정하지 않는다. 수집 시도와 연결한 지시문/과업 ID, 대상/목표 정의와 결과 기준을 기록한다. task_index가 0이라는 것만으로 뜻을 복원할 수 없으므로 그 ID에 대응하는 텍스트/메타데이터가 필요하다. 서로 다른 표현을 무조건 다른 과업으로, 같은 텍스트를 무조건 같은 환경으로 간주하지 않는다.
에피소드의 상대 시각을 전역 행 번호와 구분한다
작은 논리 표를 보자. timestamp는 에피소드 시작에 대한 초이며 frame은 해당 에피소드 안의 번호다. global row는 이번 표에서만 붙인 공유 파일의 행 번호다. e0는 성공 확인, e1은 그리퍼 유지 실패 후 종료했다고 기록한다.
| global row | episode | frame | timestamp(s) | task ID |
|---|---|---|---|---|
| 0 | e0 | 0 | 0.00 | 0 |
| 1 | e0 | 1 | 0.05 | 0 |
| 2 | e0 | 2 | 0.10 | 0 |
| 3 | e1 | 0 | 0.00 | 0 |
| 4 | e1 | 1 | 0.05 | 0 |
e0의 행 범위는 0~2, e1은 3~4로 총 5행이다. fps=20이라는 입력이면 명목 프레임 간격은 1/20=0.05 s다. e0의 첫/마지막 취득 시각 차이는 0.10 s로, 행 수 3을 fps로 나눈 0.15 s와 다르다. 마지막 프레임의 행동을 이후 한 간격 더 유지했는지와 기록 끝의 의미를 별도로 정의하지 않으면 두 값을 같은 '길이'라고 쓸 수 없다.
e1의 timestamp가 0으로 돌아가는 것은 새 시도의 상대 시간 시작이며 e0 안의 시계 역행과 다르다. 전역 행 번호가 증가한다는 이유만으로 5행이 한 연속 동작이라고 읽지 않는다. 물리 취득 시계/episode-relative 시간 변환과 영상별 시간도 보존해 reset/지연의 의미를 추적한다. 종료 이유와 성공/실패·중단을 독립 필드로 두며 실패를 파일 손상과 혼동하지 않는다.
시간 정합과 학습 창에는 경계 정책이 필요하다
관절 행의 timestamp가 0.05 s이고 대응 영상의 취득 시각은 같은 기준에서 0.03 s라면 시차는 20 ms다. 이번 스키마의 허용 절대 시차가 10 ms라고 주어지면 이 쌍은 기준을 넘는다. 같은 행에 넣었다는 사실이 동시 관측의 증거는 아니다. 카메라/상태의 시계·취득/수신 구분과 매칭/보간·결측 처리를 명시한다. 작은 허용치가 자동으로 시계를 보정하지도 않는다.
행동 시퀀스 길이 H는 한 관측에 연결할 연속 목표 수다. e0 frame1에서 H=2의 목표를 선택한다면 그 에피소드의 frame1/2가 후보가 된다. frame2에서 시작해 다음 global row3의 목표를 붙이면 e1의 초기화 이후 행동을 섞는다. episode 경계를 넘지 않도록 제외하거나 명시한 padding/mask 정책을 적용해야 한다. padding은 없는 실제 행동을 새로 관측했다는 뜻이 아니며 손실에서 유효 여부를 처리해야 한다.
끝 행의 action은 수집 절차에 따라 전송 목표가 있을 수도, terminal 관측만 있을 수도 있다. 마지막 관측이라고 해서 무조건 다음 action을 만들어 채우지 않는다. 이번 표는 모든 행에 전송 목표가 기록됐다고 정의하지만 다음 관측 존재/과업 성공을 보장하지는 않는다. 반대로 실패 episode의 유효 관측/명령을 무조건 삭제하면 복구/실패 원인의 근거를 잃을 수 있다. 사용 목적/결과 라벨에 따라 분리한다.
v3의 파일은 에피소드와 일대일이 아니다
LeRobotDataset v3는 표 데이터·영상과 이들을 연결하는 metadata를 구분한다. 여러 에피소드가 큰 Parquet/영상 shard를 공유할 수 있고 경계/offset으로 각 시도를 찾아간다. 따라서 file-000이라는 이름을 episode0으로 해석하지 않는다. 위 5행이 같은 파일에 있어도 e0/e1은 별도 시도다. metadata의 feature/단위·fps·파일 경로/범위와 영상 시간 대응이 같이 유효해야 한다.
기존 v2 계열의 episode당 파일 가정을 v3에 그대로 적용하지 않는다. 세부 task 파일명/경로는 revision에 따라 다를 수 있어 설치 버전의 API와 path template을 확인한다. 논리적인 episode/frame ID와 실제 파일/row·video offset을 분리해 기록하면 저장 파일을 합치거나 나눠도 원래 관계를 추적할 수 있다. 데이터셋 revision과 모델/보정·카메라 설정 버전도 묶는다.
수집 끝에는 사용 버전의 writer를 정상 마감하고 다시 읽어 경계/길이·영상/과업 연결을 검사한다. 현재 공식 Dataset API 소스의 finalize는 남은 쓰기 작업을 마감하는 역할이다. 이 호출이 데이터의 물리적 단위/라벨·시간 정합까지 옳게 만들어 주는 것은 아니다. 파일이 존재하는 것, writer가 닫힌 것, 재로딩되는 것, 의미 검사를 통과한 것을 각각 구분한다.
기존 5.3 LeRobotDataset v3 설계와 기존 5.4 데이터 수집/품질에서 실제 자료 구조를 더 확인할 수 있다. 기본 활동은 위 표만 분석하며 데이터 수집/외부 업로드/정책 학습을 실행하지 않는다.