Страница руководства 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 А+ вместо 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
<code>lerobot-info</code> выводит сводку системы, включая версию 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
    Запишите идентификаторы моторов и скорости передачи данных

    Идентификаторы записываются для каждого мотора по очереди, и документация строго регламентирует процесс: подключите ровно один мотор к плате контроллера, еще не соединенный последовательно с другими. Скрипт проходит по цепочке в обратном порядке, сначала запрашивая захват и присваивая ему ID 6, затем запястью (wrist_roll) ID 5, и так до плеча (shoulder_pan) ID 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/, которая следует за устройством, а не за порядком перечисления. Это наиболее распространенный способ, по которому набор данных становится внутренне непоследовательным, и обучение не может это исправить. Камера не обнаружена.

Команда record и каждый флаг

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_idпустоимя; метка времени добавляется по умолчанию
--dataset.single_taskпустострока задачи, сохраняемая с каждым эпизодом
--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 в датаклассе, true в таблице документациикодировать во время захвата; установите это явно
--dataset.encoder_queue_maxsize30буферизованные кадры на камеру, ~1 с при 30 кадрах/с
--dataset.encoder_threadsnull (кодек решает)потоки на кодировщик; уменьшите, если захват прерывается
--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 каждую сессию; пути по 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, и убедитесь, что количество строк равно частоте кадров, умноженной на продолжительность. По каждому эпизоду, а не по общей сумме.

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 из сессии телеуправления, затем передает набор данных тренажеру.

Получить настольный клиент

От набора данных к политике

Пятьдесят чистых эпизодов питают каждый обучение с имитацией запуск здесь. 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 и ничем обратным.

Ready for high-quality robotics data?

AY-Robots connects your robots to skilled operators worldwide.

Get Started