Ang pahina ng tutorial ng AY-Robots para sa pagre-record ng iyong unang LeRobot dataset gamit ang isang SO-100 arm
LeRobotSO-100Pagre-record ng DatasetTeleoperasyonImitation Learning

I-record ang Iyong Unang LeRobot Dataset Gamit ang SO-100

AY-Robots ResearchAugust 23, 202616 min basahin

Mag-record ng magagamit na LeRobot dataset gamit ang SO-100: kalibrasyon, leader-follower teleoperasyon, ang tunay na lerobot-record flags at defaults, setup ng camera, bilang ng episode, at ang mga depekto na sumisira sa isang pagtakbo.

Ang SO-100 follower, isang leader arm na may parehong disenyo at dalawang USB camera ay kayang i-fine-tune ang isang policy sa loob ng isang hapon. Ang parehong bench ay madaling makagawa ng animnapung episode na mukhang maayos sa isang file browser at mag-aksaya ng anim na oras na GPU run. Ang pagkakaiba ay bihirang ang modelo; ito ay kung ano ang nangyari sa pagitan ng mga servo at ng parquet file.

Narito ang manual na ruta, pagkatapos ay ang mas maikli. Ang bawat command ay mula sa lerobot 0.6.1, inilabas noong 3 Agosto 2026 at kasalukuyan sa PyPI. Lumipat ito sa console entry points, kaya ang mga tutorial na nagpapatakbo ng python lerobot/scripts/control_robot.py ay naglalarawan ng isang file na wala na.

Ang maikling bersyon

  • lerobot 0.6.1 records v3.0; GR00T N1.7 and N1.5 want v2.1. Ayusin ang format bago ka mag-record.
  • Apat na command: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Dalhin ang parehong --robot.id at --teleop.id mula sa calibration patungo sa recording session.
  • Mga totoong default: 30 fps, 60 s per episode, 60 s reset, 50 episodes, about 100 minutes of wall clock.
  • Minimum na episode dito: 30 for SmolVLA, 50 for the rest.
  • Ang pagkakaiba-iba ay mas mahalaga kaysa sa dami. Ang mga dataset ay namamatay dahil sa apat na bagay: nagkapalit na camera indices, nahulog o nagyelong frames, isang joint na nakaparada sa limit nito, isang hindi mabasa na task string.

Ano ang nakukuha ng isang recording session

Ang LeRobot dataset ay hindi isang folder ng mga video kundi isang time-indexed na talahanayan na may kalakip na video: bawat control-loop tick ay nagsusulat ng isang row na naglalaman ng iniutos na aksyon, ang estado na naabot ng follower, isang frame bawat camera, isang timestamp at mga index. Ang policy ay nakikita lamang ang mga column na iyon. Ang schema ng lerobot/svla_so100_pickplace, nabasa mula sa meta/info.json nito.

FeaturedtypeShapeAno ito
actionfloat32[6]mga target ng joint mula sa leader arm
observation.statefloat32[6]mga posisyon ng joint na naabot ng follower
observation.images.topvideo[480, 640, 3]scene camera, MP4 (av1 dito)
observation.images.wristvideo[480, 640, 3]wrist camera, parehong rate
timestampfloat32[1]segundo mula nang magsimula ang episode
frame_index, episode_index, index, task_indexint64[1]awtomatikong pinupuno na bookkeeping

Ang mga joint ay main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll at main_gripper: ang anim na degrees of freedom ng SO-100. Ang aksyon at estado ay may parehong hugis dahil leader-follower teleoperation ay nagtatala ng isang target at ang posisyon na naabot pagkatapos ng isang hakbang. Ang agwat na iyon ay impormasyon: kung saan nilabanan ng braso ang gravity o isang nakasabit na bagay. Ang mga string na iyon ay sa dataset na iyon. Ang isang session na naitala gamit ang 0.6.1 ngayon ay nagsusulat ng shoulder_pan.pos hanggang gripper.pos, mga ID 1 hanggang 6 sa bus: parehong anim na joint, iba't ibang key, na mahalaga sa sandaling ang isang config ay tumutukoy sa isang feature sa pamamagitan ng pangalan.

Isang panukat mula sa isang tunay na dataset

