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에서 읽어옵니다.
| 특징 | 데이터 타입 | 형태 | 설명 |
|---|---|---|---|
| action | float32 | [6] | 리더 암의 조인트 목표 |
| observation.state | float32 | [6] | 팔로워가 도달한 조인트 위치 |
| observation.images.top | video | [480, 640, 3] | 장면 카메라, MP4 (여기서는 av1) |
| observation.images.wrist | video | [480, 640, 3] | 손목 카메라, 동일한 속도 |
| timestamp | float32 | [1] | 에피소드 시작 이후 경과 시간(초) |
| frame_index, episode_index, index, task_index | int64 | [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분이라면, 더 어려운 작업을 수행하고 있거나 양쪽 끝에서 유휴 시간을 기록하고 있는 것입니다.

작업대에 필요한 것
| 항목 | 세부 사항 | 참고 |
|---|---|---|
| 팔로워 암 | 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 이상, ffmpeg | requires-python >= 3.12 |
| 허브 계정 | Hugging Face 쓰기 토큰 | optional with --dataset.push_to_hub=false |
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 설치
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추가 기능(Extras)이 대부분의 사람들을 혼란스럽게 합니다. pip install lerobot은 핵심 ML 종속성만 설치하며, 로봇과 통신하는 기능은 없습니다. Koch 암은 dynamixel 대신 feetech을 필요로 합니다. 쉘이 lerobot-record를 알지 못한다면, 이것이 그 이유입니다.
포트, 모터 ID 및 캘리브레이션
부품과 작동하는 텔레옵 루프 사이에는 세 가지 일회성 단계가 있습니다. 은(는) 사용자의 팔에서 훈련된 정책을 다른 사람의 팔에서 실행하여, 원시 인코더 카운트를 공유된 조인트 규칙에 매핑합니다.
- 1각 팔의 USB 포트 찾기
두 팔을 모두 연결한 상태에서 실행하고, 프롬프트가 표시되면 식별하려는 팔의 플러그를 뽑고 어떤 포트가 사라지는지 확인하십시오. Linux에서는
sudo chmod 666 /dev/ttyACM0이 필요할 수 있습니다.bashlerobot-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모터 ID 및 보드레이트 기록
ID는 한 번에 하나의 모터에 기록되며, 문서에는 엄격한 방법이 명시되어 있습니다: 컨트롤러 보드에 정확히 하나의 모터만 연결하고, 아직 다른 모터와 데이지 체인으로 연결하지 마십시오. 스크립트는 체인을 역방향으로 탐색하여 그리퍼에 먼저 ID 6을 부여하고, 이어서 wrist_roll에 5, shoulder_pan에 1을 부여합니다. 조립 전에 이 작업을 수행하십시오.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3두 팔 캘리브레이션
모든 조인트를 범위의 중간으로 이동하고 Enter를 누른 다음, 각 조인트를 전체 범위에 걸쳐 스윕하십시오.
id는 프로필 파일 이름이 됩니다.bashlerobot-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아무것도 기록하기 전에 텔레오퍼레이션
위의 모든 것에 대한 인수 테스트입니다. 텔레오퍼레이션이 불안정하거나, 미러링되거나, 한 조인트가 따라오지 않으면, 50개의 에피소드에 해당 내용이 기록됩니다.
bashlerobot-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
프로필은 $HF_LEROBOT_CALIBRATION(기본값 ~/.cache/huggingface/lerobot/calibration)으로 이동하며, ID는 조회 키입니다. lerobot-record에 캘리브레이션된 ID를 제공하면 Enter를 눌러 프로필을 재사용하거나 c를 눌러 다시 수행할 수 있습니다. 알 수 없는 ID를 제공하면 파일이 없으므로 세션 중간에 캘리브레이션으로 전환됩니다.
카메라가 정책이 보는 것을 결정합니다
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 명령어와 모든 플래그
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.fps | 30 | 제어 루프 속도 및 데이터셋 프레임 속도 |
| --dataset.episode_time_s | 60 | 에피소드가 자동으로 진행되기 전까지의 시간(초) |
| --dataset.reset_time_s | 60 | 장면 재설정; 팔이 움직이며 아무것도 저장되지 않음 |
| --dataset.num_episodes | 50 | 이번 세션에서 기록된 에피소드 수 |
| --dataset.push_to_hub | true | 세션 종료 시 업로드; false는 로컬에 유지 |
| --dataset.streaming_encoding | 데이터클래스에서는 false, 문서 테이블에서는 true | 캡처 중 인코딩; 명시적으로 설정 |
| --dataset.encoder_queue_maxsize | 30 | 카메라당 버퍼링된 프레임, 30fps에서 약 1초 |
| --dataset.encoder_threads | null (코덱이 결정) | 인코더당 스레드 수; 캡처가 끊기면 낮춤 |
| --dataset.no_stamp | false | repo_id를 입력한 대로 정확히 유지 |
| --resume | false | 기존 데이터셋에 추가; --dataset.root 필요 |
입력한 이름으로 데이터셋이 생성되지 않습니다. lerobot은 날짜-시간 태그를 추가하므로 so100_pick_cube는 so100_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 티어 | 실행당 비용 |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 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 곱하기 길이와 일치하는지 확인하십시오. 총합이 아닌 에피소드별로 확인해야 합니다.
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"])그런 다음 살펴보세요. lerobot-dataset-viz는 Rerun 또는 Foxglove에서 카메라 뷰 옆에 조인트 트레이스와 함께 에피소드를 프레임별로 재생합니다. 카메라가 바뀌거나 프레임이 멈춘 현상은 10초 안에 나타납니다. 사람들은 이 단계를 건너뜁니다.
# 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]"
v2.1 또는 v3.0: 기록하기 전에 결정하세요
v2.1은 에피소드당 하나의 parquet 파일과 하나의 MP4 파일을 작성했습니다. v3.0은 여러 에피소드를 공유 샤드에 연결하고 메타데이터에서 경계를 재구축하므로, info.json은 에피소드 번호 대신 다음과 같은 경로 템플릿을 포함합니다: data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet 대신 에피소드 번호를 사용합니다. 상위 정당화는 더 적고 더 큰 파일입니다: 더 빠른 초기화와 대규모 파일 시스템 압력 감소.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| 레이아웃 | 에피소드당 하나의 parquet 및 하나의 MP4 | 샤드당 여러 에피소드 |
| 에피소드 메타데이터 | JSONL 파일 | meta/episodes/ 아래의 청크된 parquet, 데이터셋 스택을 통해 |
| 허브에서 스트리밍 | 아니요 | 예, StreamingLeRobotDataset을 통해 |
| lerobot 0.6.1에 의해 작성됨 | 아니요 | 예, 오늘 얻는 것 |
| GR00T N1.7 및 N1.5에 의해 읽힘 | 예 | 아니요, 하위 버전으로 변환해야 합니다 |
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으로 거부된 데이터셋.
# 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동일한 데이터셋에 도달하는 두 가지 경로
위의 모든 것을 직접 기기에서 수행합니다: USB 열거, ffmpeg 빌드, 인코더 튜닝 및 캘리브레이션 파일을 직접 관리합니다. 파이프라인을 이해하거나, 특이한 카메라 장비를 실행하거나, 데이터를 로컬에 보관하는 데 적합한 경로입니다.
시간: 팔 하나당 조립에 저녁 한나절, 까다로운 첫 캘리브레이션, 그리고 카메라가 잘못된 슬롯에 있어서 버리게 되는 첫 세션.
데스크톱 클라이언트는 원격 조작 세션에서 LeRobot 형식의 데이터셋, 에피소드, 카메라 스트림 및 조인트 상태를 직접 기록합니다. 이 데이터셋은 훈련 양식에 공급됩니다: 모델, 데이터셋 및 하이퍼파라미터를 선택하면 백엔드가 모델의 VRAM 크기에 맞춰 GPU를 임대하고, 트레이너를 실행하며 체크포인트를 객체 스토리지에 기록합니다.
- 1
- 2원격 조작 세션에서 기록
팔을 구동합니다; 클라이언트는 LeRobot 형식으로 에피소드를 기록합니다. 연습: 첫 데이터셋 기록하기.
- 3
- 4훈련하고 다시 실행하기
훈련 매트릭스에서 조합을 선택한 다음, 팔에서 정책을 다시 실행합니다. 24GB 티어에서는 대략 1~3 USD, A100 또는 H100 티어에서는 4~12 USD입니다.
이것은 팔을 조립하거나 캘리브레이션하지 않으며, 결함 있는 에피소드를 수리하지도 않으므로 검사 단계는 여전히 적용됩니다. 다른 한편으로는 엄격한 제한도 있습니다: 빠른 작업을 위해서는 추론이 서보 옆에 있어야 합니다. 제어 루프는 액션 단계당 20~485ms가 소요되며, 공용 인터넷 왕복 시간이 추가되면 작동하는 정책이 주저하는 정책으로 변할 수 있습니다.
파이프라인을 직접 연결하지 않고 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으로의 변환기를 제공하며, 역방향 변환기는 없습니다.
Sources
- LeRobot: 실제 로봇에서의 모방 학습
- LeRobot: SO-100 조립, 모터 설정 및 보정
- LeRobot: 카메라 및 lerobot-find-cameras
- LeRobot: 설치 및 추가 기능 매트릭스
- LeRobotDataset v3.0: 레이아웃 및 v2.1 마이그레이션
- LeRobot: 스트리밍 비디오 인코딩 및 손실된 프레임
- LeRobot: 대규모 데이터셋을 v3.0 (DROID)으로 포팅
- lerobot v0.6.1 릴리스, 2026년 8월 3일
- DatasetRecordConfig: 실제 기록 기본값
- lerobot_record.py: 기록 루프 및 재개 처리
- TheRobotStudio/SO-ARM100: 빌드 저장소 및 자재 명세서
- Hugging Face: LeRobot 커뮤니티 데이터셋 체크리스트
- lerobot/svla_so100_pickplace: 50 에피소드, 19,631 프레임
- Lin et al. (2024), 모방 학습의 데이터 스케일링 법칙
- Mandlekar et al. (2021), 오프라인 인간 시연 학습에서 중요한 것
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started