Сторінка посібника AY-Robots для запису вашого першого набору даних LeRobot за допомогою маніпулятора SO-100
LeRobotSO-100Запис набору данихТелеопераціяНавчання наслідуванням

Запишіть свій перший набір даних LeRobot за допомогою SO-100

AY-Robots ResearchAugust 23, 202616 хв читання

Запишіть придатний для використання набір даних LeRobot за допомогою SO-100: калібрування, телеоперація за принципом «лідер-послідовник», справжні прапорці та значення за замовчуванням lerobot-record, налаштування камери, кількість епізодів та дефекти, що псують запуск.

Ведений SO-100 ведений, ведучий маніпулятор тієї ж конструкції та дві USB-камери можуть налаштувати політику за один день. Той самий стенд може так само легко створити шістдесят епізодів, які виглядають здоровими у файловому браузері, і витратити шестигодинний запуск GPU. Різниця рідко полягає в моделі; вона полягає в тому, що відбувалося між сервоприводами та файлом parquet.

Ось ручний шлях, а потім коротший. Кожна команда походить з lerobot 0.6.1, випущеного 3 серпня 2026 року та актуального на PyPI. Він перейшов на точки входу консолі, тому навчальні посібники, які запускають 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 кадрів/с, 60 с на епізод, 60 с скидання, 50 епізодів, близько 100 хвилин реального часу.
  • Мінімальна кількість епізодів тут: 30 для SmolVLA, 50 для решти.
  • Різноманітність перемагає обсяг. Набори даних гинуть від чотирьох речей: переплутані індекси камер, пропущені або завислі кадри, суглоб, що застряг на своїй межі, нечитабельний рядок завдання.

Що фіксує сесія запису

Набір даних LeRobot — це не папка з відео, а таблиця з часовим індексом та прикріпленим відео: кожен такт циклу керування записує один рядок, що містить задану дію, стан, якого досяг послідовник, один кадр з кожної камери, мітку часу та індекси. Політика бачить лише ці стовпці. Схема lerobot/svla_so100_pickplace, прочитана з її meta/info.json.

ОзнакаdtypeФормаЩо це
actionfloat32[6]цільові положення суглобів від руки лідера
observation.statefloat32[6]положення суглобів, яких досяг послідовник
observation.images.topvideo[480, 640, 3]камера сцени, MP4 (тут av1)
observation.images.wristvideo[480, 640, 3]камера зап'ястя, та сама частота
timestampfloat32[1]секунди від початку епізоду
frame_index, episode_index, index, task_indexint64[1]автоматично заповнювані облікові дані

Суглоби: main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll та main_gripper: шість ступенів свободи SO-100. Дія та стан мають однакову форму, оскільки телеоперація "лідер-послідовник" записує ціль та положення, досягнуте на один крок пізніше. Цей розрив є інформацією: де рука боролася з гравітацією або застряглим об'єктом. Ці рядки належать цьому набору даних. Сесія, записана сьогодні з 0.6.1, записує shoulder_pan.pos до gripper.pos, ідентифікатори від 1 до 6 на шині: ті самі шість суглобів, різні ключі, що має значення в момент, коли конфігурація звертається до функції за назвою.

Орієнтир з реального набору даних

Цей набір даних містить 50 епізодів та 19 631 кадр при 30 кадрах/с: близько 393 кадрів, або 13 секунд, на епізод. Якщо ваші в середньому тривають хвилину, ви робите щось складніше або записуєте мертвий час на обох кінцях.

Запис глосарію AY-Robots для формату набору даних LeRobot, що показує структуру каталогів та файли метаданих.
Що знаходиться в data/, videos/ та meta/, і які політики читають яку версію.

Що вам знадобиться на стенді

ЕлементДетальПримітка
Рука-послідовникSO-100, шість сервоприводів Feetech STS3215близько 110-150 EUR за запчастини
Рука-лідердругий SO-100, без редукторівредуктори зняті з усіх шести моторів лідера: лише енкодер, менше тертя
Живленнявідповідає варіанту STS3215 на 7.4 В у специфікаціїдив. попередження нижче
Камеридві USB-камери, 640x480 при 30 кадр/содин вид сцени, один на зап'ясті
ХостPython 3.12 або новіший, ffmpegrequires-python >= 3.12
Обліковий запис Hubтокен для запису Hugging Faceoptional with --dataset.push_to_hub=false
7.4 В, не 12 В

