Skip to main content
Summary

로봇 정책은 데이터에서 시작된다

LeRobot은 실제 로봇 학습을 위해 모델, 데이터셋, 학습 도구를 함께 제공하는 프로젝트다. 특히 사람이 직접 조작해 만든 시연 데이터와 이를 이용한 모방학습이 중요한 위치를 차지한다.1 그래서 LeRobot을 잘 쓴다는 말은 단순히 학습 명령어를 실행할 줄 안다는 뜻이 아니다. 로봇이 무엇을 보고, 어떤 상태에 있었고, 그때 어떤 행동을 했는지 기록한 데이터를 이해한다는 뜻이다.

로봇 정책은 입력으로 관찰값을 받고 출력으로 행동값을 낸다. 예를 들어 카메라 이미지와 관절 위치를 보고, 다음 순간의 관절 목표 위치나 그리퍼 열림 정도를 출력한다. 이 대응 관계가 정확히 쌓여 있어야 정책이 좋은 행동을 배운다. 반대로 카메라 프레임은 현재 장면을 보여주는데 행동 라벨은 한 박자 늦은 명령이라면, 모델은 엉뚱한 원인과 결과를 연결해 학습한다.

이 장의 핵심은 하나다. 좋은 로봇 정책은 대부분 좋은 데이터에서 출발한다.

로봇 학습 데이터의 이해AI 생성 이미지

기본 단위는 에피소드다

LeRobotDataset을 이해할 때 가장 먼저 잡아야 할 단위는 에피소드다. 에피소드는 하나의 작업 시도다. 컵을 집어 올리는 작업이라면, 로봇이 시작 자세에서 움직이기 시작해 컵을 잡고 목표 위치에 놓거나 실패하고 멈출 때까지가 하나의 에피소드다.

각 에피소드는 시간 순서가 있는 프레임들의 묶음이다. 한 프레임에는 보통 다음 정보가 함께 들어간다.

  • 시간 정보: timestamp, frame_index, episode_index

  • 관찰값: 카메라 이미지, 관절 위치, 그리퍼 상태, 속도, 힘 센서 값 등

  • 행동값: 관절 목표 위치, 관절 속도 명령, 엔드이펙터 이동 명령, 그리퍼 열기·닫기 명령 등

  • 태스크 정보: 자연어 작업 설명 또는 task ID

  • 종료·성공 정보: 에피소드가 끝났는지, 성공했는지, 패딩된 행동인지 등

여기서 관찰값은 정책이 보고 판단하는 입력이다. 행동값은 정책이 배워야 하는 정답이다. 모방학습에서는 사람이 텔레오퍼레이션으로 로봇을 움직이며 만든 행동이 정답 역할을 한다.

중요한 점은 에피소드가 논리적 단위라는 것이다. 학습자와 사용자는 여전히 "하나의 작업 시도"를 에피소드로 다룬다. 하지만 실제 디스크에 저장되는 방식은 LeRobot 버전에 따라 달라질 수 있다. 특히 v3.0 형식에서는 에피소드 하나가 반드시 파일 하나에 대응하지 않는다.2

v3.0 저장 구조: 에피소드와 파일은 다르다

초기 방식에서는 에피소드마다 별도 파일을 두는 구조가 자연스러웠다. 작은 실험에서는 이해하기 쉽다. 10개 에피소드면 10개 파일, 100개 에피소드면 100개 파일이다. 하지만 로봇 학습 데이터가 수십만, 수백만 에피소드로 커지면 문제가 생긴다. 운영체제와 파일시스템은 너무 많은 작은 파일을 다루는 데 약하다. 파일 탐색, 업로드, 다운로드, 인덱싱이 모두 느려진다.

LeRobotDataset v3.0의 핵심 변화는 논리 단위와 물리 저장 단위를 분리한 것이다. 에피소드는 여전히 학습과 검수의 기본 단위지만, 저장할 때는 여러 에피소드의 저차원 데이터가 더 큰 Parquet shard에 묶일 수 있고, 카메라 프레임도 카메라별 MP4 shard에 묶일 수 있다. 그리고 메타데이터가 각 에피소드가 어느 파일의 어느 구간에 있는지 알려준다.2

