Почему важен стандартный формат

Обучение роботов исторически страдало от того, что каждая лаборатория использовала разные форматы данных, что делало невозможным совместное использование наборов данных, объединение данных от разных роботов или использование предварительно обученных политик в разных системах. Формат набора данных LeRobot решает эту проблему, определяя единую схему, которая работает на всем поддерживаемом оборудовании. Набор данных, записанный на SO-100, можно использовать для обучения политики OpenArm без какого-либо преобразования — при условии, что размеры пространства действий совпадают.

Понимание формата перед записью означает, что вы не обнаружите структурных проблем в своих данных во время обучения. Это также значительно упрощает отладку: если обучение не удается, первое, на что следует обратить внимание, — это набор данных.

Структура набора данных: Паркет + MP4

Каждый набор данных LeRobot находится в каталоге со следующей структурой:

my_dataset/ ├── мета/ │ ├── info.json # dataset metadata (robot type, fps, modalities) │ ├── Tasks.jsonl # task description per episode │ └── stats.safetensors # mean/std for normalization ├── данные/ │ └── чанк-000/ │ ├── Episode_000000.parquet # joint states + actions, one row per timestep │ ├── эпизод_000001.паркет │ └── ... └── видео/ └── чанк-000/ ├── наблюдение.images.cam_high/ │ ├── эпизод_000000.mp4 # camera feed, one file per episode │ └── ... └── наблюдение.images.cam_wrist/ └── ...

Разделение между Parquet (для числовых временных рядов) и MP4 (для видео) намеренно. Parquet эффективно сжимает совместные состояния и действия и поддерживает быстрый произвольный доступ по индексу эпизода. В MP4 используются видеокодеки, предназначенные для последовательностей изображений, что позволяет получать файлы в 10–30 раз меньше, чем при хранении необработанных изображений в виде тензоров.

Ключевые поля в каждом эпизоде

Поле Форма Описание
наблюдение.состояние[Т, Д]Позиции суставов (и, возможно, скорости) на каждом временном шаге. D – количество шарниров (например, для СО-100 7: 6 шарниров + 1 захват).
действие[Т, Д]Целевые совместные позиции, которыми командуют на каждом временном этапе. Та же размерность, что и состояние наблюдения.
временная метка[Т]Время в секундах с начала эпизода, по умолчанию 50 Гц (0,02 с на шаг).
эпизод_indexскалярЦелочисленный индекс этого эпизода в наборе данных. Используется загрузчиком данных для группировки временных шагов в эпизоды.
индекс_фрейма[Т]Номер кадра в эпизоде ​​(от 0 до Т-1). Соответствует номеру кадра в соответствующем MP4.
следующий.сделано[Т]Логический флаг — истина на последнем временном шаге эпизода. Используется для обозначения границ эпизодов во время тренировки.
Task_indexскалярИндексируйте в Tasks.jsonl. Включает многозадачные наборы данных, в которых разные эпизоды соответствуют разным инструкциям.
Поля камеры: Изображения с камеры сохраняются в виде файлов MP4, а не в Паркете. Паркет содержит observation.images.cam_high как ссылку на путь (индекс кадра + индекс эпизода), а не необработанные данные пикселей. Загрузчик данных LeRobot прозрачно выполняет декодирование и синхронизацию.

Загрузите и визуализируйте существующий набор данных

Загрузите lerobot-raw/aloha_sim_insertion_scripted набор данных из HuggingFace Hub и визуализируйте 3 эпизода. Этот набор данных содержит сценарии, демонстрирующие, как двуручный робот вставляет колышек — наглядный пример того, как выглядит хорошо структурированный набор данных.

источник ~/lerobot-env/bin/activate # Visualize 3 episodes from a public dataset python -m lerobot.scripts.visualize_dataset \ --repo-id lerobot-raw/aloha_sim_insertion_scripted \ --episode-indexes 0 1 2 \ --output-dir ~/dataset-viz/ # Open the generated HTML in your browser # File path printed to terminal, e.g. ~/dataset-viz/index.html

Визуализатор генерирует HTML-страницу с воспроизведением видео каждого эпизода вместе с синхронизированными графиками совместного состояния. Искать:

  • Плавные траектории суставов — острые пики указывают на артефакты записи или удары рук
  • Постоянная длина эпизода — эпизоды, которые сильно различаются по продолжительности (например, 50 или 400 кадров), часто указывают на некоторые демонстрации, в которых запечатлены частичные или прерванные движения.
  • Изменения состояния захвата — последний размер сустава должен показывать четкие бинарные переходы (открыть → закрыть → открыть) для задач манипуляции.
# Inspect the dataset programmatically из lerobot.common.datasets.lerobot_dataset импортировать LeRobotDataset dataset = LeRobotDataset("lerobot-raw/aloha_sim_insertion_scripted") print(f"Эпизоды: {dataset.num_episodes}") print(f"Всего кадров: {len(dataset)}") print(f"FPS: {dataset.fps}") print(f"Функции: {list(dataset.features.keys())}") # Inspect a single frame кадр = набор данных[0] print(f"Форма состояния: {frame['observation.state'].shape}") print(f"Форма действия: {frame['action'].shape}")
Необязательно — эталонные наборы данных

Изучите коллекцию наборов данных SVRC

Библиотека наборов данных SVRC включает тщательно подобранные наборы данных обучения роботов в формате LeRobot. Просмотрите их, чтобы понять, как выглядят различные задачи и оборудование, прежде чем записывать свои собственные. Просмотреть наборы данных →

Часть 2 завершена, когда...

Вы успешно визуализировали 3 эпизода из lerobot-raw/aloha_sim_insertion_scripted и вывод HTML откроется в вашем браузере. Вы можете идентифицировать поля Observe.state, Action и Timestamp в файле Parquet, загруженном с помощью Python. Вы понимаете разницу между тем, что хранится в Parquet и MP4. Вы готовы записать свой собственный набор данных в Модуль 3.