Strona samouczka AY-Robots dotycząca nagrywania pierwszego zbioru danych LeRobot z ramieniem SO-100
LeRobotSO-100Nagrywanie zbioru danychTeleoperacjaUczenie przez naśladowanie

Nagraj swój pierwszy zbiór danych LeRobot z SO-100

AY-Robots ResearchAugust 23, 202616 min czytania

Nagraj użyteczny zbiór danych LeRobot z SO-100: kalibracja, teleoperacja lider-podążający, rzeczywiste flagi i wartości domyślne lerobot-record, konfiguracja kamery, liczba epizodów oraz defekty, które psują przebieg.

Podążający za SO-100 podążający, ramię wiodące o tej samej konstrukcji i dwie kamery USB mogą dopracować politykę w jedno popołudnie. To samo stanowisko może równie łatwo wyprodukować sześćdziesiąt epizodów, które wyglądają zdrowo w przeglądarce plików i zmarnować sześciogodzinne uruchomienie GPU. Różnica rzadko tkwi w modelu; to, co wydarzyło się między serwami a plikiem parquet.

Oto ścieżka ręczna, a następnie krótsza. Każde polecenie pochodzi z lerobot 0.6.1, wydanego 3 sierpnia 2026 i aktualnego na PyPI. Przeniesiono je do punktów wejścia konsoli, więc samouczki, które uruchamiają python lerobot/scripts/control_robot.py opisują plik, który już nie istnieje.

Wersja skrócona

  • lerobot 0.6.1 nagrywa w wersji v3.0; GR00T N1.7 i N1.5 wymagają v2.1. Ustal format, zanim naciśniesz nagrywanie.
  • Cztery polecenia: lerobot-find-port, lerobot-setup-motors, lerobot-calibrate, lerobot-record. Przenieś te same --robot.id i --teleop.id z kalibracji do sesji nagrywania.
  • Rzeczywiste wartości domyślne: 30 fps, 60 s na epizod, 60 s resetu, 50 epizodów, około 100 minut czasu rzeczywistego.
  • Minimalna liczba epizodów tutaj: 30 dla SmolVLA, 50 dla pozostałych.
  • Różnorodność przewyższa objętość. Zbiory danych umierają z czterech powodów: zamienione indeksy kamer, upuszczone lub zamrożone klatki, przegub zaparkowany na swoim limicie, nieczytelny ciąg zadania.

Co rejestruje sesja nagrywania

Zbiór danych LeRobot nie jest folderem filmów, lecz tabelą indeksowaną czasowo z dołączonym wideo: każde taktowanie pętli sterowania zapisuje jeden wiersz zawierający zadane działanie, stan osiągnięty przez naśladowcę, jedną klatkę z każdej kamery, znacznik czasu i indeksy. Polityka widzi tylko te kolumny. Schemat lerobot/svla_so100_pickplace, odczytany z jego meta/info.json.

Cechatyp danychKształtCo to jest
actionfloat32[6]cele stawów z ramienia lidera
observation.statefloat32[6]pozycje stawów osiągnięte przez naśladowcę
observation.images.topvideo[480, 640, 3]kamera sceniczna, MP4 (tutaj av1)
observation.images.wristvideo[480, 640, 3]kamera nadgarstkowa, ta sama częstotliwość
timestampfloat32[1]sekundy od początku epizodu
frame_index, episode_index, index, task_indexint64[1]automatycznie wypełniane dane księgowe

Stawy to main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll i main_gripper: sześć stopni swobody SO-100. Akcja i stan mają ten sam kształt, ponieważ teleoperacja lider-naśladowca rejestruje cel i pozycję osiągniętą jeden krok później. Ta luka to informacja: gdzie ramię walczyło z grawitacją lub zablokowanym obiektem. Te ciągi znaków należą do tego zbioru danych. Sesja nagrana dzisiaj z wersją 0.6.1 zapisuje shoulder_pan.pos przez gripper.pos, identyfikatory od 1 do 6 na magistrali: te same sześć stawów, różne klucze, co ma znaczenie w momencie, gdy konfiguracja odwołuje się do cechy po nazwie.