Ang dataset na iyon ay naglalaman ng 50 episode at 19,631 frame sa 30 fps: humigit-kumulang 393 frame, o 13 segundo, bawat episode. Kung ang iyong average ay isang minuto, gumagawa ka ng isang bagay na mas mahirap o nagtatala ng patay na oras sa magkabilang dulo.

Ang entry sa glossary ng AY-Robots para sa format ng dataset ng LeRobot, na nagpapakita ng layout ng direktoryo at mga metadata file
Ano ang nasa data/, videos/ at meta/, at aling mga patakaran ang nagbabasa ng aling bersyon.

Ano ang kailangan mo sa bench

ItemDetalyeTandaan
Follower armSO-100, anim na Feetech STS3215 servomga 110 hanggang 150 EUR sa mga piyesa
Leader armisang pangalawang SO-100, tinanggal ang mga geartinanggal ang mga gear mula sa lahat ng anim na leader motor: encoder lang, mas kaunting friction
Powerkatugma sa 7.4 V STS3215 variant sa bill of materialstingnan ang babala sa ibaba
Mga Cameradalawang USB camera, 640x480 sa 30 fpsisang scene view, isa sa pulso
HostPython 3.12 o mas bago, ffmpegrequires-python >= 3.12
Hub accountHugging Face write tokenopsyonal sa --dataset.push_to_hub=false
7.4 V, hindi 12 V

Ang STS3215 ay may dalawang bersyon: ang SO-ARM100 README ay nagre-rate ng 7.4 V na bersyon sa 16.5 kg.cm stall torque na sinusukat sa 6 V at ang 12 V na bersyon sa 30 kg.cm, at binabanggit na ang pagkuha ng 12 V na motor ay nangangahulugan din ng pagbili ng 12 V 5 A+ na supply sa halip na ang 5 V. Ang bill of materials ay naglilista ng 7.4 V na servo. Ang pagbibigay ng 12 V sa mga servo na naka-rate ng 7.4 V ay sumisira sa mga ito, kaya basahin ang label ng motor bago mo ikonekta ang anumang bagay. Hindi tumutugon ang servo.

Kung hindi pa nabubuo ang braso, iyon ay para sa ibang gabi: magsimula sa pagsisimula sa SO-100 at ang kumpletong gabay sa pag-setup ng SO-100. Kung wala ka pang nabibili, basahin muna ang paghahambing ng SO-100 laban sa SO-101 muna: ang SO-101 ay ang mas bagong rebisyon na may pinahusay na wiring at walang hakbang sa pagtanggal ng gear, at magkapareho ang daloy ng trabaho sa pagre-record.

I-install ang 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
Ipiniprint ng lerobot-info ang buod ng system, kasama ang bersyon ng ffmpeg na makikita nito sa PATH.

Ang mga extras ang kadalasang nagpapahirap sa mga tao. pip install lerobot ay nag-i-install lamang ng mga pangunahing dependency ng ML, walang anumang nakikipag-ugnayan sa isang robot. Ang mga braso ng Koch ay nangangailangan ng dynamixel sa halip na feetech. Kung ang iyong shell ay hindi pa nakarinig ng lerobot-record, ito ang dahilan.

Mga Port, Motor ID at Kalibrasyon

Tatlong beses lang na hakbang ang kailangan para maging gumagana ang teleop loop. ang nagpapagana ng patakarang sinanay sa iyong braso sa braso ng iba, na nagmamapa ng mga raw encoder count sa isang shared joint convention.

  1. 1
    Hanapin ang USB port ng bawat braso

    Patakbuhin ito na nakasaksak ang parehong braso, tanggalin ang saksak ng braso na iyong kinikilala kapag sinenyasan, at tandaan kung aling port ang nawala. Sa Linux, maaaring kailanganin mo ang 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
    Isulat ang mga Motor ID at Baudrate

    Ang mga ID ay isinusulat nang paisa-isang motor, at mahigpit ang mga dokumento tungkol sa kung paano: ikonekta ang eksaktong isang motor sa controller board, hindi pa naka-daisy-chain sa iba. Ang script ay naglalakad paatras sa chain, nagtatanong muna para sa gripper at binibigyan ito ng id 6, pagkatapos ay wrist_roll bilang 5, pababa sa shoulder_pan bilang 1. Gawin ito bago ang pag-assemble.

    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
    I-calibrate ang parehong braso

    Ilipat ang bawat joint sa gitna ng saklaw nito, pindutin ang Enter, pagkatapos ay i-sweep ang bawat isa sa buong saklaw nito. Ang id ang magiging filename ng profile.

    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
    Mag-teleoperate bago mag-record ng anuman

    Ang acceptance test para sa lahat ng nasa itaas. Kung ang teleoperation ay magalaw, mirrored, o hindi susunod ang isang joint, naitatala ito sa 50 episodes.

    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
