def _reload_from_data(self, data): """Initializes a new or existing `Physics` instance from a `wrapper.MjData`. Assigns all attributes, sets up named indexing, and creates rendering contexts if rendering is enabled. The default constructor as well as the other `reload_from` methods should delegate to this method. Args: data: Instance of `wrapper.MjData`. """ self._data = data self._make_rendering_contexts() # Call kinematics update to enable rendering. try: self.after_reset() except _control.PhysicsError as e: logging.warning(e) # Set up named indexing. axis_indexers = index.make_axis_indexers(self.model) self._named = NamedIndexStructs( model=index.struct_indexer(self.model, 'mjmodel', axis_indexers), data=index.struct_indexer(self.data, 'mjdata', axis_indexers), )
def _iter_indexers(model, data): size_to_axis_indexer = index.make_axis_indexers(model) for struct, struct_name in ((model, 'mjmodel'), (data, 'mjdata')): indexer = index.struct_indexer(struct, struct_name, size_to_axis_indexer) for field_name, field_indexer in six.iteritems(indexer._asdict()): yield field_name, field_indexer
def _reload_from_data(self, data): """Initializes a new or existing `Physics` instance from a `wrapper.MjData`. Assigns all attributes, sets up named indexing, and creates rendering contexts if rendering is enabled. The default constructor as well as the other `reload_from` methods should delegate to this method. Args: data: Instance of `wrapper.MjData`. """ self._data = data # Performance optimization: pre-allocate numpy arrays used when checking for # MuJoCo warnings on each step. self._warnings = self.data.warning.number self._warnings_before = np.empty_like(self._warnings) self._new_warnings = np.empty(dtype=bool, shape=self._warnings.shape) self._make_rendering_contexts() # Call kinematics update to enable rendering. try: self.after_reset() except _control.PhysicsError as e: logging.warning(e) # Set up named indexing. axis_indexers = index.make_axis_indexers(self.model) self._named = NamedIndexStructs( model=index.struct_indexer(self.model, 'mjmodel', axis_indexers), data=index.struct_indexer(self.data, 'mjdata', axis_indexers),)
def testBuildIndexersForEdgeCases(self, xml_string): model = wrapper.MjModel.from_xml_string(xml_string) data = wrapper.MjData(model) size_to_axis_indexer = index.make_axis_indexers(model) index.struct_indexer(model, 'mjmodel', size_to_axis_indexer) index.struct_indexer(data, 'mjdata', size_to_axis_indexer)
def setUp(self): self._model = wrapper.MjModel.from_xml_string(MODEL) self._data = wrapper.MjData(self._model) self._size_to_axis_indexer = index.make_axis_indexers(self._model) self._model_indexers = index.struct_indexer(self._model, 'mjmodel', self._size_to_axis_indexer) self._data_indexers = index.struct_indexer(self._data, 'mjdata', self._size_to_axis_indexer)
def testIndexThirdOrderActuators(self, field_name, key, numeric_key): model = wrapper.MjModel.from_xml_string(MODEL_3RD_ORDER_ACTUATORS) data = wrapper.MjData(model) size_to_axis_indexer = index.make_axis_indexers(model) data_indexers = index.struct_indexer(data, 'mjdata', size_to_axis_indexer) indexer = getattr(data_indexers, field_name) field = getattr(data, field_name) # Explicit check that the converted key matches the numeric key. converted_key = indexer._convert_key(key) self.assertIndexExpressionEqual(numeric_key, converted_key) # This writes unique values to the underlying buffer to prevent false # negatives. field.flat[:] = np.arange(field.size) # Check that the result of named indexing matches the result of numeric # indexing. np.testing.assert_array_equal(field[numeric_key], indexer[key])
def _reload_from_data(self, data): """Initializes a new or existing `Physics` instance from a `wrapper.MjData`. Assigns all attributes, sets up named indexing, and creates rendering contexts if rendering is enabled. The default constructor as well as the other `reload_from` methods should delegate to this method. Args: data: Instance of `wrapper.MjData`. """ self._data = data # Performance optimization: pre-allocate numpy arrays used when checking for # MuJoCo warnings on each step. self._warnings = self.data.warning.number self._warnings_before = np.empty_like(self._warnings) self._new_warnings = np.empty(dtype=bool, shape=self._warnings.shape) # Forcibly free any previous GL context in order to avoid problems with GL # implementations that do not support multiple contexts on a given device. with self._contexts_lock: if self._contexts: self._free_rendering_contexts() # MJH: Disabled this as it changes physics state. # Call kinematics update to enable rendering. # try: # self.after_reset() # except _control.PhysicsError as e: # logging.warning(e) # Set up named indexing. axis_indexers = index.make_axis_indexers(self.model) self._named = NamedIndexStructs( model=index.struct_indexer(self.model, 'mjmodel', axis_indexers), data=index.struct_indexer(self.data, 'mjdata', axis_indexers),)
def _reload_from_data(self, data): """Initializes a new or existing `Physics` instance from a `wrapper.MjData`. Assigns all attributes and sets up rendering contexts and named indexing. The default constructor as well as the other `reload_from` methods should delegate to this method. Args: data: Instance of `wrapper.MjData`. """ self._data = data # Forcibly clear the previous context to avoid problems with GL # implementations which do not support multiple contexts on a given device. if hasattr(self, '_contexts'): self._contexts.gl.free_context() # Set up rendering context. Need to provide at least one rendering api in # the BUILD target. render_context = render.Renderer(_MAX_WIDTH, _MAX_HEIGHT) mujoco_context = wrapper.MjrContext() with render_context.make_current(_MAX_WIDTH, _MAX_HEIGHT): mjlib.mjr_makeContext(self.model.ptr, mujoco_context.ptr, _FONT_SCALE) mjlib.mjr_setBuffer(enums.mjtFramebuffer.mjFB_OFFSCREEN, mujoco_context.ptr) self._contexts = Contexts(gl=render_context, mujoco=mujoco_context) # Call kinematics update to enable rendering. self.after_reset() # Set up named indexing. axis_indexers = index.make_axis_indexers(self.model) self._named = NamedIndexStructs( model=index.struct_indexer(self.model, 'mjmodel', axis_indexers), data=index.struct_indexer(self.data, 'mjdata', axis_indexers), )