Punkt odniesienia z rzeczywistego zbioru danych

Ten zbiór danych zawiera 50 epizodów i 19 631 klatek przy 30 kl./s: około 393 klatek, czyli 13 sekund, na epizod. Jeśli Twoje średnio trwają minutę, robisz coś trudniejszego lub nagrywasz martwy czas na obu końcach.

Wpis w glosariuszu AY-Robots dla formatu zbioru danych LeRobot, pokazujący układ katalogów i plików metadanych
Co znajduje się w data/, videos/ i meta/, oraz które polityki odczytują którą wersję.

Co potrzebujesz na stanowisku

ElementSzczegółyUwaga
Ramię podążająceSO-100, sześć serw Feetech STS3215około 110 do 150 EUR w częściach
Ramię prowadzącedrugie SO-100, usunięte przekładnieprzekładnie usunięte ze wszystkich sześciu silników ramienia prowadzącego: tylko enkoder, mniejsze tarcie
Zasilaniedopasowane do wariantu STS3215 7.4 V z listy materiałówzobacz ostrzeżenie poniżej
Kamerydwie kamery USB, 640x480 przy 30 kl./sjeden widok sceny, jeden na nadgarstku
HostPython 3.12 lub nowszy, ffmpegrequires-python >= 3.12
Konto Hubtoken zapisu Hugging Faceopcjonalne z --dataset.push_to_hub=false
7.4 V, nie 12 V

STS3215 występuje w dwóch wersjach: README SO-ARM100 ocenia wersję 7.4 V na 16.5 kg.cm momentu zatrzymania mierzonego przy 6 V, a wersję 12 V na 30 kg.cm, i zauważa, że wybór silników 12 V oznacza również zakup zasilacza 12 V 5 A+ zamiast 5 V. Lista materiałów zawiera serwa 7.4 V. Podanie 12 V do serw o napięciu znamionowym 7.4 V niszczy je, więc przeczytaj etykietę silnika przed podłączeniem czegokolwiek. Serwo nie odpowiada.

Jeśli ramię nie jest jeszcze zbudowane, to jest to osobny wieczór: zacznij od Rozpoczęcie pracy z SO-100 i kompletnego przewodnika konfiguracji SO-100. Jeśli jeszcze nic nie kupiłeś, przeczytaj najpierw porównanie SO-100 z SO-101: SO-101 to nowsza wersja z ulepszonym okablowaniem i bez etapu demontażu przekładni, a proces nagrywania jest identyczny.

Zainstaluj 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 wyświetla podsumowanie systemu, w tym wersję ffmpeg, którą może znaleźć w PATH.

Dodatki najczęściej sprawiają ludziom kłopoty. pip install lerobot instaluje tylko podstawowe zależności ML, nic, co komunikuje się z robotem. Ramiona Koch potrzebują dynamixel zamiast feetech. Jeśli twoja powłoka nigdy nie słyszała o lerobot-record, to dlatego.

Porty, identyfikatory silników i kalibracja

Trzy jednorazowe kroki dzielą części od działającej pętli teleoperacji. sprawia, że polityka wytrenowana na twoim ramieniu działa na ramieniu kogoś innego, mapując surowe odczyty enkodera na wspólną konwencję stawów.

  1. 1
    Znajdź port USB każdego ramienia

    Uruchom go z podłączonymi obydwoma ramionami, odłącz to, które identyfikujesz, gdy zostaniesz o to poproszony, i zanotuj, który port znika. W systemie Linux może być konieczne użycie 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
    Zapisz identyfikatory silników i prędkości transmisji

    Identyfikatory są zapisywane dla każdego silnika pojedynczo, a dokumentacja jest rygorystyczna co do sposobu: podłącz dokładnie jeden silnik do płyty kontrolera, jeszcze nie połączony szeregowo z żadnym innym. Skrypt przechodzi łańcuch wstecz, najpierw prosząc o chwytak i nadając mu id 6, następnie wrist_roll jako 5, aż do shoulder_pan jako 1. Zrób to przed montażem.

    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
    Skalibruj oba ramiona

    Przesuń każdy staw do środka jego zakresu, naciśnij Enter, a następnie przesuń każdy przez cały jego zakres. id staje się nazwą pliku profilu.

    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
    Teleoperuj przed nagraniem czegokolwiek

    Test akceptacyjny dla wszystkiego powyżej. Jeśli teleoperacja jest szarpana, lustrzana lub jeden staw nie podąża, nagrywanie zachowuje to w 50 epizodach.

    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