Сервопривід STS3215 поставляється у двох версіях: у README SO-ARM100 версія на 7.4 В оцінюється в 16.5 kg.cm моменту зупинки, виміряного при 6 В, а версія на 12 В — в 30 kg.cm, і зазначається, що використання моторів на 12 В також означає придбання джерела живлення на 12 В 5 A+ замість 5 В. У специфікації вказані сервоприводи на 7.4 В. Подача 12 В на сервоприводи, розраховані на 7.4 В, знищить їх, тому прочитайте етикетку мотора, перш ніж щось підключати. Сервопривід не реагує.

Якщо маніпулятор ще не зібраний, це окремий вечір: почніть з Початок роботи з SO-100 та повного посібника з налаштування SO-100. Якщо ви ще нічого не придбали, спочатку прочитайте порівняння SO-100 та SO-101 спочатку: SO-101 — це новіша ревізія з покращеною проводкою та без етапу видалення шестерень, а робочий процес запису ідентичний.

Встановіть lerobot 0.6.1

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

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

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

lerobot-info
lerobot-info виводить зведення системи, включаючи версію ffmpeg, яку він може знайти в PATH.

Додаткові компоненти найчастіше викликають труднощі. pip install lerobot встановлює лише основні залежності ML, нічого, що взаємодіє з роботом. Маніпулятори Koch потребують dynamixel замість feetech. Якщо ваша оболонка ніколи не чула про lerobot-record, то ось чому.

Порти, ідентифікатори двигунів та калібрування

Три одноразові кроки відділяють компоненти від робочого циклу телеоперації. дозволяє політиці, навченій на вашій руці, працювати на чужій, відображаючи необроблені значення енкодерів на спільну конвенцію суглобів.

  1. 1
    Знайдіть USB-порт кожної руки

    Запустіть його з підключеними обома руками, відключіть ту, яку ви ідентифікуєте, коли буде запропоновано, і зверніть увагу, який порт зникає. У Linux вам може знадобитися sudo chmod 666 /dev/ttyACM0.

    bash
    lerobot-find-port
    # Finding all available ports for the MotorsBus.
    # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1']
    # Remove the USB cable from your MotorsBus and press Enter when done.
    # The port of this MotorsBus is '/dev/ttyACM1'
    # Reconnect the USB cable.
  2. 2
    Запишіть ідентифікатори двигунів та швидкості передачі даних

    Ідентифікатори записуються по одному двигуну, і документація суворо регламентує, як це робити: підключіть лише один двигун до плати контролера, ще не з'єднаний послідовно з іншими. Скрипт проходить ланцюг у зворотному порядку, спочатку запитуючи захват і присвоюючи йому ідентифікатор 6, потім wrist_roll як 5, аж до shoulder_pan як 1. Зробіть це до збирання.

    bash
    lerobot-setup-motors \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0
    
    lerobot-setup-motors \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1
  3. 3
    Відкалібруйте обидві руки

    Перемістіть кожен суглоб у середину його діапазону, натисніть Enter, а потім проведіть кожен через весь його діапазон. id стає ім'ям файлу профілю.

    bash
    lerobot-calibrate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower
    
    lerobot-calibrate \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader
  4. 4
    Телекерування перед будь-яким записом

    Приймальний тест для всього вищезазначеного. Якщо телеоперація є ривковою, дзеркальною або один суглоб не слідує, запис зберігає це у 50 епізодах.

    bash
    lerobot-teleoperate \
        --robot.type=so100_follower \
        --robot.port=/dev/ttyACM0 \
        --robot.id=my_so100_follower \
        --teleop.type=so100_leader \
        --teleop.port=/dev/ttyACM1 \
        --teleop.id=my_so100_leader \
        --display_data=true
Куди потрапляє калібрування, і чому ідентифікатор має значення

Профілі зберігаються у $HF_LEROBOT_CALIBRATION, за замовчуванням ~/.cache/huggingface/lerobot/calibration, а ідентифікатор є ключем для пошуку. Надайте lerobot-record відкалібрований ідентифікатор, і він запропонує Enter для повторного використання профілю або c для його повторного виконання. Надайте невідомий ідентифікатор, і файлу не буде, тому він перейде до калібрування в середині сесії.

