mujoco_worldgen/objs/floor.py (42 lines of code) (raw):

from mujoco_worldgen.util.types import store_args from mujoco_worldgen.objs.obj import Obj import numpy as np from collections import OrderedDict class Floor(Obj): ''' Floor() is essentially a special box geom used as the base of experiments. It has no joints, so is essentially an immovable object. Placement is calculated in a fixed position, and encoded in XML, as opposed to in qpos, which other objects use. ''' @store_args def __init__(self, geom_type='plane'): super(Floor, self).__init__() def generate(self, random_state, world_params, placement_size): top = OrderedDict(origin=(0, 0, 0), size=placement_size) self.placements = OrderedDict(top=top) self.size = np.array([placement_size[0], placement_size[1], 0.0]) def generate_xml_dict(self): # Last argument in size is visual mesh resolution (it's not height). # keep it high if you want rendering to be fast. pos = self.absolute_position pos[0] += self.size[0] / 2.0 pos[1] += self.size[1] / 2.0 geom = OrderedDict() geom['@name'] = self.name geom['@pos'] = pos if self.geom_type == 'box': geom['@size'] = np.array([self.size[0] / 2.0, self.size[1] / 2.0, 0.000001]) geom['@type'] = 'box' elif self.geom_type == 'plane': geom['@size'] = np.array([self.size[0] / 2.0, self.size[1] / 2.0, 1.0]) geom['@type'] = 'plane' else: raise ValueError("Invalid geom_type: " + self.geom_type) geom['@condim'] = 3 geom['@name'] = self.name # body is necessary to place sites. body = OrderedDict() body["@name"] = self.name body["@pos"] = pos worldbody = OrderedDict([("geom", [geom]), ("body", [body])]) xml_dict = OrderedDict(worldbody=worldbody) return xml_dict