SO-100 암으로 첫 LeRobot 데이터셋을 기록하기 위한 AY-Robots 튜토리얼 페이지
LeRobotSO-100데이터셋 기록원격 조작모방 학습

SO-100으로 첫 LeRobot 데이터셋 기록하기

AY-Robots ResearchAugust 23, 202616분 읽기

SO-100으로 사용 가능한 LeRobot 데이터셋을 기록합니다: 캘리브레이션, 리더-팔로워 원격 조작, 실제 lerobot-record 플래그 및 기본값, 카메라 설정, 에피소드 수, 그리고 실행을 망치는 결함.

하나의 SO-100 팔로워, 동일한 디자인의 리더 암, 그리고 두 대의 USB 카메라로 오후에 정책을 미세 조정할 수 있습니다. 동일한 벤치에서 파일 브라우저에서 정상적으로 보이는 60개의 에피소드를 쉽게 생성하고 6시간의 GPU 실행을 낭비할 수도 있습니다. 차이는 모델에 있는 경우가 드뭅니다. 서보와 Parquet 파일 사이에서 발생한 일에 있습니다.

수동 경로와 더 짧은 경로가 있습니다. 모든 명령어는 2026년 8월 3일에 출시되어 PyPI에 현재 등록된 lerobot 0.6.1에서 가져온 것입니다. 콘솔 진입점으로 이동했으므로, python lerobot/scripts/control_robot.py를 실행하는 튜토리얼은 더 이상 존재하지 않는 파일을 설명합니다.

요약

  • lerobot 0.6.1은 v3.0을 기록합니다. GR00T N1.7 및 N1.5는 v2.1을 원합니다. 기록을 시작하기 전에 형식을 결정하십시오.
  • 네 가지 명령어: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. 보정에서 사용한 동일한 --robot.id 및 --teleop.id를 기록 세션으로 가져가십시오.
  • 실제 기본값: 30 fps, 에피소드당 60초, 60초 리셋, 50개 에피소드, 약 100분의 실제 시간.
  • 여기서 최소 에피소드: SmolVLA의 경우 30개, 나머지는 50개.
  • 다양성이 양보다 중요합니다. 데이터셋은 네 가지 이유로 실패합니다: 카메라 인덱스 교환, 프레임 드롭 또는 정지, 한계에 도달한 조인트, 읽을 수 없는 작업 문자열.

기록 세션이 캡처하는 내용

A LeRobot 데이터셋은 비디오 폴더가 아니라 비디오가 첨부된 시간 색인 테이블입니다. 모든 제어 루프 틱은 명령된 동작, 팔로워가 도달한 상태, 카메라당 한 프레임, 타임스탬프 및 인덱스를 포함하는 한 행을 기록합니다. 정책은 해당 열만 봅니다. lerobot/svla_so100_pickplace의 스키마는 meta/info.json에서 읽어옵니다.

특징데이터 타입형태설명
actionfloat32[6]리더 암의 조인트 목표
observation.statefloat32[6]팔로워가 도달한 조인트 위치
observation.images.topvideo[480, 640, 3]장면 카메라, MP4 (여기서는 av1)
observation.images.wristvideo[480, 640, 3]손목 카메라, 동일한 속도
timestampfloat32[1]에피소드 시작 이후 경과 시간(초)
frame_index, episode_index, index, task_indexint64[1]자동으로 채워지는 기록

조인트는 main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll 및 main_gripper입니다. 이는 SO-100의 6 자유도입니다. 액션과 상태는 형태를 공유합니다. 왜냐하면 리더-팔로워 원격 조작은 목표와 한 단계 후에 도달한 위치를 기록하기 때문입니다. 그 간격은 정보입니다: 팔이 중력이나 걸린 물체와 싸운 곳을 나타냅니다. 이 문자열들은 해당 데이터셋의 것입니다. 오늘 0.6.1로 기록된 세션은 버스에서 ID 1부터 6까지의 shoulder_pan.pos부터 gripper.pos까지를 기록합니다. 동일한 6개의 조인트이지만 키가 다릅니다. 이는 구성이 이름으로 기능을 지정하는 순간 중요해집니다.