Saan napupunta ang kalibrasyon, at bakit mahalaga ang id

Ang mga profile ay napupunta sa $HF_LEROBOT_CALIBRATION, default ~/.cache/huggingface/lerobot/calibration, at ang id ang lookup key. Bigyan ang lerobot-record ng calibrated id at mag-aalok ito ng Enter para gamitin muli ang profile o c para ulitin ito. Bigyan ito ng hindi kilalang id at walang file, kaya't magsisimula ito ng kalibrasyon sa gitna ng session.

Ang mga camera ang nagpapasya kung ano ang nakikita ng patakaran

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
Patakbuhin ito sa bawat session: nagbabala ang mga dokumento na ang mga identifier na ito ay maaaring magbago pagkatapos ng pag-reboot o muling pagkabit, depende sa operating system.

Dalawang view, at mahalaga kung saan sila nakapuwesto: isang nakapirming scene camera na sumasaklaw sa workspace, at isang wrist camera malapit sa end-effector na nagpapakita kung ano ang malapit nang hawakan ng gripper. Ang checklist ng LeRobot community-datasets ay humihingi ng mas mainam na dalawang view sa 480x640 / 720p o mas mahusay, isang static na background, neutral na matatag na ilaw, at ang leader arm at mga bahagi ng katawan ng tao ay wala sa frame. Idinagdag ng recording guide ang panuntunan: dapat mong magawa ang gawain sa iyong sarili sa pamamagitan lamang ng pagtingin sa mga imahe ng camera.

Ang index ng camera ay hindi isang matatag na pagkakakilanlan

Ang mga index ng OpenCV ay nagmumula sa pagkakasunud-sunod ng enumerasyon, kaya ang pag-reboot o muling pagkabit ay maaaring magpalit ng lugar ng index 0 at 2 at ilagay ang wrist view sa pinakamataas na puwesto para sa isang buong session. Sinasabi mismo ng lerobot: ang klase ng camera nito ay tumatanggap ng device path pati na rin ng integer, at nagbabala na ang mga index ay hindi matatag sa mga pag-reboot o pagbabago ng port, lalo na sa Linux. Ituro ang index_or_path sa udev symlink sa ilalim ng /dev/v4l/by-id/, na sumusunod sa device sa halip na sa pagkakasunud-sunod ng enumerasyon. Ito ang pinakakaraniwang paraan kung paano nagiging hindi magkatugma sa loob ang isang dataset, at hindi ito kayang ayusin ng training. Hindi nakita ang camera.

Ang record command at bawat flag

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
Ang camera dict ay isang shell-quoted string; ang mga nested braces ay hindi shell syntax.

Ang mga default sa ibaba ay nagmula sa src/lerobot/configs/dataset.py sa main, hindi isang tutorial. Marami ang hindi inaakala ng mga tao.

FlagDefaultAno ang ginagawa nito
--dataset.repo_idemptypangalan; awtomatikong idinadagdag ang timestamp
--dataset.single_taskemptytask string na nakaimbak sa bawat episode
--dataset.root$HF_LEROBOT_HOME/repo_idwrite path, default ~/.cache/huggingface/lerobot/
--dataset.fps30control loop rate at dataset frame rate
--dataset.episode_time_s60segundo bago awtomatikong umusad ang isang episode
--dataset.reset_time_s60scene reset; gumagalaw ang braso, walang nakaimbak
--dataset.num_episodes50mga episode na naitala sa session na ito
--dataset.push_to_hubtruei-upload sa pagtatapos ng session; ang false ay nananatiling lokal
--dataset.streaming_encodingfalse in the dataclass, true in the docs tablei-encode habang kumukuha; itakda ito nang malinaw
--dataset.encoder_queue_maxsize30buffered frames bawat camera, ~1 s sa 30 fps
--dataset.encoder_threadsnull (codec decides)threads bawat encoder; babaan kung nag-stutter ang capture
--dataset.no_stampfalsepanatilihin ang repo_id nang eksakto tulad ng na-type
--resumefalseidagdag sa isang umiiral na dataset; nangangailangan ng --dataset.root
Dalawang flag na nakakagulat na nakakaubos ng isang oras

