
Запишите пригодный для использования набор данных 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 А+ вместо 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Запишите идентификаторы моторов и скорости передачи данных
Идентификаторы записываются для каждого мотора по очереди, и документация строго регламентирует процесс: подключите ровно один мотор к плате контроллера, еще не соединенный последовательно с другими. Скрипт проходит по цепочке в обратном порядке, сначала запрашивая захват и присваивая ему ID 6, затем запястью (wrist_roll) ID 5, и так до плеча (shoulder_pan) ID 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/, которая следует за устройством, а не за порядком перечисления. Это наиболее распространенный способ, по которому набор данных становится внутренне непоследовательным, и обучение не может это исправить. Камера не обнаружена.
Команда record и каждый флаг
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 | пусто | имя; метка времени добавляется по умолчанию |
| --dataset.single_task | пусто | строка задачи, сохраняемая с каждым эпизодом |
| --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 в датаклассе, true в таблице документации | кодировать во время захвата; установите это явно |
| --dataset.encoder_queue_maxsize | 30 | буферизованные кадры на камеру, ~1 с при 30 кадрах/с |
| --dataset.encoder_threads | null (кодек решает) | потоки на кодировщик; уменьшите, если захват прерывается |
| --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 каждую сессию; пути по ID |
| Замороженные кадры | одно и то же изображение для десятков строк | камера перестает передавать; цикл повторяет последний кадр | проверить в lerobot-dataset-viz |
| Пропущенные кадры | количество строк ниже fps, умноженного на секунды | очередь переполняется, отбрасывает, а не блокирует | 'Encoder queue full' в логе; строки против fps, умноженного на длительность |
| Шарнир на пределе | один шарнир зафиксирован на минимуме или максимуме | диапазон ведущего превышает диапазон ведомого, или плохая средняя поза | 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, в то время как класс данных в основной ветке читается как streaming_encoding: bool = False. Документация и код расходятся, поэтому устанавливайте его явно; lerobot выводит подсказку, рекомендующую это, всякий раз, когда он запускается с отключенным флагом.
Проверьте набор данных перед арендой GPU
Приемочный тест из документации: сравните продолжительность видео с продолжительностью эпизода, сообщенной CLI, и убедитесь, что количество строк равно частоте кадров, умноженной на продолжительность. По каждому эпизоду, а не по общей сумме.
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 из сессии телеуправления, затем передает набор данных тренажеру.
Получить настольный клиентОт набора данных к политике
Пятьдесят чистых эпизодов питают каждый обучение с имитацией запуск здесь. ACT обучается с нуля только на вашей задаче, около 80 млн параметров при примерно 20 мс на шаг действия, единственный из пяти, комфортно работающий с быстрым движением. SmolVLA имеет около 450 млн параметров на карте 24 ГБ. GR00T N1.7 — это базовая модель с примерно 3 млрд параметров, где дообучение затрагивает около 40 млн параметров, требует A100 или H100 и нуждается в наборе данных v2.1.
Далее, руководство для вашей комбинации: ACT на SO-100, SmolVLA на SO-100 или GR00T N1.7 на SO-100; для первого запуска обучите свою первую политику короче. Если политика работает на стенде, но рушится в тот момент, когда вы двигаете стол, это проблема с данными: политика работает только в одной конфигурации и сбор высококачественных обучающих данных VLA углубляются в вопросы разнообразия.
Сколько эпизодов мне действительно нужно для первой рабочей политики?▾
Тридцать для SmolVLA, пятьдесят для ACT, Pi0.5, GR00T N1.5 и N1.7 — это минимумы, которые устанавливают тренеры AY-Robots. Руководство LeRobot независимо рекомендует не менее 50 для первой задачи, около 10 на каждое местоположение объекта. Работа по масштабированию данных показала, что обобщение масштабируется с окружениями и объектами, а не с количеством демонстраций, поэтому сто дублей одной сцены хуже, чем пятьдесят в пяти различных размещениях.
Нужна ли мне ведущая рука, или я могу управлять с помощью клавиатуры?▾
lerobot поставляется с телеоператорами для клавиатуры и геймпада, поэтому ведущая рука не является строго обязательной, но настоятельно предпочтительна: ведущий-ведомый обеспечивает непрерывные траектории суставов в координатной системе записанного действия, в то время как ввод с клавиатуры производит ступенчатое движение, которое политика воспринимает как рывок. Телеуправление с клавиатуры также требует глобального бэкенда для клавиш, поэтому оно не работает на Wayland и в безголовом режиме.
Могу ли я записывать на Raspberry Pi или небольшом мини-ПК?▾
Да, с настройкой. Руководство по потоковому кодированию содержит раздел для систем с низкими ресурсами, охватывающий современные 4-ядерные машины и Raspberry Pi 5, и помещает две камеры с разрешением 640x480 и 30 fps в свою колонку «требует некоторой настройки». Его совет: не допускайте конкуренции кодировщика с циклом захвата с помощью --dataset.rgb_encoder.vcodec=h264 и --dataset.streaming_encoding=false. Оно оценивает две камеры 640x480 примерно в 55 миллионов пикселей в секунду, а две камеры 1920x1080 — примерно в 373 миллиона.
Как узнать, что только что записанный набор данных действительно в порядке?▾
Три простых проверки. Сравните продолжительность видео каждого эпизода с продолжительностью, сообщенной CLI, и убедитесь, что количество строк равно fps, умноженному на эту продолжительность, для каждого эпизода, а не для общего количества; это приемочный тест, который предоставляет руководство по кодированию lerobot. Прочитайте ds.meta.stats, где сустав, у которого min равно max, никогда не двигался. Затем воспроизведите два или три эпизода в 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, 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