Форматы данных
Платформа IO Data предназначена для универсального управления данными роботов, используя Robot Operating System (ROS) в качестве стандарта для единого управления данными роботов.
- Импорт данных: Поддерживает автоматическое преобразование нестандартных данных ROS из систем сбора данных, таких как Zhiyuan, Songling и других, в стандартный формат ROS для единого управления.
- Визуализация данных: Встроенные модели визуализации для 30+ основных роботов, обеспечивающие плавное воспроизведение 3D-анимаций и плоских изображений во всех форматах.
- Экспорт данных: Поддерживает экспорт стандартных форматов данных HDF5/LeRobot одним кликом, с адаптивными суставами и изображениями на основе исходных данных, готовыми для прямого обучения моделей.
Содержание
Формат данных человека
Сбор данных человека в основном используется для записи действий оператора и процессов взаимодействия, содержащих мультимодальные данные датчиков.
Структура файлов
Каждая задача сбора генерирует папку с именем по временной метке:
f"{date}_{project}_{scene}_{task}_{staff_id}_{timestamp}"
├── align_result.csv # Таблица выравнивания временных меток
├── annotation.json # Данные аннотации
├── config/ # Конфигурация камеры и датчиков
│ ├── calib_data.yml
│ ├── depth_to_rgb.yml
│ ├── mocap_main.yml
│ ├── orbbec_depth.yml
│ ├── orbbec_rgb.yml
│ └── pose_calib.yml
└── data.mcap # Пакет мультимодальных данных
Мультимодальные данные
Файл data.mcap
содержит синхронизированные данные всех датчиков, хранящиеся в формате MCAP.
Основной список топиков:
Имя топика | Тип данных | Описание |
---|---|---|
/mocap/sensor_data | io_msgs/squashed_mocap_data | Данные захвата движения: скорость, ускорение, угловая скорость, угол поворота суставов и данные датчиков |
/mocap/ros_tf | tf2_msgs/TFMessage | TF-преобразования всех суставов на основе захвата движения |
/joint_states | sensor_msgs/JointState | JointState всех суставов на основе захвата движения |
/rgbd/color/image_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с основной головной камеры |
/rgbd/depth/image_raw | sensor_msgs/Image | Изображение глубины с основной головной камеры |
/colorized_depth | sensor_msgs/CompressedImage | Цветное изображение глубины с основной головной камеры |
/left_ee_pose | geometry_msgs/PoseStamped | Поза левого захвата в системе координат основной головной камеры |
/right_ee_pose | geometry_msgs/PoseStamped | Поза правого захвата в системе координат основной головной камеры |
/claws_l_hand | io_msgs/claws_angle | Степень закрытия левого захвата |
/claws_r_hand | io_msgs/claws_angle | Степень закрытия правого захвата |
/claws_touch_data | io_msgs/squashed_touch | Тактильные данные захвата |
/realsense_left_hand/color/image_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с левой камеры захвата |
/realsense_left_hand/depth/image_rect_raw | sensor_msgs/Image | Изображение глубины с левой камеры захвата |
/realsense_right_hand/color/image_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с правой камеры захвата |
/realsense_right_hand/depth/image_rect_raw | sensor_msgs/Image | Изображение глубины с правой камеры захвата |
/usb_cam_fisheye/mjpeg_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с основной головной камеры "рыбий глаз" |
/usb_cam_left/mjpeg_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с левой моноокулярной камеры основной головы |
/usb_cam_right/mjpeg_raw/compressed | sensor_msgs/CompressedImage | RGB-изображение с п равой моноокулярной камеры основной головы |
/ee_visualization | sensor_msgs/CompressedImage | Визуализация позы концевой части в RGB-изображении основной головной камеры |
/touch_visualization | sensor_msgs/CompressedImage | Визуализация тактильных данных захвата |
/robot_description | std_msgs/String | URDF захвата движения |
/global_localization | geometry_msgs/PoseStamped | Поза основной головной камеры в мировой системе координат |
/world_left_ee_pose | geometry_msgs/PoseStamped | Поза левого захвата в мировой системе координат |
/world_right_ee_pose | geometry_msgs/PoseStamped | Поза правого захвата в мировой системе координат |
Данные камеры:
- Основная головная RGBD-камера: цветные + изображения глубины
- Левые/правые камеры захвата: RealSense RGBD
- Камера "рыбий глаз": панорамный вид
- Левые/правые моноокулярные камеры: стереозрение
Примечание: При использовании тактильных перчаток будет добавлен дополнительный топик
/mocap/touch_data
.
Нажмите, чтобы просмотреть оригинальный формат данных MCAP
library: mcap go v1.7.0
profile: ros1
messages: 45200
duration: 1m5.625866496s
start: 2025-01-15T18:09:29.628202496+08:00 (1736935769.628202496)
end: 2025-01-15T18:10:35.254068992+08:00 (1736935835.254068992)
compression:
zstd: [764/764 chunks] [6.13 GiB/3.84 GiB (37.39%)] [59.87 MiB/sec]
channels:
(1) /rgbd/color/image_raw/compressed 1970 msgs (30.02 Hz) : sensor_msgs/CompressedImage [ros1msg]
(2) /joint_states 1970 msgs (30.02 Hz) : sensor_msgs/JointState [ros1msg]
(3) /claws_r_hand 1970 msgs (30.02 Hz) : io_msgs/claws_angle [ros1msg]
(4) /global_localization 1970 msgs (30.02 Hz) : geometry_msgs/PoseStamped [ros1msg]
(5) /robot_description 1 msgs : std_msgs/String [ros1msg]
(6) /ee_visualization 1970 msgs (30.02 Hz) : sensor_msgs/CompressedImage [ros1msg]
(7) /rgbd/depth/image_raw 1970 msgs (30.02 Hz) : sensor_msgs/Image [ros1msg]
(8) /colorized_depth 1970 msgs (30.02 Hz) : sensor_msgs/CompressedImage [ros1msg]
(9) /claws_l_hand 1970 msgs (30.02 Hz) : io_msgs/claws_angle [ros1msg]
(10) /claws_touch_data 1970 msgs (30.02 Hz) : io_msgs/squashed_touch [ros1msg]
(11) /touch_visualization 1970 msgs (30.02 Hz) : sensor_msgs/CompressedImage [ros1msg]
(12) /mocap/sensor_data 1970 msgs (30.02 Hz) : io_msgs/squashed_mocap_data [ros1msg]
(13) /mocap/ros_tf 1970 msgs (30.02 Hz) : tf2_msgs/TFMessage [ros1msg]
(14) /left_ee_pose 1970 msgs (30.02 Hz) : geometry_msgs/PoseStamped [ros1msg]
(15) /right_ee_pose 1970 msgs (30.02 Hz) : geometry_msgs/PoseStamped [ros1msg]
(16) /usb_cam_left/mjpeg_raw/compressed 1960 msgs (29.87 Hz) : sensor_msgs/CompressedImage [ros1msg]
(17) /usb_cam_right/mjpeg_raw/compressed 1946 msgs (29.65 Hz) : sensor_msgs/CompressedImage [ros1msg]
(18) /usb_cam_fisheye/mjpeg_raw/compressed 1957 msgs (29.82 Hz) : sensor_msgs/CompressedImage [ros1msg]
(19) /realsense_left_hand/depth/image_rect_raw 1961 msgs (29.88 Hz) : sensor_msgs/Image [ros1msg]
(20) /realsense_left_hand/color/image_raw/compressed 1961 msgs (29.88 Hz) : sensor_msgs/CompressedImage [ros1msg]
(21) /realsense_right_hand/depth/image_rect_raw 1947 msgs (29.67 Hz) : sensor_msgs/Image [ros1msg]
(22) /realsense_right_hand/color/image_raw/compressed 1947 msgs (29.67 Hz) : sensor_msgs/CompressedImage [ros1msg]
(23) /world_left_ee_pose 1970 msgs (30.02 Hz) : geometry_msgs/PoseStamped [ros1msg]
(24) /world_right_ee_pose 1970 msgs (30.02 Hz) : geometry_msgs/PoseStamped [ros1msg]
channels: 24
attachments: 0
metadata: 0
Естественно-языковая аннотация
Файл annotation.json
содержит семантическую аннотационную информацию для задач, используемую для обучения и понимания намерений задач.
Описание основных полей:
Поле | Тип | Описание |
---|---|---|
belong_to | string | Идентификатор связанного файла данных |
object_set | array | Все объекты, задействованные в задаче |
scene | string | Идентификатор сцены |
skill_set | array | Коллекция шаблонов навыков |
subtasks | array | Последовательность подзадач |
task_description | string | Описание задачи |
Формат шаблонов навыков:
pick {A} from {B}
- Взять A из Bplace {A} on {B}
- Поместить A на Btoss {A} into {B}
- Бросить A в B
Структура подзадачи:
{
"skill": "pick {A} from {B}",
"description": "pick the paper cup from the placemat with the left gripper",
"description_zh": "左夹爪 从 餐垫 捡起 纸杯",
"start_frame_id": 159,
"end_frame_id": 227,
"start_timestamp": "1736935774906000000",
"end_timestamp": "1736935777206000000",
"sequence_id": 1,
"attempts": "success",
"comment": ""
}
Нажмите, чтобы просмотреть полный пример данных аннотации
{
"belong_to": "20250115_InnerTest_PublicArea_TableClearing_szk_180926",
"mocap_offset": [],
"object_set": [
"paper cup",
"placemat",
"trash can",
"napkin",
"plate",
"dinner knife",
"tableware storage box",
"wine glass",
"dinner fork"
],
"scene": "PublicArea",
"skill_set": [
"pick {A} from {B}",
"toss {A} into {B}",
"place {A} on {B}"
],
"subtasks": [
{
"skill": "pick {A} from {B}",
"description": "pick the paper cup from the placemat with the left gripper",
"description_zh": "左夹爪 从 餐垫 捡起 纸杯",
"end_frame_id": 227,
"end_timestamp": "1736935777206000000",
"sequence_id": 1,
"start_frame_id": 159,
"start_timestamp": "1736935774906000000",
"comment": "",
"attempts": "success"
},
{
"skill": "toss {A} into {B}",
"description": "toss the paper cup into the trash can with the left gripper",
"description_zh": "左夹爪 扔纸杯进垃圾桶",
"end_frame_id": 318,
"end_timestamp": "1736935780244000000",
"sequence_id": 2,
"start_frame_id": 231,
"start_timestamp": "1736935777306000000",
"comment": "",
"attempts": "success"
}
],
"tag_set": [],
"task_description": "20250115_InnerTest_PublicArea_TableClearing_szk_180926"
}
Формат данных телеробота
Данные телеробота записывают процесс управления роботом оператором через VR-устройства.
Структура файлов
f"{robot_name}_{date}_{timestamp}_{sequence_id}"
├── RM_AIDAL_250124_172033_0.mcap # Мультимодальные данные
├── RM_AIDAL_250124_172033_0.json # Данные аннотации
└── RM_AIDAL_250126_093648_0.metadata.yaml # Метаданные
Мультимодальные данные
Основной список топиков:
Имя топика | Тип данных | Описание |
---|---|---|
/camera_01/color/image_raw/compressed | sensor_msgs/msg/CompressedImage | RGB-изображение с основной камеры |
/camera_02/color/image_raw/compressed | sensor_msgs/msg/CompressedImage | RGB-изображение с левой камеры |
/camera_03/color/image_raw/compressed | sensor_msgs/msg/CompressedImage | RGB-изображение с правой камеры |
io_teleop/joint_states | sensor_msgs/msg/JointState | Состояния суставов |
io_teleop/joint_cmd | sensor_msgs/msg/JointState | Команды суставов |
io_teleop/target_ee_poses | geometry_msgs/msg/PoseArray | Целевые позы концевой части |
io_teleop/target_base_move | std_msgs/msg/Float64MultiArray | Целевое движение базы |
io_teleop/target_gripper_status | sensor_msgs/msg/JointState | Целевое состояние захвата |
io_teleop/target_joint_from_vr | sensor_msgs/msg/JointState | Целевые суставы с VR-устройства |
/robot_description | std_msgs/msg/String | Описание URDF робота |
/tf | tf2_msgs/msg/TFMessage | Информация о TF-преобразовании пространственных поз |
Нажмите, чтобы просмотреть оригинальный формат данных MCAP
Files: RM_AIDAL_250126_091041_0.mcap
Bag size: 443.3 MiB
Storage id: mcap
Duration: 100.052164792s
Start: Jan 24 2025 21:37:32.526605552 (1737725852.526605552)
End: Jan 24 2025 21:39:12.578770344 (1737725952.578770344)
Messages: 62116
Topic information: Topic: /camera_01/color/image_raw/compressed | Type: sensor_msgs/msg/CompressedImage | Count: 3000 | Serialization Format: cdr
Topic: /camera_02/color/image_raw/compressed | Type: sensor_msgs/msg/CompressedImage | Count: 3000 | Serialization Format: cdr
Topic: /camera_03/color/image_raw/compressed | Type: sensor_msgs/msg/CompressedImage | Count: 3000 | Serialization Format: cdr
Topic: io_teleop/joint_states | Type: sensor_msgs/msg/JointState | Count: 1529 | Serialization Format: cdr
Topic: io_teleop/joint_cmd | Type: sensor_msgs/msg/JointState | Count: 10009 | Serialization Format: cdr
Topic: io_teleop/target_ee_poses | Type: geometry_msgs/msg/PoseArray | Count: 10014 | Serialization Format: cdr
Topic: io_teleop/target_base_move | Type: std_msgs/msg/Float64MultiArray | Count: 10010 | Serialization Format: cdr
Topic: io_teleop/target_gripper_status | Type: sensor_msgs/msg/JointState | Count: 10012 | Serialization Format: cdr
Topic: io_teleop/target_joint_from_vr | Type: sensor_msgs/msg/JointState | Count: 10012 | Serialization Format: cdr
Topic: /robot_description | Type: std_msgs/msg/String | Count: 1 | Serialization Format: cdr
Topic: /tf | Type: tf2_msgs/msg/TFMessage | Count: 1529 | Serialization Format: cdr
Естественно-языковая аннотация
Формат аннотации данных телеробота такой же, как и данных человека, оба представляют естественно-языковые описания того, какие действия выполняли роботы или люди и с какими объектами они взаимодействовали.
Нажмите, чтобы просмотреть полный пример данных аннотации телеробота
{
"belong_to": "RM_AIDAL_250126_091041_0",
"mocap_offset": [],
"object_set": [
"lemon candy",
"plate",
"pistachios"
],
"scene": "250126",
"skill_set": [
"place {A} on {B}"
],
"subtasks": [
{
"skill": "place {A} on {B}",
"objecta": "lemon candy",
"objectb": "plate",
"options": [
"leftHand"
],
"description": "place the lemon candy on the plate with the left hand",
"end_timestamp": "1737725886915000000",
"sequence_id": 1,
"start_timestamp": "1737725880757000000",
"comment": "",
"attempts": "success"
},
{
"skill": "place {A} on {B}",
"objecta": "pistachios",
"objectb": "plate",
"options": [
"rightHand"
],
"description": "place the pistachios on the plate with the right hand",
"end_timestamp": "1737725950745000000",
"sequence_id": 2,
"start_timestamp": "1737725941657000000",
"comment": "",
"attempts": "success"
}
],
"tag_set": [],
"task_description": "20250205_RM_ItemPacking_zhouxw"
}
Экспорт данных для обучения моделей
Для облегчения обучения моделей платформа предоставляет несколько возможностей эк спорта данных, преобразуя исходные данные MCAP и JSON в форматы, подходящие для машинного обучения.
Общие форматы HDF5 и LeRobot можно экспортировать одним кликом, и различные роботы или количество датчиков могут быть автоматически адаптированы без ручной настройки.
Формат HDF5
Формат HDF5 подходит для хранения больших данных и быстрого доступа, используя иерархическую структуру для организации данных.
Структура файла:
chunk_001.hdf5
├── /data/ # Группа данных
│ ├── episode_001/ # Первая последовательность задач
│ │ ├── action # Команды суставов (многомерный массив)
│ │ ├── observation.state # Наблюдения датчиков
│ │ ├── observation.gripper # Состояние захвата
│ │ └── observation.images.* # Многовидовые изображения
│ └── episode_002/ # Вторая последовательность задач
└── /meta/ # Группа метаданных
Содержимое данных:
action
- Команды управления суставами (массив float32)observation.state
- Наблюдения датчиков (массив float32)observation.images.*
- Сжатые данные изображений (формат JPEG)observation.gripper
- Состояние захвата (массив float32)task
- Описание на английском языкеtask_zh
- Описание на китайском языкеscore
- Оценка качества действий
Формат LeRobot
Формат LeRobot является стандартным форматом данных в области обучения роботов, совместимым с основными фреймворками обучения роботов.
Эталонные примеры данных: https://huggingface.co/datasets/io-ai-data/uncap_pen
Определения характеристик данных:
Длина и Shape экспортируемых наборов данных LeRobot автоматически адаптируются, поддерживая любое количество камер или суставов. Показанный здесь Shape предназначен для формата экспорта 7-степенного робота-манипулятора Songling:
Имя характеристики | Тип данных | Shape | Описание |
---|---|---|---|
action | float32 | [14] | Команды суставов (по 7 суставов для левой и правой рук) |
observation.state | float32 | [14] | Состояния суставов (по 7 суставов для левой и правой рук) |
observation.images.cam_high | image | [3,480,640] | Изображение с высокой камеры |
observation.images.cam_low | image | [3,480,640] | Изображение с низкой камеры |
observation.images.cam_left_wrist | image | [3,480,640] | Изображение с левой камеры запястья |
observation.images.cam_right_wrist | image | [3,480,640] | Изображение с правой камеры запястья |
timestamp | float32 | [1] | Временная метка |
frame_index | int64 | [1] | Индекс кадра |
episode_index | int64 | [1] | Индекс последовательности задач |
Нажмите, чтобы просмотреть полный пример определения формата LeRobot
{
"codebase_version": "v2.1",
"robot_type": "aloha",
"total_episodes": 10,
"total_frames": 3000,
"total_tasks": 1,
"total_videos": 0,
"total_chunks": 1,
"chunks_size": 1000,
"fps": 15,
"splits": {
"train": "0:10"
},
"data_path": "data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet",
"video_path": "videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4",
"features": {
"observation.state": {
"dtype": "float32",
"shape": [14],
"names": [
[
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper",
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper"
]
]
},
"action": {
"dtype": "float32",
"shape": [14],
"names": [
[
"right_waist",
"right_shoulder",
"right_elbow",
"right_forearm_roll",
"right_wrist_angle",
"right_wrist_rotate",
"right_gripper",
"left_waist",
"left_shoulder",
"left_elbow",
"left_forearm_roll",
"left_wrist_angle",
"left_wrist_rotate",
"left_gripper"
]
]
},
"observation.images.cam_high": {
"dtype": "image",
"shape": [3, 480, 640],
"names": ["channels", "height", "width"]
},
"observation.images.cam_low": {
"dtype": "image",
"shape": [3, 480, 640],
"names": ["channels", "height", "width"]
},
"observation.images.cam_left_wrist": {
"dtype": "image",
"shape": [3, 480, 640],
"names": ["channels", "height", "width"]
},
"observation.images.cam_right_wrist": {
"dtype": "image",
"shape": [3, 480, 640],
"names": ["channels", "height", "width"]
},
"timestamp": {
"dtype": "float32",
"shape": [1],
"names": null
},
"frame_index": {
"dtype": "int64",
"shape": [1],
"names": null
},
"episode_index": {
"dtype": "int64",
"shape": [1],
"names": null
},
"index": {
"dtype": "int64",
"shape": [1],
"names": null
},
"task_index": {
"dtype": "int64",
"shape": [1],
"names": null
}
}
}