실제 데이터셋에서 얻은 기준점

해당 데이터셋은 30fps로 50개의 에피소드와 19,631프레임을 포함합니다. 에피소드당 약 393프레임, 즉 13초입니다. 만약 당신의 데이터셋이 평균 1분이라면, 더 어려운 작업을 수행하고 있거나 양쪽 끝에서 유휴 시간을 기록하고 있는 것입니다.

LeRobot 데이터셋 형식에 대한 AY-Robots 용어집 항목으로, 디렉토리 레이아웃과 메타데이터 파일을 보여줍니다.
data/, videos/, meta/에 무엇이 저장되는지, 그리고 어떤 정책이 어떤 버전을 읽는지.

작업대에 필요한 것

항목세부 사항참고
팔로워 암SO-100, Feetech STS3215 서보 6개부품 비용 약 110~150 EUR
리더 암두 번째 SO-100, 기어 제거됨6개의 리더 모터 모두에서 기어 제거: 엔코더만, 마찰 감소
전원자재 명세서의 7.4 V STS3215 변형에 맞춰짐아래 경고 참조
카메라USB 카메라 2개, 640x480 (30 fps)장면 보기용 1개, 손목용 1개
호스트Python 3.12 이상, ffmpegrequires-python >= 3.12
허브 계정Hugging Face 쓰기 토큰optional with --dataset.push_to_hub=false
7.4 V, 12 V 아님

STS3215는 두 가지 버전으로 제공됩니다. SO-ARM100 README는 7.4 V 버전을 6 V에서 측정된 16.5 kg.cm 정지 토크로, 12 V 버전을 30 kg.cm로 평가하며, 12 V 모터를 선택하면 5 V 전원 대신 12 V 5 A+ 전원을 구매해야 한다고 명시합니다. 자재 명세서에는 7.4 V 서보가 나열되어 있습니다. 7.4 V 정격 서보에 12 V를 공급하면 서보가 손상되므로, 배선하기 전에 모터 라벨을 읽으십시오. 서보가 응답하지 않음.

팔이 아직 조립되지 않았다면, 그것은 별도의 작업입니다: 다음에서 시작하세요 SO-100 시작하기완벽한 SO-100 설정 가이드. 아직 아무것도 구매하지 않았다면, 먼저 SO-100 대 SO-101 비교를 읽어보세요: SO-101은 개선된 배선과 기어 제거 단계가 없는 최신 개정판이며, 녹화 워크플로우는 동일합니다.

lerobot 0.6.1 설치

bash
conda create -y -n lerobot python=3.12
conda activate lerobot

# TorchCodec is the default video decoder and needs ffmpeg
conda install ffmpeg -c conda-forge

# core_scripts = dataset + hardware + viz extras (record, replay, calibrate)
# feetech     = SDK for the STS3215 bus servos in the SO-100
pip install 'lerobot[core_scripts,feetech]'

lerobot-info
lerobot-info는 PATH에서 찾을 수 있는 ffmpeg 버전을 포함하여 시스템 요약을 출력합니다.

추가 기능(Extras)이 대부분의 사람들을 혼란스럽게 합니다. pip install lerobot은 핵심 ML 종속성만 설치하며, 로봇과 통신하는 기능은 없습니다. Koch 암은 dynamixel 대신 feetech을 필요로 합니다. 쉘이 lerobot-record를 알지 못한다면, 이것이 그 이유입니다.

포트, 모터 ID 및 캘리브레이션