Камери визначають, що бачить політика

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

# --- Detected Cameras ---
# Camera #0:
#   Name: OpenCV Camera @ 0
#   Type: OpenCV
#   Id: 0
#   Backend api: AVFOUNDATION
#   Default stream profile:
#     Format: 16.0
#     Width: 1920
#     Height: 1080
#     Fps: 15.0
Запускайте це щоразу: документація попереджає, що ці ідентифікатори можуть змінюватися після перезавантаження або повторного підключення, залежно від операційної системи.

Два ракурси, і їхнє розташування має значення: фіксована камера сцени, що охоплює робочий простір, і зап'ястна камера біля кінцевого захвата, що показує, до чого збирається доторкнутися захват. Контрольний список наборів даних спільноти LeRobot вимагає бажано два ракурси 480x640 / 720p або краще, статичний фон, нейтральне стабільне освітлення, а також щоб рука лідера та людські кінцівки були поза кадром. Посібник із запису додає емпіричне правило: ви повинні бути в змозі виконати завдання самостійно, дивлячись лише на зображення з камери.

Індекс камери не є стабільним ідентифікатором

Індекси OpenCV походять від порядку перерахування, тому перезавантаження або повторне підключення може призвести до того, що індекси 0 і 2 поміняються місцями, і зап'ястний ракурс займе верхній слот на всю сесію. lerobot сам про це говорить: його клас камери приймає шлях до пристрою, а також ціле число, і попереджає, що індекси нестабільні при перезавантаженнях або зміні портів, особливо на Linux. Направте index_or_path на символічне посилання udev під /dev/v4l/by-id/, яке слідує за пристроєм, а не за порядком перерахування. Це найпоширеніший спосіб, яким набір даних стає внутрішньо несумісним, і навчання не може це виправити. Камеру не виявлено.

Команда запису та кожен прапор

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

lerobot-record \
    --robot.type=so100_follower \
    --robot.port=/dev/ttyACM0 \
    --robot.id=my_so100_follower \
    --robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
    --teleop.type=so100_leader \
    --teleop.port=/dev/ttyACM1 \
    --teleop.id=my_so100_leader \
    --display_data=true \
    --dataset.repo_id=${HF_USER}/so100_pick_cube \
    --dataset.single_task="Pick the red cube and drop it in the box" \
    --dataset.num_episodes=50 \
    --dataset.fps=30 \
    --dataset.episode_time_s=25 \
    --dataset.reset_time_s=10 \
    --dataset.streaming_encoding=true \
    --dataset.encoder_threads=2
Словник камери є одним рядком, взятим у лапки оболонки; вкладені фігурні дужки не є синтаксисом оболонки.

Наведені нижче значення за замовчуванням походять з src/lerobot/configs/dataset.py у гілці main, а не з підручника. Деякі з них не відповідають припущенням людей.

ПрапорЗа замовчуваннямЩо він робить
--dataset.repo_idemptyім'я; мітка часу додається за замовчуванням
--dataset.single_taskemptyрядок завдання, що зберігається з кожним епізодом
--dataset.root$HF_LEROBOT_HOME/repo_idшлях для запису, за замовчуванням ~/.cache/huggingface/lerobot/
--dataset.fps30частота циклу керування та частота кадрів набору даних
--dataset.episode_time_s60секунди до автоматичного переходу епізоду
--dataset.reset_time_s60скидання сцени; рука рухається, нічого не зберігається
--dataset.num_episodes50епізодів, записаних у цій сесії
--dataset.push_to_hubtrueзавантажити в кінці сесії; false залишається локально
--dataset.streaming_encodingfalse in the dataclass, true in the docs tableкодувати під час захоплення; встановіть це явно
--dataset.encoder_queue_maxsize30буферизовані кадри на камеру, ~1 с при 30 кадр/с
--dataset.encoder_threadsnull (codec decides)потоків на кодувальник; зменшіть, якщо захоплення заїкається
--dataset.no_stampfalseзберігати repo_id точно так, як введено
--resumefalseдодати до існуючого набору даних; потребує --dataset.root
Два прапорці, які несподівано коштували годину