Ang iyong dataset ay hindi tinatawag sa kung ano ang iyong tinype. Nagdaragdag ang lerobot ng date-time tag, kaya ang so100_pick_cube ay nagiging so100_pick_cube_20260823_141530. Gamitin ang --dataset.no_stamp=true para sa isang stable na pangalan. Ang resume ay nagbibilang ng mga karagdagan, hindi kabuuan. Sa --resume=true, binibilang ng --dataset.num_episodes ang karagdagang episodes at nagiging mandatory ang --dataset.root. Humingi ng 50 sa isang 30-episode dataset at makakakuha ka ng 80.

Pagkontrol ng keyboard sa panahon ng isang session

  • Right arrow o n: tapusin ang episode o i-reset ang phase nang maaga. Ito ang key na pinakamadalas mong gamitin, dahil ang isang malinis na paghawak ay bihirang mangailangan ng 25 segundo.
  • Left arrow o r: itapon ang episode at ulitin ito. Ang isang masamang take ay walang gastos ngayon at malaki ang gastos sa huli.
  • Escape o q: ihinto ang session, tapusin ang encoding, i-upload.
  • Gumagana ang mga ito sa X11, Wayland at headless SSH: nang walang global key backend, binabasa ng lerobot-record ang parehong mga key mula sa controlling terminal. Ang mga letra ay nakakaligtas sa laggy na SSH links, kung saan nahahati ang mga arrow sequence.
  • Iba ang Keyboard teleoperation at nangangailangan ng global backend: X11, Windows, o macOS na may Accessibility.

Ilang episode, at ano ang hitsura ng isang magandang episode

Ang gabay sa pagre-record ay nagmumungkahi ng hindi bababa sa 50 episode para sa unang gawain, humigit-kumulang 10 bawat lokasyon ng bagay. Ang mga pahina ng patakaran ay naglilista ng minimum bawat modelo, kung saan ang isang pagpapatakbo ay hindi sulit sa oras ng GPU.

PatakaranMin. episodeFormat ng DatasetAntas ng GPUGastos bawat pagpapatakbo
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

Ang mas mahusay na tanong ay kung gaano karami ng ano. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) ay nakakolekta ng mahigit 40,000 demonstrasyon at nagpatakbo ng mahigit 15,000 real-world rollout. Ang paglalahat ay sumunod sa isang halos power-law na relasyon sa bilang ng environments and objects, at lampas sa isang threshold bawat kapaligiran o bagay, ang mga karagdagang demonstrasyon ay may kaunting epekto. Sa isang bench: ilipat ang bagay, baguhin ang ilaw, palitan ang cube, sa halip na ulitin ang isang take.

Teleoperasyon ng leader-follower bilang pinagmulan ng data
Mga Kalamangan
  • Mga tuloy-tuloy na joint trajectory na kayang kopyahin ng servo, hindi tulad ng keyboard o gamepad
  • Ang aksyon at estado ay nagbabahagi ng isang coordinate convention, kaya natututo ang patakaran ng isang target na maaari nitong direktang utusan
  • Ang isang 25 segundong episode kasama ang isang 10 segundong reset ay humigit-kumulang 100 episode sa isang oras
  • Nararamdaman ng operator ang paghinto o pagkabuhol ng follower, kaya lumalabas ang mga pagkakamali bago ma-commit ang data
Mga Kompromiso
  • Ang pangalawang braso ay halos nagdodoble sa gastos ng mga piyesa
  • Ang mga demonstrasyon ay nagmamana ng mga gawi ng operator; natuklasan nina Mandlekar et al. na ang kalidad ng patakaran ay lubos na nakasalalay sa kalidad ng demonstrasyon
  • Ang leader ay sinusuri sa bilis ng loop, kaya ang mga paghinto ay nagiging halos magkaparehong row na nagtuturo sa patakaran na maghintay
  • Walang nagpapatupad ng pagkakapare-pareho sa pagitan ng mga session: ang isang camera na naitulak ng 5 cm ay isang nakatagong pagbabago sa distribusyon

