示例#1
0
    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),
        )
示例#2
0
  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),)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
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
示例#6
0
  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),)
示例#7
0
    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),
        )
示例#8
0
    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])