メインコンテンツまでスキップ

データ形式

EmbodyFlowプラットフォームのデザイン目標は、汎用ロボットデータの管理であり、Robot Operating System (ROS) を基準としてロボットデータを一元管理します。

  1. データのインポート:AgiBotやAgileXなどのデータ収集システムからの非ROS標準データを、一元管理のためにROS標準形式に自動変換することをサポートします。
  2. データの視覚化:30種類以上の主要なロボットの視覚化モデルを内蔵しており、3Dアニメーションや平面画像など、あらゆる形式のコンテンツをスムーズに再生できます。
  3. データのエクスポート:標準的な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_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グリッパーの触覚データ
/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世界座標系における右グリッパーの位姿

カメラデータ:

  • メインヘッド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
トピック名データの意味
/mocap/sensor_dataモーションキャプチャによる関節速度、加速度、角速度、回転角度、センサーデータ
/mocap/ros_tfモーションキャプチャに基づくすべての関節のTF
/joint_statesモーションキャプチャに基づくすべての関節のJointState
/right_ee_poseメインヘッドカメラ座標系における右グリッパーの位姿
/left_ee_poseメインヘッドカメラ座標系における左グリッパーの位姿
/claws_l_hand左グリッパーの閉合度
/claws_r_hand右グリッパーの閉合度
/claws_touch_dataグリッパーの触覚データ(2つのメッセージが含まれ、各メッセージのframe_idは左または右グリッパーを示し、dataの最初の4つの値が有効)
/realsense_left_hand/color/image_raw/compressed左グリッパーカメラのRGB画像
/realsense_left_hand/depth/image_rect_raw左グリッパーカメラの深度画像
/realsense_right_hand/color/image_raw/compressed右グリッパーカメラのRGB画像
/realsense_right_hand/depth/image_rect_raw右グリッパーカメラの深度画像
/rgbd/color/image_raw/compressedメインヘッドカメラのRGB画像
/rgbd/depth/image_rawメインヘッドカメラの深度画像
/colorized_depthメインヘッドカメラのカラー深度画像
/usb_cam_fisheye/mjpeg_raw/compressedメインヘッド魚眼カメラのRGB画像
/usb_cam_left/mjpeg_raw/compressedメインヘッド左単目カメラのRGB画像
/usb_cam_right/mjpeg_raw/compressedメインヘッド右単目カメラのRGB画像
/ee_visualizationメインヘッドカメラRGB画像内での末端執行器位姿の可視化
/touch_visualizationグリッパー触覚データの可視化
/robot_descriptionモーションキャプチャURDF
/global_localization世界座標系におけるメインヘッドカメラの位姿
/world_left_ee_pose世界座標系における左グリッパーの位姿
/world_right_ee_pose世界座標系における右グリッパーの位姿

触覚手袋を着用して収集されたデータの場合、触覚デジタル信号アレイのトピックが追加されます:

/mocap/touch_data 57 msgs (30.25 Hz): io_msgs/squashed_touch [ros1msg]

自然言語アノテーション

{
"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/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
トピック名データの意味
/camera_01/color/image_raw/compressedメインカメラのRGB画像
/camera_02/color/image_raw/compressed左カメラのRGB画像
/camera_03/color/image_raw/compressed右カメラのRGB画像
io_teleop/joint_states関節状態
io_teleop/joint_cmd関節コマンド
io_teleop/target_ee_poses末端執行器目標位姿
io_teleop/target_base_moveベース移動目標
io_teleop/target_gripper_statusグリッパー状態目標
io_teleop/target_joint_from_vrVRデバイスからの関節目標
/robot_descriptionロボットURDF記述
/tfTF空間位姿変換情報

テレオペレーションアノテーションデータ

{
"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/ # 第1タスクシーケンス
│ │ ├── action # 関節指令 (多次元配列)
│ │ ├── observation.state # センサー観測値
│ │ ├── observation.gripper # グリッパー状態
│ │ └── observation.images.* # 各視点の画像
│ └── episode_002/ # 第2タスクシーケンス
└── /meta/ # メタデータグループ

データ内容:

  • action - 関節制御指令 (float32配列)
  • observation.state - センサー観測値 (float32配列)
  • observation.images.* - 圧縮画像データ (JPEG形式)
  • observation.gripper - グリッパー状態 (float32配列)
  • task - 英語の自然言語記述
  • task_zh - 中国語の自然言語記述
  • score - 動作品質スコア

LeRobot形式

LeRobot形式はロボット学習分野の標準データ形式であり、主要なロボット学習フレームワークと互換性があります。

参考サンプルデータ: https://huggingface.co/datasets/io-intelligence/piper_uncap_pen

データ特徴の定義:

|> エクスポートされるLeRobotデータセットの長さと形状(Shape)は自動的に適応され、任意のカメラ数や関節数をサポートします。ここでの形状は、AgileXデスクトップ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.images.camera_02": {
"dtype": "image",
"shape": [
480,
640,
3
]
},
"observation.images.camera_03": {
"dtype": "image",
"shape": [
480,
640,
3
]
},
"observation.images.camera_04": {
"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
}
}
}