Ang isang magandang episode ay nakakainip: paulit-ulit na home pose, isang bagay lang ang ginawa, natapos kapag nasa basurahan na ang bagay, task string na nasa 25 hanggang 50 karakter na inirerekomenda ng checklist. Piliin ang pulang cube at ihulog ito sa kahon ay isang task string; task1 ay ang anti-pattern na tahasang binanggit ng checklist. Ang malabong anotasyon ang nangunguna sa listahan ng mga problema nito, at pinakamahalaga ang mga ito para sa mga modelo ng vision-language-action, kung saan ang string ay isang input ng modelo, hindi isang filename.

Mga Depekto na Tahimik na Sumisira sa Isang Dataset

Wala sa mga ito ang nagtatapon ng exception. Lahat ay nakakaligtas sa training, lumalabas bilang isang loss curve na mukhang maayos at isang robot na walang ginagawa. Suriin habang naka-set up ang eksena.

DepektoAno ang hitsura nitoSaan ito nagmumulaPaano ito mahuhuli
Nagkapalit na view ng cameralarawan ng pulso sa ilalim ng top keymuling pagtatalaga ng index pagkatapos ng muling pagsaksaklerobot-find-cameras each session; by-id paths
Mga nakapirming frameang parehong larawan sa dose-dosenang rowhumihinto ang camera sa paghahatid; inuulit ng loop ang huling framescrub it in lerobot-dataset-viz
Mga nahulog na framebilang ng row na mas mababa sa fps times secondsumaapaw ang queue, naghuhulog sa halip na mag-block'Encoder queue full' in the log; rows vs fps times duration
Joint sa limitasyon nitoisang joint na flat sa min o maxlumalampas ang saklaw ng leader sa follower, o isang masamang middle poseper-joint min/max in ds.meta.stats; lerobot-find-joint-limits beforehand
Hindi magkasabay ang larawan at aksyonang policy ay nauuna o nahuhulimga camera na may ibang fps kaysa sa loopkeep every camera at --dataset.fps
Patay na orasmahahabang sunud-sunod na magkakaparehong action rownag-pause ang operator habang tumatakbo ang recorderbahagi ng magkakasunod na magkakaparehong action row
Hindi magamit na task stringtask1, demo2, testmabilis na pagta-typemeta/tasks.parquet in v3.0 (it was meta/tasks.jsonl in v2.1); fix with lerobot-edit-dataset modify_tasks
Ang mga na-drop na frame ay nagtatago

Ang encoder ay may hawak na bounded queue bawat camera, 30 frame bilang default. Kapag hindi ito makasabay, ang mga frame ay ibinababa sa halip na harangan: nagpapatuloy ang pagkuha at walang nagka-crash. Makakakuha ka ng Encoder queue full for {camera}, dropped N frame(s) at isang kabuuang bawat camera sa pagtatapos ng episode. Ang lerobot threshold: humigit-kumulang 5 porsiyentong nawawala ay nangangahulugang isang overloaded na sistema, 2 porsiyento ang inaasahang startup load. Mga solusyon sa pagkakasunod-sunod: --display_data=false, babaan ang --dataset.encoder_threads, vcodec=h264, i-off ang streaming.

Isang babala: ang talahanayan ng gabay sa streaming-encoding ay naglilista ng default bilang True, habang ang dataclass sa main ay nagbabasa ng streaming_encoding: bool = False. Hindi magkatugma ang docs at code, kaya itakda ito nang tahasan; nagla-log ang lerobot ng pahiwatig na nagrerekomenda nito tuwing nagsisimula ito nang naka-off ang flag.

Suriin ang dataset bago umarkila ng GPU

Ang acceptance test mula sa docs: ihambing ang tagal ng video sa tagal ng episode na iniulat ng CLI, at kumpirmahin na ang bilang ng row ay katumbas ng fps times duration. Bawat episode, hindi sa kabuuan.

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"])
Ang isang episode na malayo sa fps times duration ay isang kandidato para sa pagtanggal, hindi para sa pagsasanay.