Gdzie trafia kalibracja i dlaczego identyfikator ma znaczenie

Profile trafiają do $HF_LEROBOT_CALIBRATION, domyślnie ~/.cache/huggingface/lerobot/calibration, a identyfikator jest kluczem wyszukiwania. Podaj lerobot-record skalibrowany identyfikator, a zaoferuje Enter, aby ponownie użyć profilu, lub c, aby go ponownie wykonać. Podaj nieznany identyfikator, a plik nie istnieje, więc przechodzi do kalibracji w trakcie sesji.

Kamery decydują o tym, co widzi polityka

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
Uruchamiaj to w każdej sesji: dokumentacja ostrzega, że te identyfikatory mogą ulec zmianie po ponownym uruchomieniu lub ponownym podłączeniu, w zależności od systemu operacyjnego.

Dwa widoki i ich umiejscowienie ma znaczenie: stała kamera sceniczna obejmująca przestrzeń roboczą oraz kamera nadgarstkowa w pobliżu efektora końcowego pokazująca, czego chwytak ma dotknąć. Lista kontrolna LeRobot dla zestawów danych społeczności wymaga preferencyjnie dwóch widoków w rozdzielczości 480x640 / 720p lub lepszej, statycznego tła, neutralnego stabilnego oświetlenia oraz ramienia lidera i ludzkich kończyn poza kadrem. Przewodnik nagrywania dodaje zasadę kciuka: powinieneś być w stanie wykonać zadanie samodzielnie, patrząc tylko na obrazy z kamery.

Indeks kamery nie jest stabilnym identyfikatorem

Indeksy OpenCV pochodzą z kolejności wyliczania, więc ponowne uruchomienie lub ponowne podłączenie może spowodować zamianę miejscami indeksów 0 i 2 i umieszczenie widoku nadgarstka w górnym slocie na całą sesję. lerobot sam to mówi: jego klasa kamery przyjmuje zarówno ścieżkę urządzenia, jak i liczbę całkowitą, i ostrzega, że indeksy są niestabilne po ponownym uruchomieniu lub zmianie portów, zwłaszcza na Linuksie. Skieruj index_or_path na dowiązanie symboliczne udev pod /dev/v4l/by-id/, które podąża za urządzeniem, a nie za kolejnością wyliczania. Jest to najczęstszy sposób, w jaki zestaw danych staje się wewnętrznie niespójny, a szkolenie nie jest w stanie tego naprawić. Kamera nie wykryta.

Polecenie record i każda flaga

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
Słownik kamery to jeden ciąg znaków ujęty w cudzysłów powłoki; zagnieżdżone nawiasy klamrowe nie są składnią powłoki.

Poniższe wartości domyślne pochodzą z src/lerobot/configs/dataset.py w gałęzi main, a nie z samouczka. Kilka z nich nie jest tym, co ludzie zakładają.

