
Запишіть придатний для використання набір даних 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 | Форма | Що це |
|---|---|---|---|
| action | float32 | [6] | цільові положення суглобів від руки лідера |
| observation.state | float32 | [6] | положення суглобів, яких досяг послідовник |
| observation.images.top | video | [480, 640, 3] | камера сцени, MP4 (тут av1) |
| observation.images.wrist | video | [480, 640, 3] | камера зап'ястя, та сама частота |
| timestamp | float32 | [1] | секунди від початку епізоду |
| frame_index, episode_index, index, task_index | int64 | [1] | автоматично заповнювані облікові дані |
Суглоби: main_shoulder_pan, main_shoulder_lift, main_elbow_flex, main_wrist_flex, main_wrist_roll та main_gripper: шість ступенів свободи SO-100. Дія та стан мають однакову форму, оскільки телеоперація "лідер-послідовник" записує ціль та положення, досягнуте на один крок пізніше. Цей розрив є інформацією: де рука боролася з гравітацією або застряглим об'єктом. Ці рядки належать цьому набору даних. Сесія, записана сьогодні з 0.6.1, записує shoulder_pan.pos до gripper.pos, ідентифікатори від 1 до 6 на шині: ті самі шість суглобів, різні ключі, що має значення в момент, коли конфігурація звертається до функції за назвою.
Цей набір даних містить 50 епізодів та 19 631 кадр при 30 кадрах/с: близько 393 кадрів, або 13 секунд, на епізод. Якщо ваші в середньому тривають хвилину, ви робите щось складніше або записуєте мертвий час на обох кінцях.

