跳到主要内容

数据格式

平台以 Robot Operating System (ROS) 为基准统一管理机器人数据:非 ROS 标准的采集数据在导入时转换为 ROS 标准格式,导出时再转为训练框架可直接读取的格式。

定义​

术语说明
ROSRobot Operating System,用于构建机器人应用的软件库与工具集,平台的数据基准
MCAP由 Foxglove 主导的开源多模态日志容器格式,读作 em-cap,按 Topic 存放各传感器的同步消息
TopicROS 中传输消息的命名通道,一路对应一台相机、一组关节或一个传感器
人类数据记录操作者动作与交互的采集数据,含动作捕捉与触觉等传感器
遥操作数据记录操作者通过 VR 设备控制机器人过程的数据
Episode一次完整任务序列,HDF5 与 LeRobot 中的基本样本单位

规则与流程​

数据流与格式关系​

人类数据与遥操作机器人数据进入平台后统一为 ROS/MCAP,导出时按目标框架再转换。

通用规则​

规则内容
统一基准全部入库数据以 ROS 消息模型描述,导出时按目标框架转换
目录命名人类数据根目录名为 {date}_{project}_{scene}_{task}_{staff_id}_{timestamp};遥操作数据根目录名为 {robot_name}_{date}_{timestamp}_{sequence_id}
时间定位标注同时记录纳秒时间戳与帧号,字段为 start_timestamp、end_timestamp、start_frame_id、end_frame_id
字段自适应导出时按原始数据的关节数与相机数生成字段,无需人工配置
机型适配内置 23 款机器人机型的可视化模型,覆盖双臂、人形、协作臂与移动平台(依据见文末)

人类数据格式​

目录结构​

每个采集任务生成一个以时间戳命名的文件夹,条目如下。

路径类型说明
{date}_{project}_{scene}_{task}_{staff_id}_{timestamp}/目录采集任务根目录,名称含日期、项目、场景、任务、采集员与时间戳
data.mcap文件多模态数据包,含全部传感器的同步数据
annotation.json文件标注数据
align_result.csv文件时间戳对齐表格
config/目录相机与传感器配置
config/calib_data.yml文件标定数据
config/depth_to_rgb.yml文件深度与彩色对齐参数
config/mocap_main.yml文件动作捕捉主配置
config/orbbec_depth.yml文件深度相机配置
config/orbbec_rgb.yml文件彩色相机配置
config/pose_calib.yml文件位姿标定参数

Topic 与消息类型​

data.mcap 内各 Topic 的名称、消息类型与数据含义如下。

Topic 名称消息类型说明
/mocap/sensor_dataio_msgs/squashed_mocap_data动作捕捉的关节速度、加速度、角速度、旋转角度与传感器数据
/mocap/ros_tftf2_msgs/TFMessage基于动作捕捉的全部关节 TF 变换
/joint_statessensor_msgs/JointState基于动作捕捉的全部关节 JointState
/rgbd/color/image_raw/compressedsensor_msgs/CompressedImage主头部相机 RGB 图像
/rgbd/depth/image_rawsensor_msgs/Image主头部相机深度图像
/colorized_depthsensor_msgs/CompressedImage主头部相机彩色深度图像
/left_ee_posegeometry_msgs/PoseStamped主头部相机坐标系下的左夹爪位姿
/right_ee_posegeometry_msgs/PoseStamped主头部相机坐标系下的右夹爪位姿
/claws_l_handio_msgs/claws_angle左夹爪闭合程度
/claws_r_handio_msgs/claws_angle右夹爪闭合程度
/claws_touch_dataio_msgs/squashed_touch夹爪触觉数据;含两个消息,frame_id 标识左或右夹爪,data 前四个值有效
/realsense_left_hand/color/image_raw/compressedsensor_msgs/CompressedImage左夹爪相机 RGB 图像
/realsense_left_hand/depth/image_rect_rawsensor_msgs/Image左夹爪相机深度图像
/realsense_right_hand/color/image_raw/compressedsensor_msgs/CompressedImage右夹爪相机 RGB 图像
/realsense_right_hand/depth/image_rect_rawsensor_msgs/Image右夹爪相机深度图像
/usb_cam_fisheye/mjpeg_raw/compressedsensor_msgs/CompressedImage主头部鱼眼相机 RGB 图像
/usb_cam_left/mjpeg_raw/compressedsensor_msgs/CompressedImage主头部左单目相机 RGB 图像
/usb_cam_right/mjpeg_raw/compressedsensor_msgs/CompressedImage主头部右单目相机 RGB 图像
/ee_visualizationsensor_msgs/CompressedImage主头部相机 RGB 图像中的末端执行器位姿可视化
/touch_visualizationsensor_msgs/CompressedImage夹爪触觉数据可视化
/robot_descriptionstd_msgs/String动作捕捉 URDF
/global_localizationgeometry_msgs/PoseStamped主头部相机在世界坐标系中的位姿
/world_left_ee_posegeometry_msgs/PoseStamped左夹爪在世界坐标系中的位姿
/world_right_ee_posegeometry_msgs/PoseStamped右夹爪在世界坐标系中的位姿
提示