FlagaDomyślna wartośćCo robi
--dataset.repo_idpustenazwa; domyślnie dodawany jest znacznik czasu
--dataset.single_taskpusteciąg znaków zadania przechowywany z każdym epizodem
--dataset.root$HF_LEROBOT_HOME/repo_idścieżka zapisu, domyślnie ~/.cache/huggingface/lerobot/
--dataset.fps30częstotliwość pętli sterowania i liczba klatek na sekundę zbioru danych
--dataset.episode_time_s60sekundy przed automatycznym przejściem epizodu
--dataset.reset_time_s60reset sceny; ramię się porusza, nic nie jest przechowywane
--dataset.num_episodes50epizody nagrane w tej sesji
--dataset.push_to_hubtrueprzesyłanie na koniec sesji; false pozostaje lokalne
--dataset.streaming_encodingfalse w klasie danych, true w tabeli dokumentacjikodowanie podczas przechwytywania; ustaw to jawnie
--dataset.encoder_queue_maxsize30buforowane klatki na kamerę, ~1 s przy 30 fps
--dataset.encoder_threadsnull (decyduje kodek)wątki na koder; zmniejsz, jeśli przechwytywanie się zacina
--dataset.no_stampfalsezachowaj repo_id dokładnie tak, jak zostało wpisane
--resumefalsedołącz do istniejącego zbioru danych; wymaga --dataset.root
Dwie flagi, które niespodziewanie kosztują godzinę

Twój zbiór danych nie nazywa się tak, jak wpisałeś. lerobot dodaje znacznik daty i czasu, więc so100_pick_cube staje się so100_pick_cube_20260823_141530. Użyj --dataset.no_stamp=true dla stabilnej nazwy. Wznowienie liczy dodatki, nie sumy. Z --resume=true, --dataset.num_episodes liczy dodatkowe epizody, a --dataset.root staje się obowiązkowe. Poproś o 50 w zbiorze danych z 30 epizodami, a otrzymasz 80.

Sterowanie klawiaturą podczas sesji

  • Prawa strzałka lub n: zakończ epizod lub wcześnie zresetuj fazę. To klawisz, którego używasz najczęściej, ponieważ czyste chwycenie rzadko wymaga 25 sekund.
  • Lewa strzałka lub r: odrzuć epizod i powtórz go. Złe ujęcie nic nie kosztuje teraz, a dużo później.
  • Escape lub q: zatrzymaj sesję, zakończ kodowanie, prześlij.
  • Działają one na X11, Wayland i bezgłowym SSH: bez globalnego zaplecza klawiszy, lerobot-record odczytuje te same klawisze z terminala sterującego. Litery przetrwają opóźnione połączenia SSH, gdzie sekwencje strzałek się rozdzielają.
  • Klawiaturowa teleoperacja jest inna i wymaga globalnego zaplecza: X11, Windows lub macOS z ułatwieniami dostępu.

Ile epizodów i jak wygląda dobry

Przewodnik nagrywania sugeruje co najmniej 50 epizodów dla pierwszego zadania, około 10 na lokalizację obiektu. Strony zasad wymieniają minimum dla każdego modelu, poniżej którego uruchomienie nie jest warte czasu GPU.

PolitykaMin. epizodyFormat zbioru danychPoziom GPUKoszt za uruchomienie
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

Lepsze pytanie brzmi: ile czego. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin i in., 2024) zebrali ponad 40 000 demonstracji i przeprowadzili ponad 15 000 rzeczywistych uruchomień. Generalizacja wykazywała w przybliżeniu zależność potęgową z liczbą environments and objects, a po przekroczeniu progu dla środowiska lub obiektu, dodatkowe demonstracje miały minimalny wpływ. Na jednym stanowisku: przesuń obiekt, zmień oświetlenie, zamień kostkę, zamiast powtarzać jedno ujęcie.

Teleoperacja typu lider-podążający jako źródło danych
Zalety
  • Ciągłe trajektorie stawów, które serwo może odtworzyć, w przeciwieństwie do klawiatury lub gamepada
  • Akcja i stan współdzielą konwencję współrzędnych, więc polityka uczy się celu, którym może bezpośrednio sterować
  • Epizod trwający 25 sekund plus 10 sekund resetu to około 100 epizodów na godzinę
  • Operator wyczuwa zacięcie lub blokadę podążającego, więc usterki ujawniają się, zanim dane zostaną zatwierdzone
