GNN_Disassembly_WorldModel
收藏GNN Constraint-Aware World Model Dataset (v3) 数据集概述
基本信息
- 数据集名称: GNN Constraint-Aware World Model Dataset (v3)
- 许可证: CC BY 4.0
- 任务类别: 机器人技术、图像分割、图机器学习
- 语言: 英语
- 标签: 机器人技术、操作、拆卸、汉诺塔、约束图、图神经网络、世界模型、SAM2、分割、UR5e
- 数据规模: 1K < n < 10K
- 项目: CoRL 2026 — GNN world model for constraint-aware video generation
- 作者: Chang Liu (Texas A&M University)
- 硬件: UR5e + Robotiq 2F-85 夹爪,OAK-D Pro(静态侧视图)
- 格式版本: v3.0 (更新于 2026-04-16)
领域概览
数据集包含两个机器人操作领域,共享统一的 270维节点特征格式。
| 领域 | 提供的图变体 | 节点词汇表大小 | 节点特征维度 | 边特征维度 | 数据根目录 |
|---|---|---|---|---|---|
| 桌面拆卸 | products-only, with-robot-node, with-robot-state, with-robot-action | 9 (8个产品 + robot) |
270 | 3 | session_<date>_<time>/episode_XX/ |
| 汉诺塔 | products-only, with-robot-state, with-robot-action | 4 (ring_1..ring_4) |
270 | 3 | hanoi/session_hanoi_<date>_<time>/episode_XX/ |
节点特征维度构成: 256 (SAM2嵌入) + 3 (3D位置) + 10 (固定类型编码) + 1 (可见性) = 270。10维类型编码是固定的、确定性的每类型向量(非训练所得),在加载时从 config/type_encoding_random.yaml 或 config/type_encoding_clip.yaml 读取。
四个加载器变体 (均返回 torch_geometric.data.Data):
load_pyg_frame_products_only— V1 基础图:仅产品/圆环,无机器人信息。load_pyg_frame_with_robot— V2 消融:机器人作为图节点附加(仅限桌面领域;汉诺塔v1无机器人掩码,因此回退到products-only)。load_pyg_frame_with_robot_state— V3 推荐:仅产品图 +robot_state=[13]侧张量。适用于两个领域,因为robot_states.npy在所有地方都存在。load_pyg_frame_with_robot_action— V3 动作条件化:同上 +robot_action=[13]下一帧的增量。
文件布局 (两个领域相同)
episode_XX/ ├── metadata.json # 片段元数据(领域特定额外信息) ├── robot_states.npy # (T, 13) float32 — 关节 + TCP + 夹爪 ├── robot_actions.npy # (T-1, 13) float32 — 帧增量 ├── timestamps.npy # (T, 3) float64 ├── side/ │ ├── rgb/frame_XXXXXX.png # 1280×720 RGB │ └── depth/frame_XXXXXX.npy # 1280×720 uint16 (mm) ├── wrist/ # 原始腕部摄像头(v3中未使用) └── annotations/ ├── side_graph.json # 组件、静态边、frame_states ├── side_masks/ # 每帧 {component_id: (H,W) uint8} ├── side_embeddings/ # 每帧 {component_id: (256,) float32} ├── side_depth_info/ # 每帧扁平键控深度包 ├── side_robot/ # 每帧机器人包(可见性标志) └── dataset_card.json # 格式描述
对齐保证: 每个带标签的帧索引在 side_masks/、side_embeddings/、side_depth_info/、side_robot/ 四个目录中都有文件。文件由相同的整数帧索引键控。
桌面拆卸领域
组件 (9种类型)
八种产品类型 + 一个机器人代理。多个实例(例如 ram_1, ram_2)共享相同的10维类型编码,并通过SAM2嵌入 + 3D位置区分。
| 索引 | 类型 | 颜色 | 备注 |
|---|---|---|---|
| 0 | cpu_fan |
#FF6B6B | 开始时始终可见 |
| 1 | cpu_bracket |
#4ECDC4 | 开始时隐藏(风扇下) |
| 2 | cpu |
#45B7D1 | 开始时隐藏 |
| 3 | ram_clip |
#96CEB4 | 多实例 |
| 4 | ram |
#FFEAA7 | 多实例 |
| 5 | connector |
#DDA0DD | 多实例 |
| 6 | graphic_card |
#FF8C42 | 始终可见 |
| 7 | motherboard |
#8B5CF6 | 始终可见(基础) |
| 8 | robot |
#F5F5F5 | 代理节点(单独存储在 side_robot/ 中) |
稀疏约束边
有向先决关系 — A -> B 表示“必须先移除A才能移除B”:
cpu_fan -> cpu_bracket (风扇覆盖支架) cpu_fan -> motherboard cpu_bracket -> cpu cpu_bracket -> motherboard cpu -> motherboard ram_N -> motherboard ram_clip_N -> motherboard ram_clip_N -> ram_M (用户手动配对) connector_N -> motherboard graphic_card -> motherboard
典型片段包含10-15个产品节点和10-14条存储的有向边。
可用桌面片段
| 会话 / 片段 | 带标签帧数 | 目标 |
|---|---|---|
session_0408_162129/episode_00 |
346 | cpu_fan |
session_0410_125013/episode_00 |
473 | cpu_fan |
session_0410_125013/episode_01 |
525 | graphic_card |
| 总计: 1344帧。 |
汉诺塔领域
组件 (4种类型) — 仅圆环,v1中无机器人节点
汉诺塔片段使用原生圆环ID(ring_1 .. ring_4)在 components 中并作为npz键 — 无桌面代理重映射,且v1中无机器人节点。type_vocab 为 ["ring_1", "ring_2", "ring_3", "ring_4"](长度4)。机器人分割被推迟;side_robot/*.npz 每帧填充零以保持格式统一,但从不成为图节点。
| ID | 颜色 | 圆盘尺寸 | 角色 |
|---|---|---|---|
ring_1 |
红色 (#E63946) | 32 mm | 最小 |
ring_2 |
黄色 (#F1C40F) | 42 mm | — |
ring_3 |
绿色 (#2ECC71) | 52 mm | — |
ring_4 |
蓝色 (#2E86DE) | 62 mm | 最大 |
任务种类 (40 / 40 / 20 采样)
| 种类 | 权重 | 提示模板 | 目标 |
|---|---|---|---|
classical |
0.40 | "Solve the puzzle: stack all rings on peg X" |
所有4个圆环按大小顺序堆叠在一个柱子上 |
single_ring |
0.40 | "Move the <color> ring to peg X" |
移动一个指定圆环;其他不动 |
rearrange |
0.20 | "Rearrange: red on peg A, green on peg B, ..." |
均匀采样的有效(大在下小在上)配置 |
结构边 (静态,始终为6条)
6条较小→较大的有向对被逐字存储在 side_graph.json 中:
ring_1 -> ring_2 ring_1 -> ring_3 ring_1 -> ring_4 ring_2 -> ring_3 ring_2 -> ring_4 ring_3 -> ring_4
在PyG加载时,加载器扩展为 4 × 3 = 12 条全连接的有向边。
每帧 is_locked 语义
边 (A, B) 上的 is_locked = 1 当且仅当A当前是同一柱子上紧挨着堆叠在B上方的圆环(在柱子堆栈中相邻,A在B上方)。其他所有配对 — 同一柱子上非相邻、不同柱子、或任一圆环在运输中 — 的 is_locked = 0。这严格是“当前物理堆叠”,而非“A必须在B之前移动”。
可用汉诺塔片段
| 会话 / 片段 | 帧数 | mission_kind |
goal_prompt |
移动次数 |
|---|---|---|---|---|
session_hanoi_0415_190808/episode_00 |
494 | single_ring |
"Move the red ring to peg B" |
1 |
session_hanoi_0415_190808/episode_01 |
6719 | classical |
"Solve the puzzle: stack all rings on peg C" |
15 |
session_hanoi_0415_190808/episode_02 |
266 | single_ring |
"Move the red ring to peg B" |
1 |
| 总计: 7479帧。 |
共享信息
PyG边特征语义 (3维,两个领域)
edge_attr[k] = [has_constraint, is_locked, src_blocks_dst]
has_constraint |
is_locked |
src_blocks_dst |
含义 |
|---|---|---|---|
| 0 | 0 | 0 | 无物理约束 — 仅用于消息传递。用于:机器人 ↔ 任何物体;汉诺塔较大 → 较小(在配对级别为非边) |
| 1 | 1 | 1 | 约束激活,src是阻塞者(物理桌面)/ src位于顶部(物理汉诺塔) |
| 1 | 1 | 0 | 相同配对,反向 — src是被阻塞者 / src在下方 |
| 1 | 0 | 1 | 约束释放,src曾是阻塞者 / 当前无接触的合法放置方向 |
| 1 | 0 | 0 | 相同释放配对,反向 |
对称不变量: has_constraint 和 is_locked 在每个无序对上是对称的((i, j) 和 (j, i) 的值相同)。src_blocks_dst 在两个方向之间翻转。机器人 ↔ 任何物体的边始终为 [0, 0, 0]。
固定10维类型编码 — 创建方法
两个领域的组件类型全集为 13种类型(两个词汇表的并集):
cpu_fan, cpu_bracket, cpu, ram_clip, ram, connector, graphic_card, motherboard, ring_1, ring_2, ring_3, ring_4, robot
每种类型被分配一个固定的10维向量。该编码非训练所得 — 它是一个在加载时从YAML读取的确定性查找表,因此数据集的任何使用者都能获得完全相同的节点特征。提供了两种方法;两个YAML文件都位于数据集仓库根目录,与会话目录并列:
| 方法 | YAML文件 | 向量构建方式 | 语义结构 |
|---|---|---|---|
random |
config/type_encoding_random.yaml |
numpy.random.default_rng(42) 单位范数10维向量,每类型一个 |
无 — 向量是近似正交的噪声 |
clip |
config/type_encoding_clip.yaml |
CLIP ViT-B/32 文本嵌入(如 "a CPU fan", "a small red ring")→ PCA降维至10 → 单位归一化 |
相关类型聚类(四个圆环接近;风扇/支架/CPU聚类紧密) |
未知类型 → 10维零向量。如果组件的 type 不在YAML中,加载器为该槽返回 np.zeros(10, dtype=np.float32)。这确保了无论词汇表如何变化,节点维度都保持为270。




