Merge pull request #5 from abhihjoshi/cards
adding demo file and unnamed geom fix
This commit is contained in:
@@ -16,7 +16,7 @@ from typing import List, Optional, Tuple
|
|||||||
|
|
||||||
import mujoco
|
import mujoco
|
||||||
|
|
||||||
import mujoco.usd.utils
|
import mujoco.usd.utils as utils_component
|
||||||
import mujoco.usd.shapes as shapes_component
|
import mujoco.usd.shapes as shapes_component
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|||||||
@@ -1,20 +1,63 @@
|
|||||||
|
import argparse
|
||||||
|
from tqdm import tqdm
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import mujoco
|
import mujoco
|
||||||
from mujoco.usd import exporter
|
from mujoco.usd import exporter
|
||||||
|
|
||||||
if __name__ == "__main__":
|
def generate_usd_trajectory(args):
|
||||||
|
|
||||||
# load a model to mujoco
|
# load a model to mujoco
|
||||||
m = mujoco.MjModel.from_xml_path("/Users/abhishek/Documents/research/mujoco/test/engine/testdata/catenary.xml")
|
model_path = args.model_path
|
||||||
|
m = mujoco.MjModel.from_xml_path(model_path)
|
||||||
d = mujoco.MjData(m)
|
d = mujoco.MjData(m)
|
||||||
|
|
||||||
# create an instance of the USDExporter
|
# create an instance of the USDExporter
|
||||||
exp = exporter.USDExporter(model=m)
|
exp = exporter.USDExporter(model=m,
|
||||||
|
output_directory_name=Path(args.model_path).stem,
|
||||||
|
output_directory_root=args.output_directory_root,
|
||||||
|
camera_names=args.camera_names)
|
||||||
|
|
||||||
for i in range(100):
|
# step through the model for length steps
|
||||||
|
for i in tqdm(range(args.length)):
|
||||||
mujoco.mj_step(m, d)
|
mujoco.mj_step(m, d)
|
||||||
exp.update_scene(d)
|
exp.update_scene(d)
|
||||||
|
|
||||||
exp.save_scene(filetype="usd")
|
exp.save_scene(filetype=args.export_extension)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument('--model_path',
|
||||||
|
type=str,
|
||||||
|
required=True,
|
||||||
|
help='path to mjcf xml model')
|
||||||
|
|
||||||
|
parser.add_argument('--length',
|
||||||
|
type=int,
|
||||||
|
default=100,
|
||||||
|
help='length of trajectory to render')
|
||||||
|
|
||||||
|
parser.add_argument('--output_directory_root',
|
||||||
|
type=str,
|
||||||
|
default="../usd_trajectories/",
|
||||||
|
help='location where to create usd files')
|
||||||
|
|
||||||
|
parser.add_argument('--camera_names',
|
||||||
|
type=str,
|
||||||
|
nargs='+',
|
||||||
|
help='cameras to include in usd')
|
||||||
|
|
||||||
|
parser.add_argument('--export_extension',
|
||||||
|
type=str,
|
||||||
|
default="usd",
|
||||||
|
help='extension of exported file (can be usd, usda, or usdc)')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
generate_usd_trajectory(args)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ class USDExporter:
|
|||||||
UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z)
|
UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z)
|
||||||
self.stage.SetStartTimeCode(0)
|
self.stage.SetStartTimeCode(0)
|
||||||
# add as user input
|
# add as user input
|
||||||
self.stage.SetTimeCodesPerSecond(24.0)
|
self.stage.SetTimeCodesPerSecond(60.0)
|
||||||
|
|
||||||
default_prim = UsdGeom.Xform.Define(
|
default_prim = UsdGeom.Xform.Define(
|
||||||
self.stage, Sdf.Path("/World")
|
self.stage, Sdf.Path("/World")
|
||||||
@@ -232,9 +232,7 @@ class USDExporter:
|
|||||||
|
|
||||||
def _load_geom(self, geom: mujoco.MjvGeom):
|
def _load_geom(self, geom: mujoco.MjvGeom):
|
||||||
|
|
||||||
geom_name = mujoco.mj_id2name(self.model, geom.objtype, geom.objid)
|
geom_name = self._get_geom_name(geom.objtype, geom.objid)
|
||||||
if not geom_name:
|
|
||||||
geom_name = f"unnamed_geom{geom.objid}"
|
|
||||||
|
|
||||||
assert geom_name not in self.geom_name2usd
|
assert geom_name not in self.geom_name2usd
|
||||||
|
|
||||||
@@ -271,12 +269,17 @@ class USDExporter:
|
|||||||
|
|
||||||
geom_names = set(self.geom_name2usd.keys())
|
geom_names = set(self.geom_name2usd.keys())
|
||||||
|
|
||||||
# iterate through all geoms in the scene and makes update
|
|
||||||
for i in range(self.scene.ngeom):
|
for i in range(self.scene.ngeom):
|
||||||
geom = self.scene.geoms[i]
|
geom = self.scene.geoms[i]
|
||||||
geom_name = mujoco.mj_id2name(self.model, geom.objtype, geom.objid)
|
geom_name = mujoco.mj_id2name(self.model, geom.objtype, geom.objid)
|
||||||
if not geom_name:
|
if not geom_name:
|
||||||
geom_name = f"unnamed_geom{geom.objid}"
|
geom_name = "None"
|
||||||
|
geom_name += f"_{geom.objid}"
|
||||||
|
|
||||||
|
# iterate through all geoms in the scene and makes update
|
||||||
|
for i in range(self.scene.ngeom):
|
||||||
|
geom = self.scene.geoms[i]
|
||||||
|
geom_name = self._get_geom_name(geom.objtype, geom.objid)
|
||||||
|
|
||||||
if geom_name not in self.geom_name2usd:
|
if geom_name not in self.geom_name2usd:
|
||||||
self._load_geom(geom)
|
self._load_geom(geom)
|
||||||
@@ -394,9 +397,17 @@ class USDExporter:
|
|||||||
new_camera.update(cam_pos=np.array(pos), cam_mat=r.as_matrix(), frame=0)
|
new_camera.update(cam_pos=np.array(pos), cam_mat=r.as_matrix(), frame=0)
|
||||||
|
|
||||||
def save_scene(self, filetype: str = "usd"):
|
def save_scene(self, filetype: str = "usd"):
|
||||||
|
assert filetype in ["usd", "usda", "usdc"]
|
||||||
self.stage.SetEndTimeCode(self.frame_count)
|
self.stage.SetEndTimeCode(self.frame_count)
|
||||||
self.stage.Export(
|
self.stage.Export(
|
||||||
f"{self.output_directory_root}/{self.output_directory_name}/frames/frame_{self.frame_count}_.{filetype}"
|
f"{self.output_directory_root}/{self.output_directory_name}/frames/frame_{self.frame_count}_.{filetype}"
|
||||||
)
|
)
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
print(termcolor.colored(f"Writing frame_{self.frame_count}", "green"))
|
print(termcolor.colored(f"Completed writing frame_{self.frame_count}.{filetype}", "green"))
|
||||||
|
|
||||||
|
def _get_geom_name(self, objtype, objid):
|
||||||
|
geom_name = mujoco.mj_id2name(self.model, objtype, objid)
|
||||||
|
if not geom_name:
|
||||||
|
geom_name = "None"
|
||||||
|
geom_name += f"_{objid}"
|
||||||
|
return geom_name
|
||||||
|
|||||||
Reference in New Issue
Block a user