Kompromisy
  • Drugie ramię mniej więcej podwaja koszt części
  • Demonstracje dziedziczą nawyki operatora; Mandlekar i in. stwierdzili, że jakość polityki w dużym stopniu zależy od jakości demonstracji
  • Lider jest próbkowany z częstotliwością pętli, więc pauzy stają się niemal identycznymi wierszami, które uczą politykę czekania
  • Nic nie wymusza spójności między sesjami: kamera przesunięta o 5 cm to ukryta zmiana rozkładu

Dobry epizod jest nudny: powtarzalna pozycja początkowa, jedna rzecz wykonana, zakończony, gdy obiekt znajdzie się w pojemniku, ciąg zadania w zakresie 25 do 50 znaków zalecanych przez listę kontrolną. Podnieś czerwony sześcian i upuść go do pudełka to ciąg zadania; task1 to antywzorzec, który lista kontrolna wyraźnie wymienia. Nieprecyzyjne adnotacje otwierają listę problemów i są najważniejsze dla modelów wizualno-językowo-akcyjnych, gdzie ciąg jest wejściem modelu, a nie nazwą pliku.

Wady, które po cichu niszczą zbiór danych

Żaden nie zgłasza wyjątku. Wszystkie przechodzą do treningu, objawiając się jako krzywa strat, która wygląda dobrze, i robot, który nic nie robi. Sprawdź, gdy scena jest ustawiona.

WadaJak to wyglądaSkąd się bierzeJak to wykryć
Zamienione widoki kamerobraz z nadgarstka pod górnym kluczemponowne przypisanie indeksu po ponownym podłączeniulerobot-find-cameras każda sesja; ścieżki by-id
Zatrzymane klatkiten sam obraz przez dziesiątki wierszykamera przestaje dostarczać; pętla powtarza ostatnią klatkęprzejrzyj to w lerobot-dataset-viz
Utracone klatkiliczba wierszy poniżej fps razy sekundykolejka przepełnia się, odrzuca zamiast blokować'Encoder queue full' w logu; wiersze vs fps razy czas trwania
Przegub na swoim limiciejeden przegub płasko na min lub maxzakres lidera przekracza zakres podążającego, lub zła pozycja środkowamin/max dla każdego przegubu w ds.meta.stats; lerobot-find-joint-limits wcześniej
Obraz i akcja niezsynchronizowanepolityka przewiduje lub opóźniakamery z innym fps niż pętlautrzymuj każdą kamerę na --dataset.fps
Martwy czasdługie serie identycznych wierszy akcjioperator wstrzymał nagrywanieudział kolejnych identycznych wierszy akcji
Nieużyteczny ciąg zadaniatask1, demo2, testszybkie pisaniemeta/tasks.parquet w v3.0 (było meta/tasks.jsonl w v2.1); napraw za pomocą lerobot-edit-dataset modify_tasks
Porzucone klatki ukrywają się

Koder utrzymuje ograniczoną kolejkę dla każdej kamery, domyślnie 30 klatek. Gdy nie nadąża, klatki są porzucane, a nie blokowane: przechwytywanie trwa, a nic się nie zawiesza. Otrzymujesz komunikat Encoder queue full for {camera}, dropped N frame(s) oraz sumę dla każdej kamery na koniec epizodu. Próg lerobot: około 5 procent brakujących oznacza przeciążony system, 2 procent to oczekiwane obciążenie startowe. Rozwiązania w kolejności: --display_data=false, niższe --dataset.encoder_threads, vcodec=h264, wyłączenie strumieniowania.

Jedna uwaga: tabela w przewodniku po strumieniowym kodowaniu podaje domyślną wartość jako True, podczas gdy klasa danych w głównym kodzie odczytuje streaming_encoding: bool = False. Dokumentacja i kod są niezgodne, więc ustaw to jawnie; lerobot loguje wskazówkę zalecającą to za każdym razem, gdy uruchamia się z wyłączoną flagą.

Sprawdź zbiór danych przed wynajęciem GPU