부품과 작동하는 텔레옵 루프 사이에는 세 가지 일회성 단계가 있습니다. 은(는) 사용자의 팔에서 훈련된 정책을 다른 사람의 팔에서 실행하여, 원시 인코더 카운트를 공유된 조인트 규칙에 매핑합니다.

  1. 1
    각 팔의 USB 포트 찾기

    두 팔을 모두 연결한 상태에서 실행하고, 프롬프트가 표시되면 식별하려는 팔의 플러그를 뽑고 어떤 포트가 사라지는지 확인하십시오. Linux에서는 sudo chmod 666 /dev/ttyACM0이 필요할 수 있습니다.

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    모터 ID 및 보드레이트 기록

    ID는 한 번에 하나의 모터에 기록되며, 문서에는 엄격한 방법이 명시되어 있습니다: 컨트롤러 보드에 정확히 하나의 모터만 연결하고, 아직 다른 모터와 데이지 체인으로 연결하지 마십시오. 스크립트는 체인을 역방향으로 탐색하여 그리퍼에 먼저 ID 6을 부여하고, 이어서 wrist_roll에 5, shoulder_pan에 1을 부여합니다. 조립 전에 이 작업을 수행하십시오.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    두 팔 캘리브레이션

    모든 조인트를 범위의 중간으로 이동하고 Enter를 누른 다음, 각 조인트를 전체 범위에 걸쳐 스윕하십시오. id는 프로필 파일 이름이 됩니다.

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader
  4. 4
    아무것도 기록하기 전에 텔레오퍼레이션

    위의 모든 것에 대한 인수 테스트입니다. 텔레오퍼레이션이 불안정하거나, 미러링되거나, 한 조인트가 따라오지 않으면, 50개의 에피소드에 해당 내용이 기록됩니다.

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader \
        --display_data=true
캘리브레이션이 저장되는 위치와 ID가 중요한 이유

프로필은 $HF_LEROBOT_CALIBRATION(기본값 ~/.cache/huggingface/lerobot/calibration)으로 이동하며, ID는 조회 키입니다. lerobot-record에 캘리브레이션된 ID를 제공하면 Enter를 눌러 프로필을 재사용하거나 c를 눌러 다시 수행할 수 있습니다. 알 수 없는 ID를 제공하면 파일이 없으므로 세션 중간에 캘리브레이션으로 전환됩니다.

카메라가 정책이 보는 것을 결정합니다

bash
lerobot-find-cameras opencv   # or: lerobot-find-cameras realsense

# --- Detected Cameras ---
# Camera #0:
#   Name: OpenCV Camera @ 0
#   Type: OpenCV
#   Id: 0
#   Backend api: AVFOUNDATION
#   Default stream profile:
#     Format: 16.0
#     Width: 1920
#     Height: 1080
#     Fps: 15.0
매 세션마다 이를 실행하십시오: 문서에서는 운영 체제에 따라 재부팅 또는 재연결 후 이러한 식별자가 변경될 수 있다고 경고합니다.

두 가지 시점과 그 위치가 중요합니다: 작업 공간을 커버하는 고정된 장면 카메라와 말단 장치 그리퍼가 무엇을 만지려 하는지 보여주는 손목 카메라. LeRobot 커뮤니티 데이터셋 체크리스트는 480x640 / 720p 이상, 정적 배경, 중립적이고 안정적인 조명, 그리고 리더 팔과 사람의 팔다리가 프레임 밖에 있는 두 가지 시점을 선호한다고 명시합니다. 녹화 가이드에는 다음의 경험 법칙이 추가됩니다: 카메라 이미지만 보고도 작업을 스스로 수행할 수 있어야 합니다.

카메라 인덱스는 안정적인 식별자가 아닙니다