쉽게 말해, 책의 한 장이 에피소드라면 파일은 책 한 권이나 묶음 파일에 가깝다. 독자는 여전히 장 단위로 내용을 읽지만, 실제 보관은 여러 장을 한 권에 묶어서 한다. LeRobot은 메타데이터를 통해 필요한 장을 찾아 꺼낸다.

이 방식의 장점은 세 가지다.

  1. 파일 수가 줄어 대규모 데이터셋 관리가 쉬워진다.

  2. 필요한 열이나 구간만 읽을 수 있어 학습 속도와 저장 효율이 좋아진다.

  3. Hugging Face Hub 같은 원격 저장소에서 전체 다운로드 없이 스트리밍으로 접근하기 쉬워진다.

따라서 v3.0 데이터셋을 볼 때는 "파일 하나가 에피소드 하나인가?"보다 "메타데이터가 에피소드 경계와 feature 의미를 정확히 설명하는가?"를 먼저 봐야 한다.

데이터셋 디렉터리 구조 읽기

LeRobotDataset v3.0 형식은 보통 data/, videos/, meta/를 중심으로 구성된다.2

my_robot_dataset/
  meta/
    info.json
    stats.json
    tasks.jsonl
    episodes/
      ...parquet
  data/
    chunk-000/
      file-000.parquet
      file-001.parquet
  videos/
    chunk-000/
      observation.images.front/
        file-000.mp4
      observation.images.wrist/
        file-000.mp4

data/에는 실행 중 기록된 저차원 데이터가 들어간다. 저차원 데이터란 이미지처럼 큰 픽셀 배열이 아니라, 관절 각도, 그리퍼 값, 속도, 행동 벡터처럼 숫자 벡터로 표현되는 정보를 말한다. 이 데이터는 Apache Parquet 형식으로 저장된다. Parquet은 열 기반 파일 형식이다. 필요한 열만 빠르게 읽을 수 있고 숫자 배열을 효율적으로 압축할 수 있어 로봇 학습 데이터에 잘 맞는다.3

videos/에는 카메라 프레임이 MP4 shard로 저장된다. 카메라 이미지를 Parquet 안에 모두 넣으면 파일이 지나치게 커지고 다루기 어렵다. 그래서 숫자 데이터는 Parquet에, 카메라 영상은 MP4에 두고, 학습 시점에 timestamp와 frame index, episode offset 같은 메타데이터를 기준으로 둘을 연결한다.2

meta/에는 데이터셋을 해석하는 데 필요한 설명이 들어간다. 대표적으로 meta/info.json에는 feature 이름, shape, dtype, FPS, 코드베이스 버전, data/video shard 경로 템플릿 같은 정보가 기록된다. meta/stats.json에는 정규화에 필요한 평균, 표준편차, 최솟값, 최댓값이 들어간다. meta/tasks.jsonl은 자연어 태스크 설명과 task ID를 연결한다. meta/episodes/에는 에피소드별 길이, task, offset 정보가 저장된다.2

결국 데이터셋을 이해한다는 것은 파일 이름을 외우는 일이 아니다. meta/info.json의 feature schema를 읽고, data/와 videos/가 그 schema와 맞게 연결되는지 확인하는 일이다.

관찰값과 행동값의 의미

로봇 데이터에서 관찰값과 행동값을 구분하지 못하면 이후 학습 설정을 이해하기 어렵다.

관찰값은 현재 로봇과 환경의 상태다. 예를 들어 다음과 같은 값들이 포함될 수 있다.

  • observation.images.front: 정면 카메라 이미지

  • observation.images.wrist: 손목 카메라 이미지

  • observation.state: 관절 위치, 그리퍼 상태, 속도 등

  • timestamp: 해당 관찰이 기록된 시간

행동값은 그 순간 로봇에 내려진 제어 명령이다. 예를 들어 다음과 같은 형태가 가능하다.

  • 다음 관절 목표 위치

  • 관절 속도 명령

  • 엔드이펙터의 x, y, z 이동량

  • 손목 회전 명령

  • 그리퍼 열림·닫힘 값

어떤 행동 공간을 쓰는지는 로봇과 정책 설계에 따라 달라진다. 관절 제어 방식이면 행동 벡터가 각 관절의 목표값을 뜻한다. 엔드이펙터 제어 방식이면 행동 벡터가 로봇 손끝의 이동 방향과 회전을 뜻할 수 있다. 중요한 것은 데이터셋의 action 의미와 학습할 정책의 출력 의미가 반드시 같아야 한다는 점이다.