Ваш набір даних називається не так, як ви ввели. lerobot додає мітку дати та часу, тому so100_pick_cube стає so100_pick_cube_20260823_141530. Використовуйте --dataset.no_stamp=true для стабільної назви. Відновлення рахує додавання, а не загальну кількість. З --resume=true, --dataset.num_episodes рахує додаткові епізоди, а --dataset.root стає обов'язковим. Запитайте 50 для набору даних з 30 епізодами, і ви отримаєте 80.

Керування клавіатурою під час сесії

  • Права стрілка або n: завершити епізод або скинути фазу раніше. Клавіша, яку ви використовуєте найчастіше, оскільки чисте захоплення рідко потребує 25 секунд.
  • Ліва стрілка або r: відхилити епізод і переробити його. Невдалий дубль нічого не коштує зараз і багато пізніше.
  • Escape або q: зупинити сесію, завершити кодування, завантажити.
  • Це працює на X11, Wayland та безголовому SSH: без глобального бекенду клавіш, lerobot-record читає ті ж клавіші з керуючого терміналу. Літери витримують повільні SSH-з'єднання, де послідовності стрілок розбиваються.
  • Клавіатурна телеоперація відрізняється і потребує глобального бекенду: X11, Windows або macOS з Accessibility.

Скільки епізодів і як виглядає хороший

Посібник із запису пропонує щонайменше 50 епізодів для першого завдання, близько 10 на кожне місце розташування об'єкта. сторінки політик перераховують мінімум для кожної моделі, нижче якого запуск не вартий часу GPU.

ПолітикаМін. епізодівФормат набору данихРівень GPUВартість за запуск
SmolVLA30LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
ACT50LeRobot v3.0RTX 4090 or any 24 GB cardabout 1 to 3 USD
GR00T N1.750LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
GR00T N1.550LeRobot v2.0 or v2.1A100 80 GB or H100 80 GBabout 4 to 12 USD
Pi0.550LeRobot v3.0A100 80 GB or H100 80 GBabout 4 to 12 USD

Краще питання: скільки чого. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) зібрали понад 40 000 демонстрацій та провели понад 15 000 реальних запусків. Узагальнення слідувало приблизно степеневому закону залежності від кількості середовищ та об'єктів, і після досягнення порогу для кожного середовища або об'єкта, додаткові демонстрації мали мінімальний ефект. На одному стенді: перемістіть об'єкт, змініть освітлення, поміняйте куб, замість того, щоб повторювати один дубль.

Телеоперація «лідер-послідовник» як джерело даних
Переваги
  • Безперервні траєкторії суглобів, які може відтворити сервопривід, на відміну від клавіатури або геймпада
  • Дія та стан мають спільну систему координат, тому політика вивчає ціль, якою вона може керувати безпосередньо
  • Епізод тривалістю 25 секунд плюс 10-секундне скидання — це приблизно 100 епізодів на годину
  • Оператор відчуває, як послідовник зупиняється або застрягає, тому несправності виявляються до того, як дані будуть зафіксовані
Компроміси
  • Друга рука приблизно подвоює вартість компонентів
  • Демонстрації успадковують звички оператора; Mandlekar et al. виявили, що якість політики сильно залежить від якості демонстрацій
  • Лідер вибірково відбирається з частотою циклу, тому паузи стають майже ідентичними рядками, які вчать політику чекати
  • Ніщо не забезпечує послідовності між сесіями: камера, зміщена на 5 см, є прихованим зсувом розподілу

Хороший епізод нудний: повторювана домашня поза, одна виконана дія, завершення після того, як об'єкт опинився у кошику, рядок завдання від 25 до 50 символів, рекомендованих контрольним списком. Візьми червоний куб і кинь його в коробку є рядком завдання; task1 є антишаблоном, який контрольний список називає явно. Нечіткі анотації очолюють список проблем, і вони найбільш важливі для , де рядок є вхідними даними моделі, а не ім'ям файлу.

Дефекти, які непомітно руйнують набір даних

Жоден не викликає винятку. Всі вони виживають під час навчання, проявляючись як крива втрат, що виглядає нормально, і робот, який нічого не робить. Перевіряйте, поки сцена налаштована.