Pagkatapos tingnan ito. lerobot-dataset-viz inirereplay ang isang episode frame by frame na may joint traces sa tabi ng mga view ng camera, sa Rerun o Foxglove. Ang mga pinagpalit na camera at frozen frames ay lumalabas sa loob ng sampung segundo. Nilalaktawan ng mga tao ang hakbang na ito.

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]"
Ginagawa rin ng lerobot-edit-dataset ang split, merge, remove_feature, modify_tasks at stats recomputation. Magtanggal nang maluwag: ang isang masamang episode ay nagkakahalaga ng isang episode; ang pagpapanatili nito ay nagkakahalaga ng bawat run na sinanay dito.
Ang direktoryo ng dataset ng AY-Robots na naglilista ng mga pampublikong LeRobot dataset na may bilang ng episode at mga format
Paano sinukat at inannotate ang mga maihahambing na dataset.

v2.1 o v3.0: magpasya bago ka mag-record

Ang v2.1 ay sumulat ng isang parquet at isang MP4 bawat episode. Pinagsasama ng v3.0 ang maraming episode sa mga shared shard at muling binubuo ang mga hangganan mula sa metadata, kaya ang info.json ay nagdadala ng mga template ng path tulad ng data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet sa halip na numero ng episode. Ang pangangatwiran sa upstream ay mas kaunti, mas malalaking file: mas mabilis na pagsisimula at mas kaunting pressure sa file-system sa scale.

LeRobot v2.1LeRobot v3.0
Layoutisang parquet at isang MP4 bawat episodemaraming episode bawat shard
Metadata ng Episodemga JSONL filechunked parquet sa ilalim ng meta/episodes/, sa pamamagitan ng datasets stack
Streaming mula sa Hubhindioo, sa pamamagitan ng StreamingLeRobotDataset
Isinulat ng lerobot 0.6.1hindioo, ang makukuha mo ngayon
Binasa ng GR00T N1.7 at N1.5oohindi, kailangang i-convert pababa
Nagre-record ngayon, nagte-training ng GR00T bukas

Ang lerobot 0.6.1 ay sumusulat ng v3.0, ngunit ang GR00T N1.7 at N1.5 ay bumabasa ng v2.0 o v2.1 at nagka-crash dito. Tandaan ang direksyon ng paglalakbay: ang src/lerobot/scripts/ ay naglalaman ng convert_dataset_v21_to_v30.py at wala nang iba pang pabalik. Ayusin ito bago ang sesyon. Ayusin: dataset na tinanggihan bilang 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
Mabilis para sa 50 episode. Iba ang trabaho ng pag-scale: ang gabay sa pag-port ng lerobot, para sa raw DROID sa v3.0, ay naglalaan ng 7+ araw ng lokal na pagproseso at humigit-kumulang 400 GB.

Dalawang ruta patungo sa parehong dataset

Lahat ng nasa itaas, sa sarili mong makina: ikaw ang may-ari ng USB enumeration, ang ffmpeg build, ang encoder tuning at ang mga calibration file. Ang tamang ruta upang maunawaan ang pipeline, magpatakbo ng hindi pangkaraniwang camera rig, o panatilihing lokal ang data.

Ano ang gastos ng rutang ito

Oras: isang gabi bawat braso para buuin, isang maselan na unang calibration, at isang unang sesyon na itatapon mo dahil nasa maling slot ang camera.

Mag-record ng mga LeRobot dataset nang hindi ikaw mismo ang nagwa-wire ng pipeline

Ang AY-Robots desktop client ay nagre-record ng mga episode, camera stream at joint state sa LeRobot format mula sa isang teleoperation session, pagkatapos ay ibinibigay ang dataset sa trainer.

Kunin ang desktop client

Mula dataset patungo sa policy

Limampung malinis na episode ang nagpapakain sa bawat na tumatakbo dito. nagsasanay mula sa simula sa iyong gawain lamang, humigit-kumulang 80 M parameter sa halos 20 ms bawat hakbang ng aksyon, ang tanging isa sa lima na kumportable sa mabilis na paggalaw. ay humigit-kumulang 450 M parameter sa isang 24 GB card. ay isang humigit-kumulang 3 B parameter na foundation model kung saan humahawak ng humigit-kumulang 40 M parameter, nangangailangan ng A100 o H100, at gusto ang v2.1 dataset na iyon.

