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'])
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'))
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)
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)
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])
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)
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)