File size: 2,373 Bytes
7399b6f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | """Convert selected RobotWin (MIT) GLB objects to USD so they can be spawned in the YAM Isaac Lab env."""
import argparse, sys, os, json
from isaaclab.app import AppLauncher
p=argparse.ArgumentParser()
p.add_argument("--jobs", default="021_cup:base0,002_bowl:base0,001_bottle:base0,008_tray:base0")
# Containers (basket / bin / rack) must keep their concave cavity: a convex decomposition fills
# the inside, so objects land ON the container and roll off. Static containers can use the raw
# triangle mesh ("none"); dynamic graspable objects still need convexDecomposition.
p.add_argument("--collision", default="convexDecomposition",
choices=["convexDecomposition","convexHull","meshSimplification","boundingCube","none"])
p.add_argument("--suffix", default="", help="append to the usd filename, e.g. _mesh for a mesh-collision variant")
AppLauncher.add_app_launcher_args(p); a=p.parse_args(); a.headless=True
app=AppLauncher(a).app
from isaaclab.sim.converters import MeshConverter, MeshConverterCfg
import isaaclab.sim as sim_utils
SRC=os.environ.get("ROBOTWIN_SRC", "/home/horde/xiaotong/robotwin_assets/objects")
OUT=os.environ.get("ROBOTWIN_USD", "/home/horde/xiaotong/robotwin_assets/usd")
os.makedirs(OUT, exist_ok=True)
for job in a.jobs.split(","):
cat,inst=job.split(":")
glb=f"{SRC}/{cat}/visual/{inst}.glb"
if not os.path.exists(glb): print("[conv] MISSING", glb, flush=True); continue
# scale from model_data (index = instance number)
scale=None
mdi=f"{SRC}/{cat}/model_data{inst.replace('base','')}.json"
if os.path.exists(mdi):
try: scale=json.load(open(mdi)).get("scale")
except Exception: pass
cfg=MeshConverterCfg(
asset_path=glb, usd_dir=f"{OUT}/{cat}", usd_file_name=f"{inst}{a.suffix}.usd",
force_usd_conversion=True, make_instanceable=False,
rigid_props=sim_utils.RigidBodyPropertiesCfg(), # bake RigidBodyAPI into the USD
mass_props=sim_utils.MassPropertiesCfg(mass=0.10),
collision_props=sim_utils.CollisionPropertiesCfg(),
collision_approximation=a.collision,
)
try:
conv=MeshConverter(cfg)
print(f"[conv] OK {cat}:{inst} scale={scale} -> {conv.usd_path}", flush=True)
except Exception as e:
print(f"[conv] FAIL {cat}:{inst}: {e}", flush=True)
app.close(); print("CONVERT_DONE", flush=True)
|