mp_yam_code / scripts /robotwin_convert.py
yqi19's picture
YAM bimanual task suite: env, solvers, tasks, converters
7399b6f verified
Raw
History Blame Contribute Delete
2.37 kB
"""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)