OpenCV 인덱스는 열거 순서에서 오므로, 재부팅 또는 재연결 시 인덱스 0과 2가 서로 위치를 바꾸어 손목 뷰가 전체 세션 동안 상위 슬롯에 놓일 수 있습니다. lerobot 자체도 카메라 클래스가 정수뿐만 아니라 장치 경로도 취하며, 특히 Linux에서 재부팅 또는 포트 변경 시 인덱스가 불안정하다고 경고합니다. index_or_path를 열거 순서가 아닌 장치를 따르는 /dev/v4l/by-id/ 아래의 udev 심볼릭 링크로 지정하십시오. 이것은 데이터셋이 내부적으로 불일치하게 되는 가장 흔한 방법이며, 훈련으로는 이를 복구할 수 없습니다. 카메라 감지 안 됨.

record 명령어와 모든 플래그

bash
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')

lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_so100_follower \
    --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_so100_leader \
    --display_data=true \
    --dataset.repo_id=${HF_USER}/so100_pick_cube \
    --dataset.single_task="Pick the red cube and drop it in the box" \
    --dataset.num_episodes=50 \
    --dataset.fps=30 \
    --dataset.episode_time_s=25 \
    --dataset.reset_time_s=10 \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2
카메라 딕셔너리는 하나의 셸 인용 문자열이며, 중첩된 중괄호는 셸 구문이 아닙니다.

아래 기본값은 src/lerobot/configs/dataset.py의 main 브랜치에서 가져온 것이며, 튜토리얼에서 가져온 것이 아닙니다. 몇몇은 사람들이 예상하는 것과 다릅니다.

플래그기본값설명
--dataset.repo_id비어 있음이름; 기본적으로 타임스탬프가 추가됨
--dataset.single_task비어 있음모든 에피소드와 함께 저장되는 작업 문자열
--dataset.root$HF_LEROBOT_HOME/repo_id쓰기 경로, 기본값 ~/.cache/huggingface/lerobot/
--dataset.fps30제어 루프 속도 및 데이터셋 프레임 속도
--dataset.episode_time_s60에피소드가 자동으로 진행되기 전까지의 시간(초)
--dataset.reset_time_s60장면 재설정; 팔이 움직이며 아무것도 저장되지 않음
--dataset.num_episodes50이번 세션에서 기록된 에피소드 수
--dataset.push_to_hubtrue세션 종료 시 업로드; false는 로컬에 유지
--dataset.streaming_encoding데이터클래스에서는 false, 문서 테이블에서는 true캡처 중 인코딩; 명시적으로 설정
--dataset.encoder_queue_maxsize30카메라당 버퍼링된 프레임, 30fps에서 약 1초
--dataset.encoder_threadsnull (코덱이 결정)인코더당 스레드 수; 캡처가 끊기면 낮춤
--dataset.no_stampfalserepo_id를 입력한 대로 정확히 유지
--resumefalse기존 데이터셋에 추가; --dataset.root 필요
예상치 못한 시간 소모를 유발하는 두 가지 플래그

입력한 이름으로 데이터셋이 생성되지 않습니다. lerobot은 날짜-시간 태그를 추가하므로 so100_pick_cubeso100_pick_cube_20260823_141530이 됩니다. 안정적인 이름을 사용하려면 --dataset.no_stamp=true를 사용하세요. 재개는 추가분을 계산하며, 총합이 아닙니다. --resume=true를 사용하면 --dataset.num_episodes추가 에피소드를 계산하며 --dataset.root는 필수가 됩니다. 30개 에피소드 데이터셋에 50개를 요청하면 80개를 얻게 됩니다.

세션 중 키보드 제어

  • 오른쪽 화살표 또는 n: 에피소드를 종료하거나 단계를 조기에 재설정합니다. 깔끔한 잡기는 25초가 거의 필요 없으므로 가장 많이 사용하는 키입니다.
  • 왼쪽 화살표 또는 r: 에피소드를 버리고 다시 수행합니다. 잘못된 시도는 지금은 비용이 들지 않지만 나중에는 많은 비용이 듭니다.
  • Escape 또는 q: 세션을 중지하고 인코딩을 완료한 후 업로드합니다.
  • 이 기능은 X11, Wayland 및 헤드리스 SSH에서 작동합니다. 전역 키 백엔드가 없으면 lerobot-record는 제어 터미널에서 동일한 키를 읽습니다. 화살표 시퀀스가 분리되는 지연된 SSH 링크에서도 문자가 유지됩니다.
  • 키보드 원격 조작은 다르며 전역 백엔드가 필요합니다: X11, Windows 또는 접근성 기능이 있는 macOS.

