Green Challenge
Старт 07.09.2026
Старт 07.09.2026
Набор данных в формате LeRobot v2.1. Предназначен для обучения VLA-политик (Vision-Language-Action) в задачах мобильной манипуляции.
| Робот | Green |
| Режим управления | Абсолютные положения суставов (joint control) |
| Камеры | 3 × RGB 448×448 (голова, левое запястье, правое запястье) |
| Задачи | |
| Формат | LeRobot v2.1 (Parquet + H.264 видео + JSON метаданные) |
dataset/
├── meta/
│ ├── info.json # Схема данных, описание размерностей, статистика, имена суставов
│ ├── tasks.jsonl # task_index → название задачи
│ ├── subtasks.jsonl # Сегменты подзадач (начало/конец кадров, навык, описание)
│ ├── episodes.jsonl # Метаданные эпизодов (индекс, длина, задача, вариация, метки, маски)
│ ├── episodes_stats.jsonl # Статистики нормализации по эпизодам (min/max/mean/std)
│ ├── source_dms.json # Ссылки на исходные датамарты и временные метки сбора
│ ├── curation_state.json # Состояние курирования/разметки (исключения, переопределения, планы разбиения)
│ ├── viewer_state.json # Состояние разметки вьюера (исключённые, отмеченные, ревью аннотаций)
│ ├── skipped_nan_zarr_episodes.json # Эпизоды, пропущенные из-за значений NaN
│ ├── unsupported_joint_order_episodes.jsonl # Эпизоды с неподдерживаемым порядком суставов
│ └── partial/ # Артефакты обработки
│ ├── manifest.json # Статус обработки (всего, завершено, ошибок)
│ ├── completed_episodes.jsonl
│ ├── failed_episodes.jsonl
│ └── episodes_stats.jsonl
├── data/
│ └── chunk-{000..NNN}/
│ └── episode_{000000..NNNNNN}.parquet # Кадры траекторий (state + action + метаданные)
└── videos/
└── chunk-{000..NNN}/
├── observation.images.cam_head/
├── observation.images.cam_left_wrist/
└── observation.images.cam_right_wrist/
└── episode_{000000..NNNNNN}.mp4 # H.264 видео, 448×448
info.jsonГлавный дескриптор датасета. Содержит:
codebase_version — версия формата LeRobot (например, "v2.1")robot_type — идентификатор модели роботаtotal_episodes, total_frames, total_tasks, total_videos, total_chunksfps — частота кадров видеоsplits — диапазоны разбиения train/val (например, {"train": "0:6"})data_path, video_path — шаблоны путей с плейсхолдерами {episode_chunk} и {episode_index}features — словарь всех колонок данных с dtype, shape, names; видео-фичи включают вложенный объект video_infojoint_names — отображение ключа фичи → список имён суставов (для state/action фич)episodes.jsonlПо одному JSON-объекту на строку, описывающему эпизод:
| Поле | Тип | Описание |
|---|---|---|
episode_index | int | Последовательный индекс (с 0) |
episode_id | int | Глобально уникальный идентификатор эпизода |
tasks | [str] | Список описаний задач |
task_index | int | Индекс в tasks.jsonl |
length | int | Количество кадров |
zarr_id | int | Идентификатор исходного zarr-файла |
zarr_start_idx, zarr_end_idx | int | Диапазон кадров в исходном zarr |
is_problem_episode | bool | Флаг проблемного эпизода |
variation | str | Идентификатор вариации |
variation_name | str | Человекочитаемое имя вариации |
labels | [str] | Метки конфигурации (например, тип запястья, позиция камеры) |
action_config | [obj] | Сегменты действий: start_frame, end_frame, action_text, skill, is_negative_episode, is_mirrored, is_reversed, uses_task_text |
initial_scene_text | [str] | Описание(я) начальной сцены |
state_valid_mask | [bool] × 51 | Какие размерности state валидны для обучения |
action_valid_mask | [bool] × 52 | Какие размерности action валидны для обучения |
episodes_stats.jsonlСтатистики нормализации по эпизодам. Каждая строка содержит episode_index и словарь stats. Для каждого ключа фичи:
min, max, mean, std — вычислены по всем кадрам эпизодаcount — количество кадров (по размерностям для векторных фич)subtasks.jsonlПо одному JSON-объекту на эпизод, содержащему episode_index и массив subtasks. Каждая подзадача содержит:
start_frame, end_frame — диапазон кадровdescriptions — список описаний на естественном языкеskill — название навыкаis_negative_episode, is_mirrored, is_reversed — флаги аугментацииuses_task_text — используется ли текстовая обусловленность задачиКаждый .parquet-файл содержит один эпизод в виде таблицы, где каждая строка — один кадр.
observation.state — 51 измерение, float32Проприоцептивное состояние всего гуманоидного робота.
| Индекс | Диапазон | Группа | Суставы |
|---|---|---|---|
| 0–11 | [0:12] | Ноги | L_hip_pitch, L_hip_roll, L_hip_yaw, L_knee, L_ankle_pitch, L_ankle_roll (×2 для правой) |
| 12 | [12] | Поворот корпуса | torso_yaw_joint |
| 13–17 | [13:18] | Левая рука | L_shoulder_pitch, L_shoulder_roll, L_shoulder_yaw, L_elbow_pitch, L_elbow_yaw |
| 18–22 | [18:23] | Правая рука | R_shoulder_pitch, R_shoulder_roll, R_shoulder_yaw, R_elbow_pitch, R_elbow_yaw |
| 23–24 | [23:25] | Шея | neck_yaw, neck_pitch |
| 25–28 | [25:29] | Запястья | L_wrist_roll, L_wrist_pitch, R_wrist_roll, R_wrist_pitch |
| 29–40 | [29:41] | Пальцы | L/R pinky, ring, middle, index, thumb_pitch, thumb_yaw (по 6 на руку) |
| 41 | [41] | Крен корпуса | torso_roll (из одометрии) |
| 42 | [42] | Тангаж корпуса | torso_pitch (из одометрии) |
| 43 | [43] | Высота таза | torso_z (метры) |
| 44 | [44] | Поворот корпуса (дубль) | torso_yaw (избыточная копия) |
| 45–50 | [45:51] | Скорости | lin_vel_x, lin_vel_y, lin_vel_z, ang_vel_x, ang_vel_y, ang_vel_z |
action — 52 измерения, float32Целевые абсолютные положения суставов. Размерности 0–50 совпадают с observation.state,
дополнительное измерение:
| Индекс | Значение |
|---|---|
| 0–50 | Совпадает с observation.state (размерности 0–50) |
| 51 | episode_progress — float [0, 1], прогресс внутри эпизода |
observation.images.{cam_head, cam_left_wrist, cam_right_wrist}H.264 видео MP4, 448×448 RGB. Частота кадров зависит от датасета (определяется в info.json → fps).
Дополнительные скалярные/индексные фичи, хранящиеся покадрово в parquet-файлах:
| Фича | Тип | Описание |
|---|---|---|
observation.robot_command_35x.position | float32 (35,) | Вектор команд робота (размерность зависит от типа робота) |
timestamp | float32 (1,) | Временная метка кадра в секундах |
frame_index | int64 (1,) | Индекс кадра внутри эпизода |
episode_index | int64 (1,) | Индекс эпизода |
episode_id | int64 (1,) | Глобально уникальный идентификатор эпизода |
index | int64 (1,) | Глобальный индекс кадра по всем эпизодам |
task_index | int64 (1,) | Индекс задачи (→ tasks.jsonl) |
task_name_id | int64 (1,) | Идентификатор имени задачи |
init_scene_text_id | int64 (1,) | Идентификатор текста начальной сцены |
skill_id | int64 (1,) | Идентификатор навыка |
action_text_id | int64 (1,) | Идентификатор текста действия |
loss_mask_index | int64 (1,) | Индекс конфигурации маски функции потерь |
rosbag_timestamp | float32 (1,) | Исходная временная метка rosbag |
Примечание: Точный набор вспомогательных фич может различаться между датасетами. Актуальная схема всегда в
info.json→features.
taskТекстовая инструкция на естественном языке для эпизода, например
«Box carry», «Box carry onehand». Загружается из tasks.jsonl по индексу задачи.
import pyarrow.parquet as pq
import numpy as np
# Загрузка одного эпизода
pq_path = "dataset/wbc/data/chunk-000/episode_000000.parquet"
table = pq.read_table(pq_path)
df = table.to_pandas()
state = np.array(df["observation.state"].tolist()) # (N, 51) float32
action = np.array(df["action"].tolist()) # (N, 52) float32
# Извлечение отдельных групп суставов
legs = state[:, 0:12] # ноги
torso = state[:, 12:25] # корпус + руки + шея
fingers = state[:, 29:41] # пальцы
wrists = state[:, 25:29] # запястья
velocities = state[:, 45:51] # скорости
# Доступ к вспомогательным данным
timestamps = df["timestamp"].values
episode_ids = df["episode_id"].values