예를 들어 데이터셋의 action은 관절 위치인데, 정책 출력 설정을 속도 명령처럼 해석하면 로봇은 이상하게 움직인다. 모델이 틀린 것이 아니라 데이터 의미를 잘못 연결한 것이다.

시간 정렬이 품질을 결정한다

로봇 데이터에서 가장 흔한 문제는 값 자체보다 시간 정렬이다. 카메라는 30fps로 이미지를 찍고, 로봇 컨트롤러는 30Hz 또는 그 이상의 주기로 관절 상태와 명령을 기록할 수 있다. 이때 같은 샘플에 들어가는 이미지, 상태, 행동이 같은 행동 구간을 가리켜야 한다.

실습 기준으로는 카메라 30fps, 관절 상태와 행동 데이터 30Hz처럼 동일한 시간 해상도를 쓰면 다루기 쉽다. 30fps에서는 프레임 간격이 약 33ms다. 이 정도면 대부분의 입문용 조작 작업에서 충분하고, 저장 용량과 시퀀스 길이도 과도하게 늘어나지 않는다.3

다만 단순히 첫 번째 이미지에는 첫 번째 관절값, 두 번째 이미지에는 두 번째 관절값을 붙이는 방식은 위험하다. 센서마다 실제 도착 시간이 조금씩 다르기 때문이다. 더 안전한 방식은 카메라 프레임의 timestamp를 기준으로 삼고, 그 시간에 가장 가까운 관절 상태와 행동 데이터를 매칭하는 것이다. 허용 오차는 로봇 속도와 제어 주기에 따라 달라진다. 빠른 조작일수록 작은 시간 차이도 큰 행동 차이를 만든다.

정렬이 깨지면 정책은 잘못 배운다. 예를 들어 로봇 손이 아직 큐브에 닿기 전 이미지에 그리퍼 닫기 행동이 붙어 있어야 한다. 그런데 지연 때문에 이미 큐브를 잡은 뒤의 이미지에 그 행동이 붙으면 모델은 잡아야 할 시점을 늦게 배운다. 실제 배포에서는 손이 물체를 밀어내거나 허공에서 그리퍼를 닫을 수 있다.

수집 후 반드시 확인할 것

데이터 수집이 끝났다고 바로 학습을 시작하면 안 된다. 먼저 데이터셋을 열어 기본 품질을 확인해야 한다. LeRobotDataset으로 로드한 뒤 전체 길이와 첫 샘플을 확인하는 것만으로도 많은 오류를 잡을 수 있다.2

확인해야 할 항목은 다음과 같다.

  • 전체 프레임 수가 예상과 맞는가?

  • 에피소드 수가 수집 설정과 맞는가?

  • 각 에피소드 길이가 비정상적으로 짧거나 길지 않은가?

  • timestamp가 단조 증가하는가?

  • 프레임 간 시간 간격이 지나치게 흔들리지 않는가?

  • 카메라 이미지와 관절 상태가 같은 동작 구간을 가리키는가?

  • observation.state 차원과 action 차원이 설정과 맞는가?

  • 누락 프레임이나 깨진 비디오가 없는가?

  • meta/info.json의 feature schema가 실제 샘플과 맞는가?

  • 정제 후에는 meta/stats.json이 다시 계산되었는가?

특히 에피소드 초반과 후반을 눈으로 확인하는 습관이 중요하다. 데이터셋 숫자는 정상처럼 보여도, 실제 영상과 행동을 함께 보면 동기화 오류가 바로 보이는 경우가 많다.

성공 데이터와 실패 데이터의 선택

모방학습에서 성공 에피소드는 가장 중요한 재료다. 목표 정책이 따라 해야 할 표준 행동 분포를 만들기 때문이다. 같은 작업을 다양한 초기 위치, 조명, 물체 자세에서 성공한 데이터가 많을수록 정책은 더 안정적으로 행동한다.

실패 에피소드는 무조건 나쁜 것은 아니다. 실패에서 회복하는 행동을 배우게 하거나, 해서는 안 되는 패턴을 구분하는 데 도움이 될 수 있다. 예를 들어 물체를 놓쳤을 때 다시 접근해 잡는 시연은 유용하다. 장애물에 닿을 뻔했을 때 멈추고 경로를 수정하는 시연도 가치가 있다.

