Beispiel #1
0
    def testMJCFFeature(self):
        mjcf_root = mjcf.from_xml_string(_MJCF)
        physics = mjcf.Physics.from_mjcf_model(mjcf_root)

        my_hinge = mjcf_root.find('joint', 'my_hinge')
        hinge_observable = mjcf_observable.MJCFFeature(kind='qpos',
                                                       mjcf_element=my_hinge)
        hinge_observation = hinge_observable.observation_callable(physics)()
        np.testing.assert_array_equal(
            hinge_observation,
            physics.named.data.qpos[my_hinge.full_identifier])

        small_sphere = mjcf_root.find('geom', 'small_sphere')
        box_observable = mjcf_observable.MJCFFeature(kind='xpos',
                                                     mjcf_element=small_sphere,
                                                     update_interval=5)
        box_observation = box_observable.observation_callable(physics)()
        self.assertEqual(box_observable.update_interval, 5)
        np.testing.assert_array_equal(
            box_observation,
            physics.named.data.geom_xpos[small_sphere.full_identifier])

        my_box = mjcf_root.find('geom', 'my_box')
        list_observable = mjcf_observable.MJCFFeature(
            kind='xpos', mjcf_element=[my_box, small_sphere])
        list_observation = (list_observable.observation_callable(physics)())
        np.testing.assert_array_equal(
            list_observation, physics.named.data.geom_xpos[[
                my_box.full_identifier, small_sphere.full_identifier
            ]])

        with self.assertRaisesRegexp(ValueError, 'expected an `mjcf.Element`'):
            mjcf_observable.MJCFFeature('qpos', 'my_hinge')
        with self.assertRaisesRegexp(ValueError, 'expected an `mjcf.Element`'):
            mjcf_observable.MJCFFeature('geom_xpos', [my_box, 'small_sphere'])
Beispiel #2
0
  def testMJCFCamera(self):
    mjcf_root = mjcf.from_xml_string(_MJCF)
    physics = mjcf.Physics.from_mjcf_model(mjcf_root)

    camera = mjcf_root.find('camera', 'world')
    camera_observable = mjcf_observable.MJCFCamera(
        mjcf_element=camera, height=480, width=640, update_interval=7)
    self.assertEqual(camera_observable.update_interval, 7)
    camera_observation = camera_observable.observation_callable(physics)()
    np.testing.assert_array_equal(
        camera_observation, physics.render(480, 640, 'world'))
    self.assertEqual(camera_observation.shape,
                     camera_observable.array_spec.shape)
    self.assertEqual(camera_observation.dtype,
                     camera_observable.array_spec.dtype)

    camera_observable.height = 300
    camera_observable.width = 400
    camera_observation = camera_observable.observation_callable(physics)()
    self.assertEqual(camera_observable.height, 300)
    self.assertEqual(camera_observable.width, 400)
    np.testing.assert_array_equal(
        camera_observation, physics.render(300, 400, 'world'))
    self.assertEqual(camera_observation.shape,
                     camera_observable.array_spec.shape)
    self.assertEqual(camera_observation.dtype,
                     camera_observable.array_spec.dtype)

    with six.assertRaisesRegex(self, ValueError, 'expected an `mjcf.Element`'):
      mjcf_observable.MJCFCamera('world')
    with six.assertRaisesRegex(self, ValueError, 'expected an `mjcf.Element`'):
      mjcf_observable.MJCFCamera([camera])
    with six.assertRaisesRegex(self, ValueError, 'expected a <camera>'):
      mjcf_observable.MJCFCamera(mjcf_root.find('body', 'body'))
Beispiel #3
0
 def testErrorIfSegmentationAndDepthBothEnabled(self):
     camera = mjcf.from_xml_string(_MJCF).find('camera', 'world')
     with self.assertRaisesWithLiteralMatch(
             ValueError,
             mjcf_observable._BOTH_SEGMENTATION_AND_DEPTH_ENABLED):
         mjcf_observable.MJCFCamera(mjcf_element=camera,
                                    segmentation=True,
                                    depth=True)
Beispiel #4
0
 def testMJCFSegCamera(self):
   mjcf_root = mjcf.from_xml_string(_MJCF)
   physics = mjcf.Physics.from_mjcf_model(mjcf_root)
   camera = mjcf_root.find('camera', 'world')
   camera_observable = mjcf_observable.MJCFCamera(
       mjcf_element=camera, height=480, width=640, update_interval=7,
       segmentation=True)
   self.assertEqual(camera_observable.update_interval, 7)
   camera_observation = camera_observable.observation_callable(physics)()
   np.testing.assert_array_equal(
       camera_observation,
       physics.render(480, 640, 'world', segmentation=True))
   camera_observable.array_spec.validate(camera_observation)