使用触觉手套采集时,额外增加 /mocap/touch_data Topic,消息类型为 io_msgs/squashed_touch。

相机配置​

人类数据按相机位置分为四组。

相机数据类型
主头部 RGBD 相机彩色图像与深度图像
左夹爪、右夹爪相机RealSense RGBD
鱼眼相机全景图像
左单目、右单目相机立体视觉图像
原始 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_tostring是所属数据集名称
mocap_offsetarray否动作捕捉时间偏移
object_setstring[]是本条数据涉及的操作对象集合
scenestring是场景名称
skill_setstring[]是本条数据涉及的技能模板集合,如 pick {A} from {B}
subtasksobject[]是子任务列表,每条对应一个标注时间段
tag_setstring[]否标签集合
task_descriptionstring是任务整体描述

subtasks 中单条子任务的字段如下。

字段类型必填说明
skillstring是技能模板
descriptionstring是英文自然语言描述
description_zhstring否中文自然语言描述
sequence_idint是子任务序号,按时间递增
start_frame_idint是起始帧号
start_timestampstring是起始纳秒时间戳
end_frame_idint是结束帧号
end_timestampstring是结束纳秒时间戳
commentstring否备注
attemptsstring是执行结果,如 success
中文标注数据示例
{
"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 设备控制机器人的过程,条目如下。

路径类型说明
{robot_name}_{date}_{timestamp}_{sequence_id}/目录采集任务根目录
*_{sequence_id}.mcap文件多模态数据
*_{sequence_id}.json文件标注数据
*_{sequence_id}.metadata.yaml文件元数据

Topic 与消息类型​

Topic 名称消息类型说明
/camera_01/color/image_raw/compressedsensor_msgs/msg/CompressedImage主相机 RGB 图像
/camera_02/color/image_raw/compressedsensor_msgs/msg/CompressedImage左相机 RGB 图像
/camera_03/color/image_raw/compressedsensor_msgs/msg/CompressedImage右相机 RGB 图像
io_teleop/joint_statessensor_msgs/msg/JointState关节状态
io_teleop/joint_cmdsensor_msgs/msg/JointState关节命令
io_teleop/target_ee_posesgeometry_msgs/msg/PoseArray末端执行器目标位姿
io_teleop/target_base_movestd_msgs/msg/Float64MultiArray基座移动目标
io_teleop/target_gripper_statussensor_msgs/msg/JointState夹爪状态目标
io_teleop/target_joint_from_vrsensor_msgs/msg/JointStateVR 设备的关节目标
/robot_descriptionstd_msgs/msg/String机器人 URDF 描述
/tftf2_msgs/msg/TFMessageTF 空间位姿变换信息
原始 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

标注数据​

遥操作数据的标注结构与人类数据一致,subtasks 中额外记录操作对象与目标,见下方示例。

遥操作标注数据示例
{
"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/ # 元数据组

各数据集字段的取值与类型见「参数与字段」中的 HDF5 字段表。

LeRobot 格式​

LeRobot 是机器人学习领域的标准数据格式,兼容主流机器人学习框架。参考样例数据见 piper_uncap_pen。

导出 LeRobot 数据集的长度与 Shape 自适应,支持任意相机数量与任意关节数量。下表为松灵桌面 7 自由度机械臂的导出结果。

特征名称数据类型Shape说明
actionfloat32[14]关节指令,左右臂各 7 个关节
observation.statefloat32[14]关节状态,左右臂各 7 个关节
observation.images.cam_highimage[3,480,640]高位相机图像
observation.images.cam_lowimage[3,480,640]低位相机图像
observation.images.cam_left_wristimage[3,480,640]左腕相机图像
observation.images.cam_right_wristimage[3,480,640]右腕相机图像
timestampfloat32[1]时间戳
frame_indexint64[1]帧索引
episode_indexint64[1]任务序列索引
完整 LeRobot 格式定义示例
{
"codebase_version": "v2.1",
"robot_type": "custom_arm",
"total_episodes": 20,
"total_frames": 5134,
"total_tasks": 20,
"total_videos": 0,
"total_chunks": 1,
"chunks_size": 1000,
"fps": 30,
"splits": {
"train": "0:20"
},
"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.images.camera_01": {
"dtype": "image",
"shape": [480, 640, 3]
},
"observation.state": {
"dtype": "float64",
"shape": [37],
"names": [
"r_joint1", "r_joint2", "r_joint3", "r_joint4", "r_joint5", "r_joint6",
"l_joint1", "l_joint2", "l_joint3", "l_joint4", "l_joint5", "l_joint6",
"R_thumb_MCP_joint1", "R_thumb_MCP_joint2", "R_thumb_PIP_joint", "R_thumb_DIP_joint",
"R_index_MCP_joint", "R_index_DIP_joint", "R_middle_MCP_joint", "R_middle_DIP_joint",
"R_ring_MCP_joint", "R_ring_DIP_joint", "R_pinky_MCP_joint", "R_pinky_DIP_joint",
"L_thumb_MCP_joint1", "L_thumb_MCP_joint2", "L_thumb_PIP_joint", "L_thumb_DIP_joint",
"L_index_MCP_joint", "L_index_DIP_joint", "L_middle_MCP_joint", "L_middle_DIP_joint",
"L_ring_MCP_joint", "L_ring_DIP_joint", "L_pinky_MCP_joint", "L_pinky_DIP_joint",
"platform_joint"
]
},
"action": {
"dtype": "float64",
"shape": [12],
"names": [
"l_joint1", "l_joint2", "l_joint3", "l_joint4", "l_joint5", "l_joint6",
"r_joint1", "r_joint2", "r_joint3", "r_joint4", "r_joint5", "r_joint6"
]
},
"observation.gripper": {
"dtype": "float64",
"shape": [2],
"names": ["right_gripper", "left_gripper"]
},
"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 }
}
}

参数与字段​

目录命名参数​

人类数据与遥操作数据的根目录名由以下字段拼接。字段取值来自采集环节,缺任一段时该数据无法入库。

字段类型必填默认值取值范围说明
datestring是无日期,如 20250115采集日期
projectstring是无项目名称所属项目
scenestring是无场景名称采集场景
taskstring是无任务名称采集任务
staff_idstring是无采集员标识采集员
timestampstring是无时刻,如 180926采集时刻
robot_namestring是无机器人标识,如 RM_AIDAL机器人名称,遥操作数据使用
sequence_idint是0大于等于 0采集序号,遥操作数据使用

HDF5 字段​

字段类型必填默认值取值范围说明
actionfloat32 数组是无维度等于关节数关节控制指令
observation.statefloat32 数组是无维度等于关节数传感器观测值
observation.images.*JPEG 压缩图像否无高 × 宽 × 3各视角图像
observation.gripperfloat32 数组否无维度等于夹爪数夹爪状态
taskstring否无—英文自然语言描述
task_zhstring否无—中文自然语言描述
scorenumber否-10–1;-1 表示未评分动作质量评分

口径与依据​

项目取值口径与依据
机器人机型23 款内置可视化模型并可在机器人管理中登记的机型
训练导出格式2 种本页展开 HDF5 与 LeRobot
人类数据 Topic24 路不含触觉手套的 /mocap/touch_data
遥操作数据 Topic11 路三路相机与八路状态、命令、位姿、TF

使用限制​

数据格式受以下既有边界约束。

项目限制说明
数据基准格式仅 ROS 标准消息模型非 ROS 格式先在导入阶段转换为 MCAP,平台以转换后的 MCAP 作为管理对象
HDF5 入库来源Agilex、Realman、Dobot、Limx、Unix仅上述来源存在专用转换器,其他 HDF5 录制不支持直接入库
目录命名各段全必填人类数据 6 段、遥操作数据 4 段,缺任一段的数据无法入库
图像字段编码HDF5 为 JPEG,LeRobot 为 MP4 或 JPG导出时按所选格式写入,平台不保留可切换的原始编码
分块与抽样参数HDF5 chunk_size 1–100、hz 1–60参数含义见 HDF5 数据集
导出格式版本LeRobot 限 v3.0、v2.1版本差异见 LeRobot v2 与 v3 格式差异

相关页面​

页面用途
数据导出导出全部目标格式与导出历史
LeRobot 数据集与训练LeRobot 数据集的导入、可视化与训练
HDF5 数据集HDF5 数据的导入与可视化
数据质检ROS 录制的自动质量检测规则