ДефектЯк це виглядаєЗвідки походитьЯк виявити
Переплутані види камерзображення зап'ястя під верхнім ключемперепризначення індексу після повторного підключенняlerobot-find-cameras кожну сесію; шляхи за ідентифікатором
Заморожені кадриодне й те саме зображення для десятків рядківкамера припиняє передачу; цикл повторює останній кадрперевірте це в lerobot-dataset-viz
Пропущені кадрикількість рядків менша за fps помножений на секундичерга переповнюється, відкидає замість блокування'Encoder queue full' у журналі; rows проти fps помноженого на duration
Шарнір на межіодин шарнір зафіксований на мінімумі або максимумідіапазон лідера перевищує діапазон послідовника, або погана середня позаmin/max для кожного шарніра в ds.meta.stats; lerobot-find-joint-limits заздалегідь
Зображення та дія не синхронізованіполітика передбачає або відстаєкамери з іншим fps, ніж циклтримайте кожну камеру на --dataset.fps
Мертвий часдовгі послідовності ідентичних рядків дійоператор зробив паузу, коли запис тривавчастка послідовних ідентичних рядків дій
Непридатний рядок завданняtask1, demo2, testшвидкий набір текстуmeta/tasks.parquet у v3.0 (це було meta/tasks.jsonl у v2.1); виправте за допомогою 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, тоді як dataclass у main читається як streaming_encoding: bool = False. Документація та код розходяться, тому встановіть його явно; lerobot реєструє підказку, рекомендуючи це щоразу, коли він запускається з вимкненим прапорцем.

Перевірте набір даних перед орендою GPU

Приймальний тест з документації: порівняйте тривалість відео з тривалістю епізоду, яку повідомив CLI, і підтвердьте, що кількість рядків дорівнює fps, помноженому на тривалість. Для кожного епізоду, а не для загальної кількості.

python
from lerobot.datasets import LeRobotDataset

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

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

# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])
Епізод, що значно відрізняється від fps, помноженого на тривалість, є кандидатом на видалення, а не на навчання.

Потім подивіться на нього. lerobot-dataset-viz відтворює епізод кадр за кадром з трасуванням суглобів поруч із зображеннями з камер, у Rerun або Foxglove. Замінені камери та заморожені кадри з'являються за десять секунд. Люди пропускають цей крок.

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 також виконує розділення, об'єднання, видалення ознак, модифікацію завдань та перерахунок статистики. Видаляйте щедро: поганий епізод коштує одного епізоду; його збереження коштує кожного запуску, навченого на ньому.
Каталог наборів даних AY-Robots, що містить публічні набори даних LeRobot з кількістю епізодів та форматами
Як порівнянні набори даних розмічаються та анотуються.

v2.1 або v3.0: вирішіть перед записом

v2.1 записував один parquet та один MP4 на епізод. v3.0 об'єднує багато епізодів у спільні сегменти та відновлює межі з метаданих, тому info.json містить шаблони шляхів, такі як data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet замість номера епізоду. Обґрунтування полягає в меншій кількості більших файлів: швидша ініціалізація та менше навантаження на файлову систему в масштабі.

LeRobot v2.1LeRobot v3.0
Макетодин parquet та один MP4 на епізодбагато епізодів на сегмент
Метадані епізодуфайли JSONLрозбитий на частини parquet у meta/episodes/, через стек наборів даних
Потокова передача з Hubнітак, через StreamingLeRobotDataset
Записано lerobot 0.6.1нітак, те, що ви отримуєте сьогодні
Прочитано GR00T N1.7 та N1.5такні, потрібно конвертувати до нижчої версії
Запис сьогодні, навчання GR00T завтра

lerobot 0.6.1 записує v3.0, але GR00T N1.7 та N1.5 читають v2.0 або v2.1 і виходять з ладу. Зверніть увагу на напрямок: src/lerobot/scripts/ містить convert_dataset_v21_to_v30.py і нічого в зворотному напрямку. Вирішіть це питання до сесії. Виправлення: набір даних відхилено як v3.

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

# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id=your-user/so100_pick_cube \
    --root=/path/to/dataset/directory \
    --push-to-hub=false
Швидко для 50 епізодів. Масштабування — це інше завдання: посібник з портування lerobot для перетворення необроблених даних DROID у v3.0 передбачає 7+ днів локальної обробки та близько 400 ГБ.

Два шляхи до одного набору даних

Усе вищезазначене, на вашій власній машині: ви відповідаєте за перелік USB-пристроїв, збірку ffmpeg, налаштування кодера та файли калібрування. Це правильний шлях, щоб зрозуміти конвеєр, запустити незвичайну камерну установку або зберігати дані локально.

