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

データ形式

プラットフォームは Robot Operating System(ROS)を基準としてロボットデータを統一的に管理します。ROS 標準ではない収集データは、インポート時に ROS 標準形式へ変換され、エクスポート時に学習フレームワークがそのまま読み取れる形式へ再度変換されます。

定義

用語説明
ROSRobot Operating System。ロボットアプリケーションを構築するためのソフトウェアライブラリとツール群で、プラットフォームのデータ基準です
MCAPFoxglove が主導するオープンソースのマルチモーダルログコンテナ形式で、em-cap と読みます。Topic ごとに各センサーの同期メッセージを格納します
TopicROS でメッセージを伝送する名前付きチャネルです。1 つが 1 台のカメラ、1 組の関節、または 1 つのセンサーに対応します
人間データ操作者の動作とインタラクションを記録した収集データで、モーションキャプチャや触覚などのセンサーを含みます
遠隔操作データ操作者が VR デバイスでロボットを操作する過程を記録したデータです
Episode1 回の完全なタスクシーケンスで、HDF5 と LeRobot における基本サンプル単位です

ルールと処理フロー

データフローと形式の関係

人間データと遠隔操作ロボットデータはプラットフォームに入ると ROS/MCAP に統一され、エクスポート時に目的のフレームワークに応じて再度変換されます。

共通ルール

ルール内容
統一基準取り込んだすべてのデータを ROS メッセージモデルで記述し、エクスポート時に目的のフレームワークへ変換します
ディレクトリ命名人間データのルートディレクトリ名は {date}_{project}_{scene}_{task}_{staff_id}_{timestamp}、遠隔操作データのルートディレクトリ名は {robot_name}_{date}_{timestamp}_{sequence_id} です
時間の特定アノテーションはナノ秒タイムスタンプとフレーム番号の両方を記録し、フィールドは start_timestampend_timestampstart_frame_idend_frame_id です
フィールドの自動適応エクスポート時に元データの関節数とカメラ数に応じてフィールドを生成するため、手動設定は不要です
機種対応23 機種分の可視化モデルを内蔵し、双腕、ヒューマノイド、協働アーム、移動プラットフォームに対応します(機種の根拠はページ末尾)

人間データの形式

ディレクトリ構造

収集タスクごとにタイムスタンプで命名されたフォルダが 1 つ生成され、内容は次のとおりです。

パス種類説明
{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グリッパの触覚データ。2 つのメッセージを含み、frame_id が左または右グリッパを示し、data の先頭 4 つの値が有効です
/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 です。

カメラ構成

人間データはカメラ位置によって 4 つのグループに分かれます。

カメラデータ型
メインヘッドの 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 は 1 件の人間データの意味的アノテーションを記録します。トップレベルフィールドとサブタスクフィールドは次のとおりです。

フィールド必須説明
belong_tostringはい所属するデータセット名
mocap_offsetarrayいいえモーションキャプチャの時間オフセット
object_setstring[]はいこのデータが扱う操作対象の集合
scenestringはいシーン名
skill_setstring[]はいこのデータが扱うスキルテンプレートの集合(例:pick {A} from {B}
subtasksobject[]はいサブタスクのリストで、各項目が 1 つのアノテーション時間帯に対応します
tag_setstring[]いいえタグの集合
task_descriptionstringはいタスク全体の説明

subtasks 内の 1 件のサブタスクのフィールドは次のとおりです。

フィールド必須説明
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 の 2 つをよく使用し、エクスポート時に元データの関節数とカメラ数に応じてフィールドを自動生成します。その他のエクスポート形式と操作についてはデータのエクスポートを参照してください。

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 が自動的に適応し、任意のカメラ数と関節数に対応します。次の表は 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.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 }
}
}

パラメータとフィールド

ディレクトリ命名パラメータ

人間データと遠隔操作データのルートディレクトリ名は、次のフィールドを連結して構成します。フィールドの値は収集段階で決まり、いずれか 1 つが欠けるとそのデータは取り込めません。

フィールド必須既定値値の範囲説明
datestringはいなし日付(例:20250115収集日
projectstringはいなしプロジェクト名所属プロジェクト
scenestringはいなしシーン名収集シーン
taskstringはいなしタスク名収集タスク
staff_idstringはいなし収集者の識別子収集者
timestampstringはいなし時刻(例:180926収集時刻
robot_namestringはいなしロボットの識別子(例:RM_AIDALロボット名。遠隔操作データで使用
sequence_idintはい00 以上収集通番。遠隔操作データで使用

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 路3 路のカメラと 8 路の状態、コマンド、姿勢、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 録画の自動品質検査ルール