Spaces:
Runtime error
Runtime error
| # Copyright 2018 The TensorFlow Authors All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| # ============================================================================== | |
| """Wrapper for creating the ant environment in gym_mujoco.""" | |
| import math | |
| import numpy as np | |
| import mujoco_py | |
| from gym import utils | |
| from gym.envs.mujoco import mujoco_env | |
| class PointEnv(mujoco_env.MujocoEnv, utils.EzPickle): | |
| FILE = "point.xml" | |
| ORI_IND = 2 | |
| def __init__(self, file_path=None, expose_all_qpos=True): | |
| self._expose_all_qpos = expose_all_qpos | |
| mujoco_env.MujocoEnv.__init__(self, file_path, 1) | |
| utils.EzPickle.__init__(self) | |
| def physics(self): | |
| # check mujoco version is greater than version 1.50 to call correct physics | |
| # model containing PyMjData object for getting and setting position/velocity | |
| # check https://github.com/openai/mujoco-py/issues/80 for updates to api | |
| if mujoco_py.get_version() >= '1.50': | |
| return self.sim | |
| else: | |
| return self.model | |
| def _step(self, a): | |
| return self.step(a) | |
| def step(self, action): | |
| action[0] = 0.2 * action[0] | |
| qpos = np.copy(self.physics.data.qpos) | |
| qpos[2] += action[1] | |
| ori = qpos[2] | |
| # compute increment in each direction | |
| dx = math.cos(ori) * action[0] | |
| dy = math.sin(ori) * action[0] | |
| # ensure that the robot is within reasonable range | |
| qpos[0] = np.clip(qpos[0] + dx, -100, 100) | |
| qpos[1] = np.clip(qpos[1] + dy, -100, 100) | |
| qvel = self.physics.data.qvel | |
| self.set_state(qpos, qvel) | |
| for _ in range(0, self.frame_skip): | |
| self.physics.step() | |
| next_obs = self._get_obs() | |
| reward = 0 | |
| done = False | |
| info = {} | |
| return next_obs, reward, done, info | |
| def _get_obs(self): | |
| if self._expose_all_qpos: | |
| return np.concatenate([ | |
| self.physics.data.qpos.flat[:3], # Only point-relevant coords. | |
| self.physics.data.qvel.flat[:3]]) | |
| return np.concatenate([ | |
| self.physics.data.qpos.flat[2:3], | |
| self.physics.data.qvel.flat[:3]]) | |
| def reset_model(self): | |
| qpos = self.init_qpos + self.np_random.uniform( | |
| size=self.physics.model.nq, low=-.1, high=.1) | |
| qvel = self.init_qvel + self.np_random.randn(self.physics.model.nv) * .1 | |
| # Set everything other than point to original position and 0 velocity. | |
| qpos[3:] = self.init_qpos[3:] | |
| qvel[3:] = 0. | |
| self.set_state(qpos, qvel) | |
| return self._get_obs() | |
| def get_ori(self): | |
| return self.physics.data.qpos[self.__class__.ORI_IND] | |
| def set_xy(self, xy): | |
| qpos = np.copy(self.physics.data.qpos) | |
| qpos[0] = xy[0] | |
| qpos[1] = xy[1] | |
| qvel = self.physics.data.qvel | |