Susunod, ang gabay para sa iyong kombinasyon: , o ; para sa unang pagpapatakbo, ay mas maikli. Kapag gumagana ang policy sa bench ngunit bumagsak sa sandaling ilipat mo ang mesa, iyon ay problema sa data: at ay mas malalim sa pagkakaiba-iba.

Ilang episode ba talaga ang kailangan ko para sa isang unang gumaganang policy?

Tatlumpu para sa SmolVLA, limampu para sa ACT, Pi0.5, GR00T N1.5 at N1.7, ang minimum na ipinapatupad ng mga trainer ng AY-Robots. Ang gabay ng LeRobot ay independiyenteng nagrerekomenda ng hindi bababa sa 50 para sa isang unang gawain, humigit-kumulang 10 bawat lokasyon ng bagay. Natuklasan ng pag-aaral sa data-scaling na ang generalisasyon ay sumusukat sa mga kapaligiran at bagay sa halip na sa bilang ng demonstrasyon, kaya ang isang daang pagkuha ng isang eksena ay mas masahol kaysa sa limampu sa limang pagkakalagay.

Kailangan ko ba ng leader arm, o maaari akong mag-teleoperate gamit ang keyboard?

Ang lerobot ay nagpapadala ng mga keyboard at gamepad teleoperator, kaya hindi mahigpit na kinakailangan ang isang leader arm, ngunit mas mainam ito: ang leader-follower ay nagbibigay ng tuloy-tuloy na joint trajectories sa coordinate convention ng naitalang aksyon, habang ang input ng keyboard ay gumagawa ng stepped motion na natutunan ng isang policy bilang jerk. Ang keyboard teleoperation ay nangangailangan din ng global key backend, kaya nabibigo ito sa Wayland at headless.

Maaari ba akong mag-record sa isang Raspberry Pi o isang maliit na mini PC?

Oo, na may tuning. Ang gabay sa streaming-encoding ay may low-resource bracket na sumasaklaw sa modernong 4-core na makina at ang Raspberry Pi 5, at naglalagay ng dalawang camera sa 640x480 at 30 fps sa column nitong nangangailangan ng ilang tuning. Ang payo nito: pigilan ang encoder na makipagkumpitensya sa capture loop, sa pamamagitan ng --dataset.rgb_encoder.vcodec=h264 at --dataset.streaming_encoding=false. Tinantya nito ang dalawang camera sa 640x480 bilang humigit-kumulang 55 milyong pixel bawat segundo at dalawa sa 1920x1080 bilang humigit-kumulang 373 milyon.

Paano ko malalaman kung ang dataset na naitala ko ay talagang malusog?

Tatlong murang pagsusuri. Ihambing ang video duration ng bawat episode laban sa duration na iniulat ng CLI at kumpirmahin na ang row count ay katumbas ng fps times ang duration na iyon, bawat episode sa halip na sa kabuuan; iyan ang acceptance test na ibinibigay ng encoding guide ng lerobot. Basahin ang ds.meta.stats, kung saan ang isang joint na ang min ay katumbas ng max nito ay hindi kailanman gumalaw. Pagkatapos ay i-replay ang dalawa o tatlong episode sa lerobot-dataset-viz, ang tanging paraan upang lumabas ang mga pinagpalit na view at frozen frames. Sa mga dropped frames, ang gabay ay nagtatakda ng limitasyon sa humigit-kumulang 5 porsyentong nawawala; humigit-kumulang 2 porsyento ay normal na transient load, madalas ay startup lang.

Tinanggihan ng aking training job ang dataset bilang v3.0. Ano na ngayon?

Ang GR00T N1.7 at N1.5 ay nagbabasa ng LeRobot v2.0 o v2.1 at nagka-crash sa v3.0, na siyang nire-record ng lerobot 0.6.1. Ayusin ang format bago magsanay, o gumamit ng policy na nagbabasa ng v3.0 nang natively: Pi0.5, SmolVLA o ACT. Ang lerobot ay nagpapadala ng v2.1 to v3.0 converter at wala sa kabaligtaran.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started