에피소드 수와 좋은 에피소드의 모습

녹화 가이드는 첫 번째 작업에 대해 최소 50개의 에피소드, 객체 위치당 약 10개를 제안합니다. 정책 페이지에는 모델별 최소값이 나열되어 있으며, 이 값 미만에서는 GPU 시간을 들일 가치가 없습니다.

정책최소 에피소드데이터셋 형식GPU 티어실행당 비용
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 4 to 12 USD

더 나은 질문은 무엇을 얼마나 많이 할 것인가입니다. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024)은 40,000개 이상의 시연을 수집하고 15,000개 이상의 실제 롤아웃을 실행했습니다. 일반화는 환경 및 객체 수와 대략적인 멱법칙 관계를 따랐으며, 환경 또는 객체당 임계값을 넘어서면 추가 시연은 최소한의 효과를 보였습니다. 한 벤치에서: 한 번의 촬영을 반복하기보다는 객체를 이동하고, 조명을 변경하고, 큐브를 교체하십시오.

리더-팔로워 원격 조작을 데이터 소스로 활용
장점
  • 키보드나 게임패드와 달리 서보가 재현할 수 있는 연속적인 관절 궤적
  • 액션과 상태는 좌표 규칙을 공유하므로, 정책은 직접 명령할 수 있는 목표를 학습합니다.
  • 25초 에피소드와 10초 리셋은 시간당 약 100개의 에피소드입니다.
  • 작업자는 팔로워가 멈추거나 묶이는 것을 느끼므로, 데이터가 커밋되기 전에 결함이 드러납니다.
고려 사항
  • 두 번째 팔은 부품 비용을 대략 두 배로 늘립니다.
  • 시연은 작업자의 습관을 물려받습니다. Mandlekar et al.은 정책 품질이 시연 품질에 크게 좌우된다는 것을 발견했습니다.
  • 리더는 루프 속도로 샘플링되므로, 일시 정지는 정책에게 기다리도록 가르치는 거의 동일한 행이 됩니다.
  • 세션 간 일관성을 강제하는 것은 없습니다. 5cm 움직인 카메라는 숨겨진 분포 변화입니다.

좋은 에피소드는 지루합니다: 반복 가능한 홈 포즈, 한 가지 작업 완료, 물체가 통에 들어간 후 종료, 체크리스트에서 권장하는 25~50자 길이의 작업 문자열. 빨간색 큐브를 집어 상자에 넣으세요는 작업 문자열입니다; task1는 체크리스트에서 명시적으로 언급하는 안티패턴입니다. 모호한 주석이 문제 목록의 맨 위에 있으며, 이는 특히 시각-언어-행동 모델, 여기서 문자열은 파일 이름이 아니라 모델 입력입니다.

데이터셋을 조용히 망치는 결함

어떤 것도 예외를 발생시키지 않습니다. 모두 학습까지 살아남아, 괜찮아 보이는 손실 곡선과 아무것도 하지 않는 로봇으로 나타납니다. 장면이 설정되는 동안 확인하세요.

