数据格式
平台以 Robot Operating System (ROS) 为基准统一管理机器人数据:非 ROS 标准的采集数据在导入时转换为 ROS 标准格式,导出时再转为训练框架可直接读取的格式。
定义
| 术语 | 说明 |
|---|---|
| ROS | Robot Operating System,用于构建机器人应用的软件库与工具集,平台的数据基准 |
| MCAP | 由 Foxglove 主导的开源多模态日志容器格式,读作 em-cap,按 Topic 存放各传感器的同步消息 |
| Topic | ROS 中传输消息的命名通道,一路对应一台相机、一组关节或一个传感器 |
| 人类数据 | 记录操作者动作与交互的采集数据,含动作捕捉与触觉等传感器 |
| 遥操作数据 | 记录操作者通过 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_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 | 夹爪触觉数据;含两个消息,frame_id 标识左或右夹爪,data 前四个值有效 |
/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 | 右夹爪在世界坐标系中的位姿 |
提示
使用触觉手套采集时,额外增加 /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_to | string | 是 | 所属数据集名称 |
mocap_offset | array | 否 | 动作捕捉时间偏移 |
object_set | string[] | 是 | 本条数据涉及的操作对象集合 |
scene | string | 是 | 场景名称 |
skill_set | string[] | 是 | 本条数据涉及的技能模板集合,如 pick {A} from {B} |
subtasks | object[] | 是 | 子任务列表,每条对应一个标注时间段 |
tag_set | string[] | 否 | 标签集合 |
task_description | string | 是 | 任务整体描述 |
subtasks 中单条子任务的字段如下。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
skill | string | 是 | 技能模板 |
description | string | 是 | 英文自然语言描述 |
description_zh | string | 否 | 中文自然语言描述 |
sequence_id | int | 是 | 子任务序号,按时间递增 |
start_frame_id | int | 是 | 起始帧号 |
start_timestamp | string | 是 | 起始纳秒时间戳 |
end_frame_id | int | 是 | 结束帧号 |
end_timestamp | string | 是 | 结束纳秒时间戳 |
comment | string | 否 | 备注 |
attempts | string | 是 | 执行结果,如 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"
}