Test akceptacyjny z dokumentacji: porównaj czas trwania wideo z czasem trwania epizodu zgłoszonym przez CLI i potwierdź, że liczba wierszy jest równa fps razy czas trwania. Na epizod, nie na całość.

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"])
Epizod, którego czas trwania znacznie odbiega od wartości fps, jest kandydatem do usunięcia, a nie do treningu.

Następnie przyjrzyj się temu. lerobot-dataset-viz odtwarza epizod klatka po klatce, z widokami z kamer i śladami połączeń, w Rerun lub Foxglove. Zamienione kamery i zamrożone klatki pojawiają się w ciągu dziesięciu sekund. Ludzie pomijają ten krok.

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 wykonuje również podział, łączenie, usuwanie cech, modyfikowanie zadań i ponowne obliczanie statystyk. Usuwaj hojnie: zły epizod kosztuje jeden epizod; jego zachowanie kosztuje każde uruchomienie, które na nim trenuje.
Katalog zbiorów danych AY-Robots zawierający publiczne zbiory danych LeRobot z liczbą epizodów i formatami
Jak porównywalne zbiory danych są rozmiarowane i anotowane.

v2.1 lub v3.0: zdecyduj przed nagraniem

v2.1 zapisywał jeden plik parquet i jeden MP4 na odcinek. v3.0 łączy wiele odcinków w wspólne fragmenty (shards) i odbudowuje granice z metadanych, więc info.json zawiera szablony ścieżek, takie jak data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet zamiast numeru odcinka. Uzasadnieniem jest mniejsza liczba większych plików: szybsza inicjalizacja i mniejsze obciążenie systemu plików na dużą skalę.

LeRobot v2.1LeRobot v3.0
Układjeden plik parquet i jeden MP4 na odcinekwiele odcinków na fragment (shard)
Metadane odcinkaPliki JSONLpodzielony na fragmenty parquet w meta/episodes/, za pośrednictwem stosu zestawów danych
Strumieniowanie z Hubunietak, za pośrednictwem StreamingLeRobotDataset
Zapisane przez lerobot 0.6.1nietak, to, co otrzymujesz dzisiaj
Odczytywane przez GR00T N1.7 i N1.5taknie, musi zostać przekonwertowane w dół
Nagrywanie dzisiaj, trenowanie GR00T jutro

lerobot 0.6.1 zapisuje v3.0, ale GR00T N1.7 i N1.5 odczytują v2.0 lub v2.1 i ulegają awarii. Zwróć uwagę na kierunek zmian: src/lerobot/scripts/ zawiera convert_dataset_v21_to_v30.py i nic w drugą stronę. Ustal to przed sesją. Rozwiązanie: zestaw danych odrzucony jako 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
Szybko dla 50 epizodów. Skalowanie to inne zadanie: przewodnik portowania lerobot, dla surowego DROID do v3.0, przewiduje ponad 7 dni lokalnego przetwarzania i około 400 GB.

Dwie drogi do tego samego zbioru danych

Wszystko powyżej, na własnej maszynie: Ty odpowiadasz za wyliczanie USB, kompilację ffmpeg, strojenie kodera i pliki kalibracyjne. Właściwa droga do zrozumienia potoku, uruchomienia nietypowego zestawu kamer lub utrzymania danych lokalnie.

Co kosztuje ta droga

Czas: wieczór na ramię do złożenia, kłopotliwa pierwsza kalibracja i pierwsza sesja, którą wyrzucasz, bo kamera była w złym gnieździe.

Nagrywaj zbiory danych LeRobot bez samodzielnego okablowania potoku

Klient desktopowy AY-Robots rejestruje epizody, strumienie z kamer i stany stawów w formacie LeRobot z sesji teleoperacji, a następnie przekazuje zbiór danych do trenera.

Pobierz klienta desktopowego

Od zbioru danych do polityki

Pięćdziesiąt czystych epizodów zasila każde uruchomienie tutaj. trenuje od zera na samym Twoim zadaniu, około 80 milionów parametrów przy około 20 ms na krok akcji, jedyny z pięciu radzący sobie z szybkim ruchem. ma około 450 milionów parametrów na karcie 24 GB. to model bazowy o około 3 miliardach parametrów, gdzie dotyka około 40 milionów parametrów, wymaga A100 lub H100 i potrzebuje tego zbioru danych v2.1.