결함어떤 모습인가원인잡는 방법
바뀐 카메라 뷰상단 키 아래의 손목 이미지재연결 후 인덱스 재할당lerobot-find-cameras 각 세션; by-id 경로
정지된 프레임수십 개의 행에 걸쳐 동일한 이미지카메라가 전송을 멈춤; 루프가 마지막 프레임을 반복함lerobot-dataset-viz에서 확인
누락된 프레임fps 곱하기 초 미만의 행 수큐 오버플로, 블록 대신 드롭로그에 'Encoder queue full'; 행 수 대 fps 곱하기 지속 시간
한계에 도달한 조인트하나의 조인트가 최소 또는 최대에서 평평함리더 범위가 팔로워의 범위를 초과하거나, 잘못된 중간 포즈ds.meta.stats의 조인트별 최소/최대; lerobot-find-joint-limits 미리 실행
이미지와 행동 불일치정책이 예측하거나 지연됨루프와 다른 fps의 카메라모든 카메라를 --dataset.fps로 유지
데드 타임동일한 행동 행의 긴 연속녹화기가 실행 중인 상태에서 작업자가 일시 중지연속된 동일한 행동 행의 비율
사용할 수 없는 작업 문자열task1, demo2, test빠른 타이핑meta/tasks.parquet v3.0에서 (v2.1에서는 meta/tasks.jsonl이었음); lerobot-edit-dataset modify_tasks로 수정
드롭된 프레임은 스스로를 숨깁니다

인코더는 카메라당 기본적으로 30프레임의 제한된 큐를 유지합니다. 인코더가 처리 속도를 따라가지 못할 경우, 프레임은 차단되지 않고 드롭됩니다: 캡처는 계속되며 아무것도 충돌하지 않습니다. 에피소드 종료 시 Encoder queue full for {camera}, dropped N frame(s) 메시지와 카메라별 총 드롭 프레임 수를 받게 됩니다. lerobot 임계값: 약 5%의 프레임 손실은 시스템 과부하를 의미하며, 2%는 예상되는 시작 부하입니다. 해결책 순서: --display_data=false, --dataset.encoder_threads 값 낮추기, vcodec=h264, 스트리밍 끄기.

한 가지 주의할 점: 스트리밍-인코딩 가이드의 표에는 기본값이 True로 나열되어 있지만, main 브랜지의 데이터클래스는 streaming_encoding: bool = False로 되어 있습니다. 문서와 코드가 일치하지 않으므로 명시적으로 설정하십시오. lerobot은 플래그가 꺼진 상태로 시작할 때마다 이를 권장하는 힌트를 기록합니다.

GPU를 대여하기 전에 데이터셋을 확인하세요

문서에 명시된 인수 테스트: 비디오 길이를 CLI가 보고한 에피소드 길이와 비교하고, 행 수가 fps 곱하기 길이와 일치하는지 확인하십시오. 총합이 아닌 에피소드별로 확인해야 합니다.

python
from lerobot.datasets import LeRobotDataset

ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)

# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])

# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])
FPS와 지속 시간에서 크게 벗어난 에피소드는 훈련이 아닌 삭제 대상입니다.

그런 다음 살펴보세요. lerobot-dataset-viz는 Rerun 또는 Foxglove에서 카메라 뷰 옆에 조인트 트레이스와 함께 에피소드를 프레임별로 재생합니다. 카메라가 바뀌거나 프레임이 멈춘 현상은 10초 안에 나타납니다. 사람들은 이 단계를 건너뜁니다.

bash
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0

# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
    --repo-id your-user/so100_pick_cube_20260823_141530 \
    --episode-index 0 \
    --display-mode foxglove

# Drop the episodes that did not survive review
lerobot-edit-dataset \
    --repo_id your-user/so100_pick_cube_20260823_141530 \
    --new_repo_id your-user/so100_pick_cube_clean \
    --operation.type delete_episodes \
    --operation.episode_indices "[3, 17, 41]"
lerobot-edit-dataset은 분할, 병합, 기능 제거, 작업 수정 및 통계 재계산도 수행합니다. 아낌없이 삭제하세요: 나쁜 에피소드 하나는 에피소드 하나를 잃는 것이지만, 그것을 유지하면 그 에피소드로 훈련된 모든 실행에 비용이 발생합니다.
에피소드 수와 형식으로 공개 LeRobot 데이터셋을 나열하는 AY-Robots 데이터셋 디렉토리
비교 가능한 데이터셋의 크기와 주석 방식.

