Updating output file structure and adding compression functionality

This commit is contained in:
Abhishek Joshi
2023-11-07 18:04:40 -06:00
parent 35097a6afa
commit c37212138e
4 changed files with 74 additions and 28 deletions
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+7 -2
View File
@@ -21,6 +21,8 @@ def create_usd_geom_primitive(geom, stage, texture_file):
return USDCube(geom, stage, texture_file) return USDCube(geom, stage, texture_file)
elif geom_type==USDGeomType.Cube.value: elif geom_type==USDGeomType.Cube.value:
return USDCube(geom, stage, texture_file) return USDCube(geom, stage, texture_file)
else:
return None
class USDGeomType(Enum): class USDGeomType(Enum):
""" """
@@ -113,7 +115,9 @@ class USDGeom(object):
self.prim.GetDisplayColorAttr().Set(rgba) self.prim.GetDisplayColorAttr().Set(rgba)
def update_transparency(self, new_transparency): def update_transparency(self, new_transparency):
self.prim.GetDisplayOpacityAttr().Set(new_transparency) self.prim.GetDisplayOpacityAttr().Set([float(abs(new_transparency))])
if new_transparency < 0:
self.prim.MakeInvisible()
def __str__(self): def __str__(self):
return f'type = {self.type} \ngeom = {self.geom}' return f'type = {self.type} \ngeom = {self.geom}'
@@ -322,6 +326,7 @@ class USDMesh(USDGeom):
self.update_rotation(new_geom.mat) self.update_rotation(new_geom.mat)
if not self.texture_file: if not self.texture_file:
self.update_color(new_geom.rgba) self.update_color(new_geom.rgba)
self.update_transparency(new_geom.rgba[3])
class USDLight(object): class USDLight(object):
""" """
@@ -351,7 +356,7 @@ class USDLight(object):
if pos == (0, 0, 0): if pos == (0, 0, 0):
self.prim.GetIntensityAttr().Set(0); self.prim.GetIntensityAttr().Set(0);
else: else:
self.prim.GetIntensityAttr().Set(50000); self.prim.GetIntensityAttr().Set(20000);
# TODO attributes: # TODO attributes:
# - direction # - direction
+67 -26
View File
@@ -1,4 +1,6 @@
import os import os
import shutil
from termcolor import colored
import mujoco import mujoco
import mujoco.viewer as viewer import mujoco.viewer as viewer
from mujoco.usd_component import * from mujoco.usd_component import *
@@ -12,32 +14,32 @@ from PIL import ImageOps
class USDRenderer(object): class USDRenderer(object):
""" """
Renderer class the creates USD representations for mujoco scenes Renderer class that creates USD representations for mujoco scenes
""" """
def __init__(self, def __init__(self,
model, model,
height=480, height=480,
width=480, width=480,
geom_groups=[1,1,1,1,1,1], root_dir_name="usdpkg",
output_frame_dir="frame_tmp"): root_dir_path=None,
verbose=True):
self.model = model self.model = model
self.root_dir_name = root_dir_name
self.root_dir_path = root_dir_path
self.verbose = verbose
self.data = None self.data = None
self.renderer = mujoco.Renderer(model, height, width) self.renderer = mujoco.Renderer(model, height, width)
self.loaded_scene_info = False self.reload_scene_info = True
self.frame_count = 0 self.frame_count = 0
self.output_frame_dir = output_frame_dir
if not os.path.exists(self.output_frame_dir):
os.mkdir(self.output_frame_dir)
# Directory to store all image assets used by the usd scene self.create_output_directories()
if not os.path.exists("image_assets"):
os.mkdir("image_assets")
self.stage = Usd.Stage.CreateInMemory() self.stage = Usd.Stage.CreateInMemory()
UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z) UsdGeom.SetStageUpAxis(self.stage, UsdGeom.Tokens.z)
# TODO: maybe change where we initialize this? geom_groups = [0,1,0,0,0,0] # Setting default geom groups for now
self.scene_option = _structs.MjvOption() self.scene_option = _structs.MjvOption()
self.scene_option.geomgroup = geom_groups self.scene_option.geomgroup = geom_groups
@@ -49,21 +51,46 @@ class USDRenderer(object):
def scene(self): def scene(self):
return self.renderer.scene return self.renderer.scene
def create_output_directories(self):
if not self.root_dir_path:
self.root_dir_path = os.getcwd()
self.output_dir = os.path.join(self.root_dir_path, self.root_dir_name)
if not os.path.exists(self.output_dir):
os.makedirs(self.output_dir)
self.scenes_dir = os.path.join(self.output_dir, "scenes")
if not os.path.exists(self.scenes_dir):
os.makedirs(self.scenes_dir)
self.assets_dir = os.path.join(self.output_dir, "assets")
if not os.path.exists(self.assets_dir):
os.makedirs(self.assets_dir)
if self.verbose:
output_dir_msg = colored(f"Writing files to {self.output_dir}", "green")
print(output_dir_msg)
def save_scene(self): def save_scene(self):
output_file_path = os.path.join(self.output_frame_dir, f'frame_{self.frame_count}.usd') output_file_path = os.path.join(self.scenes_dir, f'frame_{self.frame_count}_.usd')
with open(output_file_path, "w") as f: with open(output_file_path, "w") as f:
f.write(self.usd) f.write(self.usd)
self.frame_count += 1 self.frame_count += 1
def update_geom_groups(self, geom_groups):
self.scene_option.geomgroup = geom_groups
self.reload_scene_info = True
self.update_scene(self.data)
def update_scene(self, data): def update_scene(self, data):
self.renderer.update_scene(data, scene_option=self.scene_option) self.renderer.update_scene(data, scene_option=self.scene_option)
self.data = data self.data = data
if not self.loaded_scene_info: if self.reload_scene_info:
# loads the initial geoms, lights, and camera information # loads the initial geoms, lights, and camera information
# from the scene # from the scene
self._load() self._load()
self.loaded_scene_info = True self.reload_scene_info = False
self._update() self._update()
@@ -72,9 +99,8 @@ class USDRenderer(object):
Loads and initializes the necessary objects to render the scene Loads and initializes the necessary objects to render the scene
""" """
# create and load the texture files # Create and loads the texture files to the assets directory
# iterate through all the textures and build list of tex_rgb ranges # TODO: remove code once added internally to mujoco
# TODO: remove once added to mujoco
data_adr = 0 data_adr = 0
texture_files = [] texture_files = []
for texid in range(self.model.ntex): for texid in range(self.model.ntex):
@@ -83,12 +109,16 @@ class USDRenderer(object):
pixels = 3*height*width pixels = 3*height*width
rgb = self.model.tex_rgb[data_adr:data_adr+pixels] rgb = self.model.tex_rgb[data_adr:data_adr+pixels]
img = rgb.reshape(height, width, 3) img = rgb.reshape(height, width, 3)
file_name = f'image_assets/{texid}.png' texture_file_name = f"texture_{texid}.png"
file_path = os.path.join(self.assets_dir, texture_file_name)
img = im.fromarray(img) img = im.fromarray(img)
img = ImageOps.flip(img) img = ImageOps.flip(img)
img.save(file_name) img.save(file_path)
texture_file = os.path.abspath(file_name)
texture_files.append(texture_file) relative_path = os.path.relpath(self.assets_dir, self.scenes_dir)
img_path = os.path.join(relative_path, texture_file_name)
texture_files.append(img_path)
data_adr += pixels data_adr += pixels
# initializes an array to store all the geoms in the scene # initializes an array to store all the geoms in the scene
@@ -105,10 +135,10 @@ class USDRenderer(object):
if geom.type == USDGeomType.Mesh.value: if geom.type == USDGeomType.Mesh.value:
self.usd_geoms.append(USDMesh(self.model.geom_dataid[geom.objid], self.usd_geoms.append(USDMesh(self.model.geom_dataid[geom.objid],
geom, geom,
self.stage, self.stage,
self.model, self.model,
texture_file)) texture_file))
else: else:
self.usd_geoms.append(create_usd_geom_primitive(geom, self.usd_geoms.append(create_usd_geom_primitive(geom,
self.stage, self.stage,
@@ -140,7 +170,7 @@ class USDRenderer(object):
""" """
geoms = self.scene.geoms geoms = self.scene.geoms
for i in range(self.ngeom): for i in range(self.ngeom):
if self.usd_geoms[i] != None: # TODO: remove this once all primitives are added if self.usd_geoms[i]: # TODO: remove this once all primitives are added
self.usd_geoms[i].update_geom(geoms[i]) self.usd_geoms[i].update_geom(geoms[i])
def _update_lights(self): def _update_lights(self):
@@ -160,6 +190,17 @@ class USDRenderer(object):
for i in range(ncam): for i in range(ncam):
self.usd_cameras[i].update_camera(self.model.cam_pos[i], self.model.cam_quat[i]) self.usd_cameras[i].update_camera(self.model.cam_pos[i], self.model.cam_quat[i])
def compress(self):
"""
Compresses the output directory to a zip file for easy transfer
"""
if self.verbose:
output_dir_msg = colored(f"Compressing files at {self.output_dir} and saving at {self.output_dir}", "green")
print(output_dir_msg)
shutil.make_archive(base_name=self.output_dir,
format='zip',
base_dir=self.root_dir_name)
def start_viewer(self): def start_viewer(self):
if self.data: if self.data:
viewer.launch(self.model) viewer.launch(self.model)