Що вам знадобиться на стенді
| Елемент | Деталь | Примітка |
|---|---|---|
| Рука-послідовник | SO-100, шість сервоприводів Feetech STS3215 | близько 110-150 EUR за запчастини |
| Рука-лідер | другий SO-100, без редукторів | редуктори зняті з усіх шести моторів лідера: лише енкодер, менше тертя |
| Живлення | відповідає варіанту STS3215 на 7.4 В у специфікації | див. попередження нижче |
| Камери | дві USB-камери, 640x480 при 30 кадр/с | один вид сцени, один на зап'ясті |
| Хост | Python 3.12 або новіший, ffmpeg | requires-python >= 3.12 |
| Обліковий запис Hub | токен для запису Hugging Face | optional with --dataset.push_to_hub=false |
Сервопривід 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
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Додаткові компоненти найчастіше викликають труднощі. pip install lerobot встановлює лише основні залежності ML, нічого, що взаємодіє з роботом. Маніпулятори Koch потребують dynamixel замість feetech. Якщо ваша оболонка ніколи не чула про lerobot-record, то ось чому.
Порти, ідентифікатори двигунів та калібрування
Три одноразові кроки відділяють компоненти від робочого циклу телеоперації. дозволяє політиці, навченій на вашій руці, працювати на чужій, відображаючи необроблені значення енкодерів на спільну конвенцію суглобів.
- 1Знайдіть USB-порт кожної руки
Запустіть його з підключеними обома руками, відключіть ту, яку ви ідентифікуєте, коли буде запропоновано, і зверніть увагу, який порт зникає. У Linux вам може знадобитися
sudo chmod 666 /dev/ttyACM0.bashlerobot-find-port # Finding all available ports for the MotorsBus. # Ports before disconnecting: ['/dev/ttyACM0', '/dev/ttyACM1'] # Remove the USB cable from your MotorsBus and press Enter when done. # The port of this MotorsBus is '/dev/ttyACM1' # Reconnect the USB cable. - 2Запишіть ідентифікатори двигунів та швидкості передачі даних
Ідентифікатори записуються по одному двигуну, і документація суворо регламентує, як це робити: підключіть лише один двигун до плати контролера, ще не з'єднаний послідовно з іншими. Скрипт проходить ланцюг у зворотному порядку, спочатку запитуючи захват і присвоюючи йому ідентифікатор 6, потім wrist_roll як 5, аж до shoulder_pan як 1. Зробіть це до збирання.
bashlerobot-setup-motors \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 lerobot-setup-motors \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 - 3Відкалібруйте обидві руки
Перемістіть кожен суглоб у середину його діапазону, натисніть Enter, а потім проведіть кожен через весь його діапазон.
idстає ім'ям файлу профілю.bashlerobot-calibrate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower lerobot-calibrate \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader - 4Телекерування перед будь-яким записом
Приймальний тест для всього вищезазначеного. Якщо телеоперація є ривковою, дзеркальною або один суглоб не слідує, запис зберігає це у 50 епізодах.
bashlerobot-teleoperate \ --robot.type=so100_follower \ --robot.port=/dev/ttyACM0 \ --robot.id=my_so100_follower \ --teleop.type=so100_leader \ --teleop.port=/dev/ttyACM1 \ --teleop.id=my_so100_leader \ --display_data=true
Профілі зберігаються у $HF_LEROBOT_CALIBRATION, за замовчуванням ~/.cache/huggingface/lerobot/calibration, а ідентифікатор є ключем для пошуку. Надайте lerobot-record відкалібрований ідентифікатор, і він запропонує Enter для повторного використання профілю або c для його повторного виконання. Надайте невідомий ідентифікатор, і файлу не буде, тому він перейде до калібрування в середині сесії.
Камери визначають, що бачить політика
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/, яке слідує за пристроєм, а не за порядком перерахування. Це найпоширеніший спосіб, яким набір даних стає внутрішньо несумісним, і навчання не може це виправити. Камеру не виявлено.
Команда запису та кожен прапор
HF_USER=$(NO_COLOR=1 hf auth whoami | awk -F': *' 'NR==1 {print $2}')
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_so100_follower \
--robot.cameras="{ top: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" \
--teleop.type=so100_leader \
--teleop.port=/dev/ttyACM1 \
--teleop.id=my_so100_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so100_pick_cube \
--dataset.single_task="Pick the red cube and drop it in the box" \
--dataset.num_episodes=50 \
--dataset.fps=30 \
--dataset.episode_time_s=25 \
--dataset.reset_time_s=10 \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2Наведені нижче значення за замовчуванням походять з src/lerobot/configs/dataset.py у гілці main, а не з підручника. Деякі з них не відповідають припущенням людей.
| Прапор | За замовчуванням | Що він робить |
|---|---|---|
| --dataset.repo_id | empty | ім'я; мітка часу додається за замовчуванням |
| --dataset.single_task | empty | рядок завдання, що зберігається з кожним епізодом |
| --dataset.root | $HF_LEROBOT_HOME/repo_id | шлях для запису, за замовчуванням ~/.cache/huggingface/lerobot/ |
| --dataset.fps | 30 | частота циклу керування та частота кадрів набору даних |
| --dataset.episode_time_s | 60 | секунди до автоматичного переходу епізоду |
| --dataset.reset_time_s | 60 | скидання сцени; рука рухається, нічого не зберігається |
| --dataset.num_episodes | 50 | епізодів, записаних у цій сесії |
| --dataset.push_to_hub | true | завантажити в кінці сесії; false залишається локально |
| --dataset.streaming_encoding | false in the dataclass, true in the docs table | кодувати під час захоплення; встановіть це явно |
| --dataset.encoder_queue_maxsize | 30 | буферизовані кадри на камеру, ~1 с при 30 кадр/с |
| --dataset.encoder_threads | null (codec decides) | потоків на кодувальник; зменшіть, якщо захоплення заїкається |
| --dataset.no_stamp | false | зберігати repo_id точно так, як введено |
| --resume | false | додати до існуючого набору даних; потребує --dataset.root |
Ваш набір даних називається не так, як ви ввели. lerobot додає мітку дати та часу, тому so100_pick_cube стає so100_pick_cube_20260823_141530. Використовуйте --dataset.no_stamp=true для стабільної назви. Відновлення рахує додавання, а не загальну кількість. З --resume=true, --dataset.num_episodes рахує додаткові епізоди, а --dataset.root стає обов'язковим. Запитайте 50 для набору даних з 30 епізодами, і ви отримаєте 80.
Керування клавіатурою під час сесії
- Права стрілка або
n: завершити епізод або скинути фазу раніше. Клавіша, яку ви використовуєте найчастіше, оскільки чисте захоплення рідко потребує 25 секунд. - Ліва стрілка або
r: відхилити епізод і переробити його. Невдалий дубль нічого не коштує зараз і багато пізніше. - Escape або
q: зупинити сесію, завершити кодування, завантажити. - Це працює на X11, Wayland та безголовому SSH: без глобального бекенду клавіш, lerobot-record читає ті ж клавіші з керуючого терміналу. Літери витримують повільні SSH-з'єднання, де послідовності стрілок розбиваються.
- Клавіатурна телеоперація відрізняється і потребує глобального бекенду: X11, Windows або macOS з Accessibility.
Скільки епізодів і як виглядає хороший
Посібник із запису пропонує щонайменше 50 епізодів для першого завдання, близько 10 на кожне місце розташування об'єкта. сторінки політик перераховують мінімум для кожної моделі, нижче якого запуск не вартий часу GPU.
| Політика | Мін. епізодів | Формат набору даних | Рівень GPU | Вартість за запуск |
|---|---|---|---|---|
| SmolVLA | 30 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| ACT | 50 | LeRobot v3.0 | RTX 4090 or any 24 GB card | about 1 to 3 USD |
| GR00T N1.7 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| GR00T N1.5 | 50 | LeRobot v2.0 or v2.1 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
| Pi0.5 | 50 | LeRobot v3.0 | A100 80 GB or H100 80 GB | about 4 to 12 USD |
Краще питання: скільки чого. Data Scaling Laws in Imitation Learning for Robotic Manipulation (Lin et al., 2024) зібрали понад 40 000 демонстрацій та провели понад 15 000 реальних запусків. Узагальнення слідувало приблизно степеневому закону залежності від кількості середовищ та об'єктів, і після досягнення порогу для кожного середовища або об'єкта, додаткові демонстрації мали мінімальний ефект. На одному стенді: перемістіть об'єкт, змініть освітлення, поміняйте куб, замість того, щоб повторювати один дубль.
- Безперервні траєкторії суглобів, які може відтворити сервопривід, на відміну від клавіатури або геймпада
- Дія та стан мають спільну систему координат, тому політика вивчає ціль, якою вона може керувати безпосередньо
- Епізод тривалістю 25 секунд плюс 10-секундне скидання — це приблизно 100 епізодів на годину
- Оператор відчуває, як послідовник зупиняється або застрягає, тому несправності виявляються до того, як дані будуть зафіксовані
- Друга рука приблизно подвоює вартість компонентів
- Демонстрації успадковують звички оператора; Mandlekar et al. виявили, що якість політики сильно залежить від якості демонстрацій
- Лідер вибірково відбирається з частотою циклу, тому паузи стають майже ідентичними рядками, які вчать політику чекати
- Ніщо не забезпечує послідовності між сесіями: камера, зміщена на 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, помноженому на тривалість. Для кожного епізоду, а не для загальної кількості.
from lerobot.datasets import LeRobotDataset
ds = LeRobotDataset("your-user/so100_pick_cube_20260823_141530")
print("fps:", ds.fps, "frames:", ds.num_frames)
# In v3.0 the per-episode records live in meta/episodes/ as chunked parquet:
# lengths, tasks and offsets into the shared parquet and mp4 shards.
# They load through the datasets stack, so this is a datasets.Dataset --
# use .column_names and integer indexing, not pandas .columns / .head().
eps = ds.meta.episodes
print(eps.column_names)
print(eps[0])
# Global feature statistics, including per-joint min and max.
# A joint whose min equals its max never moved. A joint sitting at a
# hard limit for most of the run is the one that will stall the policy.
print(ds.meta.stats["observation.state"])Потім подивіться на нього. lerobot-dataset-viz відтворює епізод кадр за кадром з трасуванням суглобів поруч із зображеннями з камер, у Rerun або Foxglove. Замінені камери та заморожені кадри з'являються за десять секунд. Люди пропускають цей крок.
# Replay one episode with camera views and joint traces
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0
# Foxglove instead, for a seekable, scrubbable timeline
lerobot-dataset-viz \
--repo-id your-user/so100_pick_cube_20260823_141530 \
--episode-index 0 \
--display-mode foxglove
# Drop the episodes that did not survive review
lerobot-edit-dataset \
--repo_id your-user/so100_pick_cube_20260823_141530 \
--new_repo_id your-user/so100_pick_cube_clean \
--operation.type delete_episodes \
--operation.episode_indices "[3, 17, 41]"
v2.1 або v3.0: вирішіть перед записом
v2.1 записував один parquet та один MP4 на епізод. v3.0 об'єднує багато епізодів у спільні сегменти та відновлює межі з метаданих, тому info.json містить шаблони шляхів, такі як data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet замість номера епізоду. Обґрунтування полягає в меншій кількості більших файлів: швидша ініціалізація та менше навантаження на файлову систему в масштабі.
| LeRobot v2.1 | LeRobot v3.0 | |
|---|---|---|
| Макет | один parquet та один MP4 на епізод | багато епізодів на сегмент |
| Метадані епізоду | файли JSONL | розбитий на частини parquet у meta/episodes/, через стек наборів даних |
| Потокова передача з Hub | ні | так, через StreamingLeRobotDataset |
| Записано lerobot 0.6.1 | ні | так, те, що ви отримуєте сьогодні |
| Прочитано GR00T N1.7 та N1.5 | так | ні, потрібно конвертувати до нижчої версії |
lerobot 0.6.1 записує v3.0, але GR00T N1.7 та N1.5 читають v2.0 або v2.1 і виходять з ладу. Зверніть увагу на напрямок: src/lerobot/scripts/ містить convert_dataset_v21_to_v30.py і нічого в зворотному напрямку. Вирішіть це питання до сесії. Виправлення: набір даних відхилено як v3.
# Upgrade an older v2.1 dataset to v3.0
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube
# By default it pushes the converted dataset back to the hub and tags it v3.0.
# To convert a local copy and keep it off the hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 \
--repo-id=your-user/so100_pick_cube \
--root=/path/to/dataset/directory \
--push-to-hub=falseДва шляхи до одного набору даних
Усе вищезазначене, на вашій власній машині: ви відповідаєте за перелік USB-пристроїв, збірку ffmpeg, налаштування кодера та файли калібрування. Це правильний шлях, щоб зрозуміти конвеєр, запустити незвичайну камерну установку або зберігати дані локально.
Час: вечір на збірку однієї руки, складна перша калібровка та перша сесія, яку ви викидаєте, тому що камера була в неправильному слоті.
Настільний клієнт записує набори даних у форматі LeRobot, епізоди, потоки з камер та стани суглобів безпосередньо з сесії телеоперації . Цей набір даних подається у форму навчання: виберіть модель, набір даних та гіперпараметри, а бекенд орендує GPU, розмір якого відповідає VRAM моделі, запускає тренажер та записує контрольні точки до об'єктного сховища.
- 1Встановіть клієнт
На сторінці завантаження; налаштування в документації клієнта.
- 2Запис із сесії телеоперації
Керуйте рукою; клієнт записує епізоди у форматі LeRobot. Покроковий посібник: запишіть свій перший набір даних.
- 3Або використовуйте власні дані
Набір даних також може походити з ідентифікатора репозиторію Hugging Face або вашої власної машини: документація по наборах даних, публічний каталог.
- 4Навчіть і запустіть назад
Виберіть комбінацію на матриці навчання, потім запустіть політику назад на руці. Приблизно 1 до 3 USD на рівні 24 ГБ, 4 до 12 на рівні A100 або H100.
Він не збирає та не калібрує вашу руку, і не виправляє дефектний епізод, тому етап перевірки все ще застосовується. Існує також жорстке обмеження на іншому кінці: для швидких завдань висновок має знаходитися поруч із сервоприводами. Цикл керування виконується від 20 до 485 мс на крок дії, а додаткові кругові поїздки через публічний інтернет перетворюють робочу політику на нерішучу.
Записуйте набори даних 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 і нічого у зворотному напрямку.
Sources
- LeRobot: Імітаційне навчання на реальних роботах
- LeRobot: Збірка SO-100, налаштування двигуна та калібрування
- LeRobot: Камери та lerobot-find-cameras
- LeRobot: Встановлення та матриця додаткових компонентів
- LeRobotDataset v3.0: макет та міграція з v2.1
- LeRobot: Кодування потокового відео та пропущені кадри
- LeRobot: Перенесення великих наборів даних до v3.0 (DROID)
- lerobot v0.6.1 release, 3 серпня 2026
- DatasetRecordConfig: реальні значення за замовчуванням для запису
- lerobot_record.py: цикл запису та обробка відновлення
- TheRobotStudio/SO-ARM100: репозиторій збірки та специфікація матеріалів
- Hugging Face: контрольний список наборів даних спільноти LeRobot
- lerobot/svla_so100_pickplace: 50 епізодів, 19 631 кадр
- Lin et al. (2024), Закони масштабування даних в імітаційному навчанні
- Mandlekar et al. (2021), Що має значення у навчанні на основі офлайн-демонстрацій людини
Sources
- LeRobot: Imitation Learning on Real-World Robots
- LeRobot: SO-100 assembly, motor setup and calibration
- LeRobot: Cameras and lerobot-find-cameras
- LeRobot: Installation and the extras matrix
- LeRobotDataset v3.0: layout and v2.1 migration
- LeRobot: Streaming video encoding and dropped frames
- LeRobot: Porting large datasets to v3.0 (DROID)
- lerobot v0.6.1 release, 3 August 2026
- DatasetRecordConfig: the real recording defaults
- lerobot_record.py: record loop and resume handling
- TheRobotStudio/SO-ARM100: build repo and bill of materials
- Hugging Face: LeRobot Community Datasets checklist
- lerobot/svla_so100_pickplace: 50 episodes, 19,631 frames
- Lin et al. (2024), Data Scaling Laws in Imitation Learning
- Mandlekar et al. (2021), What Matters in Learning from Offline Human Demonstrations
Ready for high-quality robotics data?
AY-Robots connects your robots to skilled operators worldwide.
Get Started