v2.1 또는 v3.0: 기록하기 전에 결정하세요

v2.1은 에피소드당 하나의 parquet 파일과 하나의 MP4 파일을 작성했습니다. v3.0은 여러 에피소드를 공유 샤드에 연결하고 메타데이터에서 경계를 재구축하므로, info.json은 에피소드 번호 대신 다음과 같은 경로 템플릿을 포함합니다: data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet 대신 에피소드 번호를 사용합니다. 상위 정당화는 더 적고 더 큰 파일입니다: 더 빠른 초기화와 대규모 파일 시스템 압력 감소.

LeRobot v2.1LeRobot v3.0
레이아웃에피소드당 하나의 parquet 및 하나의 MP4샤드당 여러 에피소드
에피소드 메타데이터JSONL 파일meta/episodes/ 아래의 청크된 parquet, 데이터셋 스택을 통해
허브에서 스트리밍아니요예, StreamingLeRobotDataset을 통해
lerobot 0.6.1에 의해 작성됨아니요예, 오늘 얻는 것
GR00T N1.7 및 N1.5에 의해 읽힘아니요, 하위 버전으로 변환해야 합니다
오늘 기록, 내일 GR00T 훈련

lerobot 0.6.1은 v3.0을 작성하지만, GR00T N1.7 및 N1.5는 v2.0 또는 v2.1을 읽고 충돌합니다. 진행 방향에 유의하십시오: src/lerobot/scripts/에는 convert_dataset_v21_to_v30.py가 있지만, 반대 방향으로 가는 것은 없습니다. 세션 전에 이 문제를 해결하십시오. 해결책: v3으로 거부된 데이터셋.

bash
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube

# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube \
    --root=/path/to/dataset/directory \
    --push-to-hub=false
50개 에피소드에 대한 빠른 작업입니다. 스케일링은 다른 작업입니다: lerobot의 포팅 가이드(원시 DROID를 v3.0으로 변환)는 7일 이상의 로컬 처리 시간과 약 400GB의 예산을 필요로 합니다.

동일한 데이터셋에 도달하는 두 가지 경로

위의 모든 것을 직접 기기에서 수행합니다: USB 열거, ffmpeg 빌드, 인코더 튜닝 및 캘리브레이션 파일을 직접 관리합니다. 파이프라인을 이해하거나, 특이한 카메라 장비를 실행하거나, 데이터를 로컬에 보관하는 데 적합한 경로입니다.

이 경로의 비용

시간: 팔 하나당 조립에 저녁 한나절, 까다로운 첫 캘리브레이션, 그리고 카메라가 잘못된 슬롯에 있어서 버리게 되는 첫 세션.

파이프라인을 직접 연결하지 않고 LeRobot 데이터셋 기록하기

AY-Robots 데스크톱 클라이언트는 원격 조작 세션에서 에피소드, 카메라 스트림 및 조인트 상태를 LeRobot 형식으로 기록한 다음, 데이터셋을 트레이너에게 전달합니다.

데스크톱 클라이언트 받기

데이터셋에서 정책으로

50개의 깨끗한 에피소드가 모든 실행에 공급됩니다. 는 약 20ms의 액션 스텝당 약 80M 매개변수로, 사용자의 작업에 대해서만 처음부터 훈련하며, 빠른 움직임에 편안한 다섯 가지 중 유일한 것입니다. 는 24GB 카드에서 약 450M 매개변수를 가집니다. 는 약 3B 매개변수의 파운데이션 모델이며, 여기서 은 약 40M 매개변수를 사용하고, A100 또는 H100이 필요하며, v2.1 데이터셋을 요구합니다.

