
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.
| Cecha | typ danych | Kształt | Co to jest |
|---|---|---|---|
| action | float32 | [6] | cele stawów z ramienia lidera |
| observation.state | float32 | [6] | pozycje stawów osiągnięte przez naśladowcę |
| observation.images.top | video | [480, 640, 3] | kamera sceniczna, MP4 (tutaj av1) |
| observation.images.wrist | video | [480, 640, 3] | kamera nadgarstkowa, ta sama częstotliwość |
| timestamp | float32 | [1] | sekundy od początku epizodu |
| frame_index, episode_index, index, task_index | int64 | [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.
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.

Co potrzebujesz na stanowisku
| Element | Szczegóły | Uwaga |
|---|---|---|
| Ramię podążające | SO-100, sześć serw Feetech STS3215 | około 110 do 150 EUR w częściach |
| Ramię prowadzące | drugie SO-100, usunięte przekładnie | przekładnie usunięte ze wszystkich sześciu silników ramienia prowadzącego: tylko enkoder, mniejsze tarcie |
| Zasilanie | dopasowane do wariantu STS3215 7.4 V z listy materiałów | zobacz ostrzeżenie poniżej |
| Kamery | dwie kamery USB, 640x480 przy 30 kl./s | jeden widok sceny, jeden na nadgarstku |
| Host | Python 3.12 lub nowszy, ffmpeg | requires-python >= 3.12 |
| Konto Hub | token zapisu Hugging Face | opcjonalne z --dataset.push_to_hub=false |
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
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-infoDodatki 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.
- 1Znajdź 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.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. - 2Zapisz 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.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Skalibruj oba ramiona
Przesuń każdy staw do środka jego zakresu, naciśnij Enter, a następnie przesuń każdy przez cały jego zakres.
idstaje się nazwą pliku profilu.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 - 4Teleoperuj 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.
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
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
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.0Dwa 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.
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
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=2Poniż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ą.
| Flaga | Domyślna wartość | Co robi |
|---|---|---|
| --dataset.repo_id | puste | nazwa; domyślnie dodawany jest znacznik czasu |
| --dataset.single_task | puste | cią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.fps | 30 | częstotliwość pętli sterowania i liczba klatek na sekundę zbioru danych |
| --dataset.episode_time_s | 60 | sekundy przed automatycznym przejściem epizodu |
| --dataset.reset_time_s | 60 | reset sceny; ramię się porusza, nic nie jest przechowywane |
| --dataset.num_episodes | 50 | epizody nagrane w tej sesji |
| --dataset.push_to_hub | true | przesyłanie na koniec sesji; false pozostaje lokalne |
| --dataset.streaming_encoding | false w klasie danych, true w tabeli dokumentacji | kodowanie podczas przechwytywania; ustaw to jawnie |
| --dataset.encoder_queue_maxsize | 30 | buforowane klatki na kamerę, ~1 s przy 30 fps |
| --dataset.encoder_threads | null (decyduje kodek) | wątki na koder; zmniejsz, jeśli przechwytywanie się zacina |
| --dataset.no_stamp | false | zachowaj repo_id dokładnie tak, jak zostało wpisane |
| --resume | false | dołącz do istniejącego zbioru danych; wymaga --dataset.root |
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.
| Polityka | Min. epizody | Format zbioru danych | Poziom GPU | Koszt za uruchomienie |
|---|---|---|---|---|
| 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 |
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.
- 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
- 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.
| Wada | Jak to wygląda | Skąd się bierze | Jak to wykryć |
|---|---|---|---|
| Zamienione widoki kamer | obraz z nadgarstka pod górnym kluczem | ponowne przypisanie indeksu po ponownym podłączeniu | lerobot-find-cameras każda sesja; ścieżki by-id |
| Zatrzymane klatki | ten sam obraz przez dziesiątki wierszy | kamera przestaje dostarczać; pętla powtarza ostatnią klatkę | przejrzyj to w lerobot-dataset-viz |
| Utracone klatki | liczba wierszy poniżej fps razy sekundy | kolejka przepełnia się, odrzuca zamiast blokować | 'Encoder queue full' w logu; wiersze vs fps razy czas trwania |
| Przegub na swoim limicie | jeden przegub płasko na min lub max | zakres lidera przekracza zakres podążającego, lub zła pozycja środkowa | min/max dla każdego przegubu w ds.meta.stats; lerobot-find-joint-limits wcześniej |
| Obraz i akcja niezsynchronizowane | polityka przewiduje lub opóźnia | kamery z innym fps niż pętla | utrzymuj każdą kamerę na --dataset.fps |
| Martwy czas | długie serie identycznych wierszy akcji | operator wstrzymał nagrywanie | udział kolejnych identycznych wierszy akcji |
| Nieużyteczny ciąg zadania | task1, demo2, test | szybkie pisanie | meta/tasks.parquet w v3.0 (było meta/tasks.jsonl w v2.1); napraw za pomocą lerobot-edit-dataset modify_tasks |
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ść.
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"])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.
# 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 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.1 | LeRobot v3.0 | |
|---|---|---|
| Układ | jeden plik parquet i jeden MP4 na odcinek | wiele odcinków na fragment (shard) |
| Metadane odcinka | Pliki JSONL | podzielony na fragmenty parquet w meta/episodes/, za pośrednictwem stosu zestawów danych |
| Strumieniowanie z Hubu | nie | tak, za pośrednictwem StreamingLeRobotDataset |
| Zapisane przez lerobot 0.6.1 | nie | tak, to, co otrzymujesz dzisiaj |
| Odczytywane przez GR00T N1.7 i N1.5 | tak | nie, musi zostać przekonwertowane w dół |
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.
# 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=falseDwie 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.
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.
Klient desktopowy rejestruje zbiory danych w formacie LeRobot, epizody, strumienie z kamer i stany stawów, prosto z sesji teleoperacji . Ten zbiór danych zasila formularz treningowy: wybierz model, zbiór danych i hiperparametry, a backend wynajmuje GPU o rozmiarze VRAM modelu, uruchamia trener i zapisuje punkty kontrolne do pamięci obiektowej.
- 1Zainstaluj klienta
Na stronie pobierania; konfiguracja w dokumentacji klienta.
- 2Nagrywaj z sesji teleoperacji
Steruj ramieniem; klient zapisuje epizody w formacie LeRobot. Przewodnik: nagraj swój pierwszy zbiór danych.
- 3Lub przynieś własne dane
Zbiór danych może również pochodzić z repozytorium Hugging Face lub Twojej własnej maszyny: dokumentacja zbiorów danych, katalog publiczny.
- 4Trenuj i uruchom ponownie
Wybierz kombinację na macierzy treningowej, a następnie uruchom politykę z powrotem na ramieniu. Około 1 do 3 USD na poziomie 24 GB, 4 do 12 na poziomie A100 lub H100.
Nie montuje ani nie kalibruje ramienia, ani nie naprawia wadliwego epizodu, więc krok inspekcji nadal obowiązuje. Istnieje również twardy limit na drugim końcu: dla szybkich zadań wnioskowanie musi znajdować się obok serwomechanizmów. Pętla sterowania działa od 20 do 485 ms na krok akcji, a dodatkowe rundy przez publiczny internet zamieniają działającą politykę w niepewną.
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 desktopowegoOd 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ę.
Sources
- LeRobot: Uczenie przez imitację na rzeczywistych robotach
- LeRobot: Montaż SO-100, konfiguracja silnika i kalibracja
- LeRobot: Kamery i lerobot-find-cameras
- LeRobot: Instalacja i macierz dodatków
- LeRobotDataset v3.0: układ i migracja z v2.1
- LeRobot: Kodowanie strumieniowe wideo i utracone klatki
- LeRobot: Przenoszenie dużych zbiorów danych do v3.0 (DROID)
- lerobot v0.6.1 wydanie, 3 sierpnia 2026
- DatasetRecordConfig: rzeczywiste domyślne ustawienia nagrywania
- lerobot_record.py: pętla nagrywania i obsługa wznowienia
- TheRobotStudio/SO-ARM100: repozytorium kompilacji i lista materiałów
- Hugging Face: Lista kontrolna zbiorów danych społeczności LeRobot
- lerobot/svla_so100_pickplace: 50 epizodów, 19 631 klatek
- Lin i in. (2024), Prawa skalowania danych w uczeniu przez imitację
- Mandlekar i in. (2021), Co ma znaczenie w uczeniu się z demonstracji offline wykonanych przez ludzi
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