Вартість цього шляху

Час: вечір на збірку однієї руки, складна перша калібровка та перша сесія, яку ви викидаєте, тому що камера була в неправильному слоті.

Записуйте набори даних LeRobot без самостійного підключення конвеєра

Настільний клієнт AY-Robots записує епізоди, потоки з камер та стани суглобів у форматі LeRobot із сесії телеоперації, а потім передає набір даних тренеру.

Отримати настільний клієнт

Від набору даних до політики

П'ятдесят чистих епізодів живлять кожен запуск тут. навчається з нуля лише на вашому завданні, близько 80 мільйонів параметрів, приблизно 20 мс на крок дії, єдиний з п'яти, що комфортно працює зі швидким рухом. має близько 450 мільйонів параметрів на карті 24 ГБ. — це фундаментальна модель з приблизно 3 мільярдами параметрів, де зачіпає близько 40 мільйонів параметрів, потребує A100 або H100 і бажає набір даних v2.1.

Далі, посібник для вашої комбінації: , або ; для першого запуску буде коротшим. Якщо політика працює на стенді, але руйнується, щойно ви пересуваєте стіл, це проблема з даними: та глибше розглядають різноманітність.

Скільки епізодів мені дійсно потрібно для першої робочої політики?

Тридцять для SmolVLA, п'ятдесят для ACT, Pi0.5, GR00T N1.5 та N1.7 — це мінімуми, які вимагають тренери AY-Robots. Посібник LeRobot незалежно рекомендує щонайменше 50 для першого завдання, близько 10 на кожне розташування об'єкта. Робота з масштабування даних показала, що узагальнення масштабується з середовищами та об'єктами, а не з кількістю демонстрацій, тому сто знімків однієї сцени гірше, ніж п'ятдесят з п'яти різних розміщень.

Чи потрібна мені ведуча рука, чи я можу телекерувати за допомогою клавіатури?

lerobot постачає телеоператори для клавіатури та геймпада, тому ведуча рука не є строго обов'язковою, але вона настійно бажана: "ведучий-послідовник" дає безперервні траєкторії суглобів у координатному представленні записаної дії, тоді як введення з клавіатури створює ступінчастий рух, який політика сприймає як ривок. Телеоперація за допомогою клавіатури також потребує глобального бекенду клавіш, тому вона не працює на Wayland та безголових системах.

Чи можу я записувати на Raspberry Pi або невеликому міні-ПК?

Так, з налаштуванням. Посібник зі потокового кодування має розділ для малоресурсних систем, що охоплює сучасні 4-ядерні машини та Raspberry Pi 5, і розміщує дві камери 640x480 з 30 кадрами на секунду у стовпці "потребує деякого налаштування". Його порада: зупиніть конкуренцію кодера з циклом захоплення за допомогою --dataset.rgb_encoder.vcodec=h264 та --dataset.streaming_encoding=false. Він оцінює дві камери 640x480 приблизно в 55 мільйонів пікселів на секунду, а дві 1920x1080 — приблизно в 373 мільйони.

Як дізнатися, чи щойно записаний мною набір даних справді здоровий?

Три прості перевірки. Порівняйте тривалість відео кожного епізоду з тривалістю, яку повідомив CLI, і переконайтеся, що кількість рядків дорівнює частоті кадрів, помноженій на цю тривалість, для кожного епізоду, а не для загальної суми; це тест приймання, який надає посібник з кодування lerobot. Прочитайте ds.meta.stats, де суглоб, чий мінімум дорівнює його максимуму, ніколи не рухався. Потім відтворіть два або три епізоди в lerobot-dataset-viz — це єдиний спосіб виявити переплутані види та заморожені кадри. Щодо пропущених кадрів, посібник проводить межу приблизно в 5% відсутніх; близько 2% — це нормальне тимчасове навантаження, часто лише під час запуску.

Моє завдання навчання відхилило набір даних як v3.0. Що тепер?

GR00T N1.7 та N1.5 читають LeRobot v2.0 або v2.1 і виходять з ладу на v3.0, що записує lerobot 0.6.1. Або узгодьте формат перед навчанням, або використовуйте політику, яка читає v3.0 нативно: Pi0.5, SmolVLA або ACT. lerobot постачає конвертер з v2.1 на v3.0 і нічого у зворотному напрямку.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started