다음은 조합에 대한 가이드입니다: , 또는 ; 첫 실행의 경우, 가 더 짧습니다. 정책이 벤치에서는 작동하지만 테이블을 움직이는 순간 실패한다면, 그것은 데이터 문제입니다: 및 에서 다양성에 대해 더 깊이 다룹니다.

첫 작동 정책을 위해 실제로 몇 개의 에피소드가 필요합니까?

SmolVLA는 30개, ACT, Pi0.5, GR00T N1.5 및 N1.7은 50개로, AY-Robots 트레이너가 강제하는 최소값입니다. LeRobot 가이드는 첫 작업에 최소 50개, 객체 위치당 약 10개를 독립적으로 권장합니다. 데이터 스케일링 연구에 따르면 일반화는 시연 횟수보다는 환경 및 객체에 따라 확장되므로, 한 장면에서 100번의 시연은 다섯 가지 배치에서 50번의 시연보다 좋지 않습니다.

리더 암이 필요합니까, 아니면 키보드로 원격 조작할 수 있습니까?

lerobot은 키보드 및 게임패드 원격 조작기를 제공하므로 리더 암이 엄격하게 요구되지는 않지만, 강력히 선호됩니다. 리더-팔로워는 기록된 액션의 좌표 규칙에 따라 연속적인 조인트 궤적을 제공하는 반면, 키보드 입력은 정책이 저크로 학습하는 계단식 움직임을 생성합니다. 키보드 원격 조작은 또한 전역 키 백엔드가 필요하므로 Wayland 및 헤드리스 환경에서는 작동하지 않습니다.

라즈베리 파이나 소형 미니 PC에서 녹화할 수 있습니까?

네, 튜닝을 통해 가능합니다. 스트리밍 인코딩 가이드는 최신 4코어 머신과 Raspberry Pi 5를 포함하는 저사양 범주를 다루며, 640x480 해상도와 30 fps의 두 대의 카메라를 '일부 튜닝 필요' 열에 배치합니다. 권장 사항: `--dataset.rgb_encoder.vcodec=h264` 및 `--dataset.streaming_encoding=false`를 통해 인코더가 캡처 루프와 경쟁하는 것을 중지하십시오. 640x480 해상도의 두 대의 카메라는 초당 약 5500만 픽셀, 1920x1080 해상도의 두 대는 약 3억 7300만 픽셀로 평가합니다.

방금 녹화한 데이터셋이 실제로 건강한지 어떻게 알 수 있습니까?

세 가지 간단한 확인 방법이 있습니다. 각 에피소드의 비디오 길이를 CLI가 보고한 길이와 비교하고, 총계가 아닌 에피소드별로 행 수가 fps 곱하기 해당 길이와 일치하는지 확인하십시오. 이것이 lerobot의 인코딩 가이드가 제시하는 승인 테스트입니다. ds.meta.stats를 읽어보십시오. 여기서 최소값이 최대값과 같은 조인트는 움직이지 않았음을 의미합니다. 그런 다음 lerobot-dataset-viz에서 두세 개의 에피소드를 재생하십시오. 이것이 스왑된 뷰와 정지된 프레임이 나타나는 유일한 방법입니다. 프레임 드롭의 경우, 가이드는 약 5%의 누락을 한계로 정합니다. 약 2%는 정상적인 일시적 부하이며, 종종 시작 시 발생합니다.

훈련 작업에서 데이터셋을 v3.0으로 거부했습니다. 어떻게 해야 합니까?

GR00T N1.7 및 N1.5는 LeRobot v2.0 또는 v2.1을 읽고 v3.0에서는 충돌합니다. v3.0은 lerobot 0.6.1이 기록하는 형식입니다. 훈련 전에 형식을 결정하거나, v3.0을 기본적으로 읽는 정책(Pi0.5, SmolVLA 또는 ACT)을 사용하십시오. lerobot은 v2.1에서 v3.0으로의 변환기를 제공하며, 역방향 변환기는 없습니다.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started