하지만 모든 실패를 넣으면 안 된다. 단순한 조작 실수, 텔레오퍼레이터의 장난, 센서 오류, 동기화 오류, 카메라 가림, 로봇 통신 지연으로 인한 실패는 정책에 해로운 잡음이 된다. 이런 데이터는 제외하거나 별도 라벨로 관리해야 한다.

실무적으로는 다음 기준을 권장한다.

  • 성공 에피소드는 기본 학습 데이터에 우선 포함한다.

  • 실패했지만 복구 행동이 명확하면 별도 라벨을 붙여 포함할 수 있다.

  • 실패 원인이 데이터 오류라면 학습 데이터에서 제외한다.

  • 실패 원인이 작업 난이도라면 분석용으로 보관하고, 목적에 맞게 선별한다.

  • 성공 여부는 별도 feature나 episode 메타데이터로 명확히 남긴다.

즉, 실패 데이터의 가치는 실패 자체가 아니라 라벨과 의도에 있다.

기록 명령은 데이터 설계의 일부다

LeRobot에서 실제 로봇 데이터를 기록할 때는 최신 문서 기준으로 lerobot-record를 사용한다.4 SO-101 계열 예시에서는 로봇 타입, 포트, 카메라 설정, 텔레오퍼레이션 장치, 데이터셋 repo id, 에피소드 수, 작업 설명을 함께 지정한다. 기록된 데이터는 LeRobotDataset 형식으로 저장되고, 설정에 따라 Hugging Face Hub에 업로드될 수 있다.

여기서 중요한 것은 기록 명령이 단순 실행 옵션이 아니라 데이터셋의 의미를 결정한다는 점이다. 카메라 이름을 어떻게 붙였는지, 작업 설명을 무엇으로 기록했는지, 에피소드 시간을 몇 초로 했는지, 중간에 취소한 에피소드를 어떻게 처리했는지가 모두 이후 학습과 재현성에 영향을 준다.

따라서 데이터를 모을 때는 다음을 미리 정해야 한다.

  • 어떤 카메라를 쓸 것인가?

  • 카메라 이름을 어떻게 통일할 것인가?

  • state에는 어떤 값을 넣을 것인가?

  • action은 어떤 제어 공간으로 기록할 것인가?

  • 에피소드 종료 기준은 무엇인가?

  • 성공과 실패는 누가, 언제, 어떻게 라벨링할 것인가?

  • 중단된 기록을 재개할 때 기존 데이터와 충돌하지 않는가?

좋은 데이터셋은 우연히 만들어지지 않는다. 수집 전에 스키마를 정하고, 수집 중에 기록 상태를 확인하고, 수집 후에 동기화와 라벨을 검증해야 한다.

정리

LeRobotDataset에서 학습의 기본 단위는 에피소드다. 하지만 최신 v3.0 저장 구조에서는 에피소드 하나가 반드시 파일 하나에 대응하지 않는다. 여러 에피소드의 저차원 데이터와 비디오 프레임이 shard에 묶이고, 메타데이터가 개별 에피소드와 프레임 구간을 찾아준다. 이 구조 덕분에 대규모 데이터셋과 스트리밍 학습이 가능해진다.

각 에피소드는 시간 순서가 있는 관찰 시퀀스와 행동 시퀀스로 구성된다. 관찰에는 이미지와 로봇 상태가 들어가고, 행동에는 정책이 실제로 출력해야 할 제어 명령이 들어간다. 이 둘이 정확한 시간에 맞춰져 있어야 정책이 올바른 원인과 결과를 배운다.

데이터 품질의 핵심은 세 가지다. 첫째, 스키마가 명확해야 한다. 둘째, 센서와 행동의 timestamp가 잘 정렬되어야 한다. 셋째, 성공과 실패를 의도에 맞게 선별하고 라벨링해야 한다. 이 세 가지가 갖춰지면 이후 정책 학습, 평가, 배포의 대부분이 훨씬 쉬워진다.

참고

1LeRobot 공식 Hugging Face 페이지

2LeRobotDataset v3.0 · Hugging Face

3로봇 모방학습 데이터 수집 실무 정리

4Imitation Learning on Real-World Robots · Hugging Face

책 목록

LeRobot 실전 가이드: 데이터 수집부터 로봇 배포까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기