Beispiel #5
0
  def testMJCFFeatureIndex(self):
    mjcf_root = mjcf.from_xml_string(_MJCF)
    physics = mjcf.Physics.from_mjcf_model(mjcf_root)

    small_sphere = mjcf_root.find('geom', 'small_sphere')
    sphere_xmat = np.array(
        physics.named.data.geom_xmat[small_sphere.full_identifier])

    observable_xrow = mjcf_observable.MJCFFeature(
        'xmat', small_sphere, index=[1, 3, 5, 7])
    np.testing.assert_array_equal(
        observable_xrow.observation_callable(physics)(),
        sphere_xmat[[1, 3, 5, 7]])

    observable_yyzz = mjcf_observable.MJCFFeature('xmat', small_sphere)[2:6]
    np.testing.assert_array_equal(
        observable_yyzz.observation_callable(physics)(), sphere_xmat[2:6])
Beispiel #6
0
 def testMJCFCameraSpecs(self, camera_type, channels, dtype, minimum,
                         maximum):
     width = 640
     height = 480
     shape = (height, width, channels)
     expected_spec = specs.BoundedArray(shape=shape,
                                        dtype=dtype,
                                        minimum=minimum,
                                        maximum=maximum)
     mjcf_root = mjcf.from_xml_string(_MJCF)
     camera = mjcf_root.find('camera', 'world')
     observable_kwargs = {} if camera_type == 'rgb' else {camera_type: True}
     camera_observable = mjcf_observable.MJCFCamera(mjcf_element=camera,
                                                    height=height,
                                                    width=width,
                                                    update_interval=7,
                                                    **observable_kwargs)
     self.assertEqual(camera_observable.array_spec, expected_spec)
Beispiel #7
0
    def _build(self,
               name='walker',
               marker_rgba=None,
               camera_control=False,
               roll_gear=-60,
               steer_gear=55,
               walker_id=None,
               initializer=None):
        """Build a BoxHead.

    Args:
      name: name of the walker.
      marker_rgba: RGBA value set to walker.marker_geoms to distinguish between
        walkers (in multi-agent setting).
      camera_control: If `True`, the walker exposes two additional actuated
        degrees of freedom to control the egocentric camera height and tilt.
      roll_gear: gear determining forward acceleration.
      steer_gear: gear determining steering (spinning) torque.
      walker_id: (Optional) An integer in [0-10], this number will be shown on
        the walker's head. Defaults to `None` which does not show any number.
      initializer: (Optional) A `WalkerInitializer` object.

    Raises:
      ValueError: if received invalid walker_id.
    """
        super(BoxHead, self)._build(initializer=initializer)
        xml_path = os.path.join(_ASSETS_PATH, 'boxhead.xml')
        self._mjcf_root = mjcf.from_xml_string(
            resources.GetResource(xml_path, 'r'))
        if name:
            self._mjcf_root.model = name

        if walker_id is not None and not 0 <= walker_id <= _MAX_WALKER_ID:
            raise ValueError(_INVALID_WALKER_ID.format(walker_id))

        self._walker_id = walker_id
        if walker_id is not None:
            png_bytes = _asset_png_with_background_rgba_bytes(
                'digits/%02d.png' % walker_id, marker_rgba)
            head_texture = self._mjcf_root.asset.add('texture',
                                                     name='head_texture',
                                                     type='2d',
                                                     file=mjcf.Asset(
                                                         png_bytes, '.png'))
            head_material = self._mjcf_root.asset.add('material',
                                                      name='head_material',
                                                      texture=head_texture)
            self._mjcf_root.find('geom', 'head').material = head_material
            self._mjcf_root.find('geom', 'head').rgba = None

            self._mjcf_root.find('geom',
                                 'top_down_cam_box').material = head_material
            self._mjcf_root.find('geom', 'top_down_cam_box').rgba = None

        self._body_texture = self._mjcf_root.asset.add(
            'texture',
            name='ball_body',
            type='cube',
            builtin='checker',
            rgb1=marker_rgba[:-1] if marker_rgba else '.4 .4 .4',
            rgb2='.8 .8 .8',
            width='100',
            height='100')
        self._body_material = self._mjcf_root.asset.add(
            'material', name='ball_body', texture=self._body_texture)
        self._mjcf_root.find('geom', 'shell').material = self._body_material

        # Set corresponding marker color if specified.
        if marker_rgba is not None:
            for geom in self.marker_geoms:
                geom.set_attributes(rgba=marker_rgba)

        self._root_joints = None
        self._camera_control = camera_control
        if not camera_control:
            for name in ('camera_pitch', 'camera_yaw'):
                self._mjcf_root.find('actuator', name).remove()
                self._mjcf_root.find('joint', name).remove()
        self._roll_gear = roll_gear
        self._steer_gear = steer_gear
        self._mjcf_root.find('actuator', 'roll').gear[0] = self._roll_gear
        self._mjcf_root.find('actuator', 'steer').gear[0] = self._steer_gear

        # Initialize previous action.
        self._prev_action = np.zeros(shape=self.action_spec.shape,
                                     dtype=self.action_spec.dtype)