Skip to content

Commit

Permalink
Merge pull request #5 from abhihjoshi/cards
Browse files Browse the repository at this point in the history
adding demo file and unnamed geom fix
  • Loading branch information
abhihjoshi committed May 2, 2024
2 parents 13e1cfd + 7a1e2bf commit 00b73cc
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 13 deletions.
2 changes: 1 addition & 1 deletion python/mujoco/usd/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import mujoco

import mujoco.usd.utils
import mujoco.usd.utils as utils_component
import mujoco.usd.shapes as shapes_component

import numpy as np
Expand Down
53 changes: 48 additions & 5 deletions python/mujoco/usd/demo.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,63 @@
import argparse
from tqdm import tqdm
from pathlib import Path

import mujoco
from mujoco.usd import exporter

if __name__ == "__main__":
def generate_usd_trajectory(args):

# 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)

# 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)
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)




25 changes: 18 additions & 7 deletions python/mujoco/usd/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def _initialize_usd_stage(self):
UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z)
self.stage.SetStartTimeCode(0)
# add as user input
self.stage.SetTimeCodesPerSecond(24.0)
self.stage.SetTimeCodesPerSecond(60.0)

default_prim = UsdGeom.Xform.Define(
self.stage, Sdf.Path("/World")
Expand Down Expand Up @@ -232,9 +232,7 @@ def _load_textures(self):

def _load_geom(self, geom: mujoco.MjvGeom):

geom_name = mujoco.mj_id2name(self.model, geom.objtype, geom.objid)
if not geom_name:
geom_name = f"unnamed_geom{geom.objid}"
geom_name = self._get_geom_name(geom.objtype, geom.objid)

assert geom_name not in self.geom_name2usd

Expand Down Expand Up @@ -271,12 +269,17 @@ def _update_geoms(self):

geom_names = set(self.geom_name2usd.keys())

# iterate through all geoms in the scene and makes update
for i in range(self.scene.ngeom):
geom = self.scene.geoms[i]
geom_name = mujoco.mj_id2name(self.model, geom.objtype, geom.objid)
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:
self._load_geom(geom)
Expand Down Expand Up @@ -394,9 +397,17 @@ def add_camera(
new_camera.update(cam_pos=np.array(pos), cam_mat=r.as_matrix(), frame=0)

def save_scene(self, filetype: str = "usd"):
assert filetype in ["usd", "usda", "usdc"]
self.stage.SetEndTimeCode(self.frame_count)
self.stage.Export(
f"{self.output_directory_root}/{self.output_directory_name}/frames/frame_{self.frame_count}_.{filetype}"
)
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

0 comments on commit 00b73cc

Please sign in to comment.