Następnie, przewodnik dla Twojej kombinacji: , lub ; dla pierwszego uruchomienia, jest krótszy. Kiedy polityka działa na stole laboratoryjnym, ale załamuje się w momencie, gdy przesuniesz stół, to jest problem z danymi: i zagłębiają się w kwestię różnorodności.

Ile epizodów naprawdę potrzebuję do pierwszej działającej polityki?

Trzydzieści dla SmolVLA, pięćdziesiąt dla ACT, Pi0.5, GR00T N1.5 i N1.7, to minima narzucane przez trenerów AY-Robots. Przewodnik LeRobot niezależnie zaleca co najmniej 50 dla pierwszego zadania, około 10 na lokalizację obiektu. Prace nad skalowaniem danych wykazały, że generalizacja skaluje się z środowiskami i obiektami, a nie z liczbą demonstracji, więc sto ujęć jednej sceny jest gorsze niż pięćdziesiąt w pięciu różnych miejscach.

Czy potrzebuję ramienia prowadzącego, czy mogę sterować za pomocą klawiatury?

lerobot dostarcza teleoperatory klawiaturowe i gamepadowe, więc ramię prowadzące nie jest ściśle wymagane, ale jest zdecydowanie preferowane: tryb lider-podążający (leader-follower) zapewnia ciągłe trajektorie stawów w konwencji współrzędnych zarejestrowanej akcji, podczas gdy wprowadzanie z klawiatury generuje ruch skokowy, który polityka uczy się jako szarpnięcie. Teleoperacja klawiaturowa wymaga również globalnego backendu klawiszy, więc nie działa na Wayland i w trybie headless.

Czy mogę nagrywać na Raspberry Pi lub małym mini PC?

Tak, z dostrojeniem. Przewodnik po kodowaniu strumieniowym zawiera sekcję dla niskich zasobów, obejmującą nowoczesne maszyny 4-rdzeniowe i Raspberry Pi 5, i umieszcza dwie kamery 640x480 przy 30 kl./s w kolumnie 'wymaga pewnego dostrojenia'. Jego rada: zatrzymaj koder konkurujący z pętlą przechwytywania, używając --dataset.rgb_encoder.vcodec=h264 i --dataset.streaming_encoding=false. Ocenia dwie kamery 640x480 na około 55 milionów pikseli na sekundę, a dwie 1920x1080 na około 373 miliony.

Skąd mam wiedzieć, że właśnie nagrany zbiór danych jest faktycznie zdrowy?

Trzy proste sprawdzenia. Porównaj czas trwania wideo każdego epizodu z czasem trwania zgłoszonym przez CLI i potwierdź, że liczba wierszy równa się liczbie klatek na sekundę pomnożonej przez ten czas trwania, na epizod, a nie łącznie; to jest test akceptacyjny podany w przewodniku kodowania lerobot. Przeczytaj ds.meta.stats, gdzie staw, którego minimum równa się maksimum, nigdy się nie poruszył. Następnie odtwórz dwa lub trzy epizody w lerobot-dataset-viz, to jedyny sposób, aby wykryć zamienione widoki i zamrożone klatki. W przypadku utraconych klatek przewodnik wyznacza granicę na około 5 procent brakujących; około 2 procent to normalne obciążenie przejściowe, często tylko podczas uruchamiania.

Moje zadanie treningowe odrzuciło zbiór danych jako v3.0. Co teraz?

GR00T N1.7 i N1.5 odczytują LeRobot v2.0 lub v2.1 i ulegają awarii na v3.0, co jest formatem nagrywanym przez lerobot 0.6.1. Albo ustal format przed treningiem, albo użyj polityki, która natywnie odczytuje v3.0: Pi0.5, SmolVLA lub ACT. lerobot dostarcza konwerter z v2.1 na v3.0 i nic w drugą stronę.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started