# ----------------------------------------------------------------------------
# Copyright (c) 2021-2026 DexForce Technology Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ----------------------------------------------------------------------------
from __future__ import annotations
import os
import open3d as o3d
from embodichain.data.dataset import EmbodiChainDataset
from embodichain.data.constants import (
EMBODICHAIN_DOWNLOAD_PREFIX,
EMBODICHAIN_DEFAULT_DATA_ROOT,
)
__all__ = [
"ShopTableSimple",
"CircleTableSimple",
"PlasticBin",
"Chair",
"ContainerMetal",
"SimpleBoxDrawer",
"AdrianoTable",
"CoffeeCup",
"SlidingBoxDrawer",
"AluminumTable",
"ToyDuck",
"PaperCup",
"ChainRainSec",
"TableWare",
"ScannedBottle",
"SugarBox",
"SodaCan",
"MicrowaveOven",
"Microwave",
"PlasticTray",
"WaterBasin",
"Drawer",
"Cow",
"BakeTextureObj",
"DrawerUSD",
"PourWaterAssets",
]
obj_assets = "obj_assets"
[docs]
class ShopTableSimple(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(
EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "shop_table_simple.zip"
),
"e3061ee024de7840f773b70140dcd43f",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class CircleTableSimple(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(
EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "circle_table_simple.zip"
),
"42ad2be8cd0caddcf9bfbf106b7783f3",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class PlasticBin(o3d.data.DownloadDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "plastic_bin.zip"),
"21e00083689a4a3c4e4ae3fd89c61e55",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class Chair(o3d.data.DownloadDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "chair.zip"),
"2a971a92e0956e72f262308a1054dc73",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class SimpleBoxDrawer(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(
EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "simple_box_drawer.zip"
),
"966b648bca16823ee91525847c183973",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class AdrianoTable(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "adriano_table.zip"),
"8453583a9a1a9d04d50268f8a3da554f",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class CoffeeCup(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "CoffeeCup.zip"),
"f05fce385826414c15e19df3b75dc886",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class SlidingBoxDrawer(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(
EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "SlidingBoxDrawer.zip"
),
"b03d9006503d27b75ddeb06d31b2c7a5",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class AluminumTable(o3d.data.DownloadDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "AluminumTable.glb"),
"02991d36ca9b70f019ed330a61143aa9",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class ToyDuck(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "ToyDuck.zip"),
"2f5c00ba487edf34ad668f7257c0264e",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class PaperCup(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "PaperCup.zip"),
"359d13af8c5f31ad3226d8994a1a7198",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class ChainRainSec(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "lianguijie.zip"),
"2387589040a4d3f2676b622362452242",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class TableWare(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "tableware.zip"),
"403e340fc0e4996c002ee774f89cd236",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class ScannedBottle(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "ScannedBottle.zip"),
"d2b2d4deb7b463a734af099f7624b4af",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class SugarBox(EmbodiChainDataset):
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "sugar_box_usd.zip"),
"a1bc5075512cedecd08af4f9c3e8f636",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class SodaCan(EmbodiChainDataset):
"""get_data_path("SodaCan/simple_cola_can.obj")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "ColaCan.zip"),
"24e0bc165dac129a8c2f287ce85b644a",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class MicrowaveOven(EmbodiChainDataset):
"""get_data_path("MicrowaveOven/microwave_oven.urdf")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "MicrowaveOven.zip"),
"5672da2d5a888a12469d6277636646b0",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class Microwave(EmbodiChainDataset):
"""get_data_path("Microwave/microwave.urdf")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "Microwave.zip"),
"9a5de27af5632ab6f5082b383c86acb4",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class PlasticTray(EmbodiChainDataset):
"""get_data_path("PlasticTray/plastic_tray.glb")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "PlasticTray.zip"),
"66f1f8a507052f9e33be5433fa2a2667",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class WaterBasin(EmbodiChainDataset):
"""get_data_path("WaterBasin/water_basin.glb")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "WaterBasin.zip"),
"9ae41630f6f52dccd7b95ab21b6ba989",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class Drawer(EmbodiChainDataset):
"""get_data_path("Drawer/model_split_links_with_inertials.urdf")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "Drawer.zip"),
"3981636db1f4188146fce25d54084612",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class Cow(EmbodiChainDataset):
"""get_data_path("COW/cow.obj")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "Cow.zip"),
"f93d371574187fdb74b26e9270ca52ff",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class BakeTextureObj(EmbodiChainDataset):
"""get_data_path("BakeTextureObj/hdr_color_mesh.ply")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "BakeTextureObj.zip"),
"4f10d5ce1f4cd051a2dfb1c19445d5a9",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class DrawerUSD(EmbodiChainDataset):
"""get_data_path("DrawerUSD/drawer_001.usdc")"""
[docs]
def __init__(self, data_root: str = None):
data_descriptor = o3d.data.DataDescriptor(
os.path.join(EMBODICHAIN_DOWNLOAD_PREFIX, obj_assets, "DrawerUSD.zip"),
"47ca77e3e87e7c891606a7cb56b44ea0",
)
prefix = type(self).__name__
path = EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root
super().__init__(prefix, data_descriptor, path)
[docs]
class PourWaterAssets(EmbodiChainDataset):
"""Open-neck bottle, cup and tabletop bundle used by PourWater.
The archive retains upstream sources, attribution, licenses and a SHA-256
manifest. Model files live at its root, for example
``get_data_path("PourWaterAssets/bottle.glb")``.
Args:
data_root: Optional cache root; defaults to ``EMBODICHAIN_DATA_ROOT``.
"""
[docs]
def __init__(self, data_root: str | None = None) -> None:
filename = f"{obj_assets}/PourWaterAssets.zip"
hub_prefix = (
"https://huggingface.co/datasets/DexForceAI/embodichain_data/resolve/main/"
)
urls = [f"{EMBODICHAIN_DOWNLOAD_PREFIX}{filename}"]
# Newly uploaded assets can precede mirror synchronization.
if EMBODICHAIN_DOWNLOAD_PREFIX != hub_prefix:
urls.append(f"{hub_prefix}{filename}")
descriptor = o3d.data.DataDescriptor(urls, "7267053763ed8e1b84f3da3e49d39f01")
super().__init__(
type(self).__name__,
descriptor,
EMBODICHAIN_DEFAULT_DATA_ROOT if data_root is None else data_root,
)