Skip to content

Commit

Permalink
Merge pull request #137 from vikashplus/dev
Browse files Browse the repository at this point in the history
V0.7.0: Gymnasium Upgrade. Multiple teleOP controllers. MuJoCo upgrade
  • Loading branch information
vittorione94 committed Mar 26, 2024
2 parents ef6f2c3 + 5160e49 commit 6c14798
Show file tree
Hide file tree
Showing 88 changed files with 1,413 additions and 347 deletions.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@ License :: Under Apache License, Version 2.0 (the "License"); you may not use th

<!-- # RoboHive -->

![PyPI](https://img.shields.io/pypi/v/robohive)
[![report](https://img.shields.io/badge/Project-Page-blue)](https://sites.google.com/view/robohive/)
[![report](https://img.shields.io/badge/ArXiv-Paper-green)](https://arxiv.org/abs/2310.06828)
[![Documentation](https://img.shields.io/static/v1?label=Wiki&message=Documentation&color=<green)](https://github.com/vikashplus/robohive/wiki) ![PyPI](https://img.shields.io/pypi/v/robohive)
![PyPI - License](https://img.shields.io/pypi/l/robohive)
[![Downloads](https://pepy.tech/badge/robohive)](https://pepy.tech/project/robohive)
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1rdSgnsfUaE-eFLjAkFHeqfUWzAK8ruTs?usp=sharing)
[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://robohiveworkspace.slack.com)
[![Documentation](https://img.shields.io/static/v1?label=Wiki&message=Documentation&color=<green)](https://github.com/vikashplus/robohive/wiki)

![RoboHive Social Preview](https://github.com/vikashplus/robohive/assets/12837145/04aff6da-f9fa-4f5f-abc6-cfcd70c6cd90)
`RoboHive` is a collection of environments/tasks simulated with the [MuJoCo](http://www.mujoco.org/) physics engine exposed using the OpenAI-Gym API.
`RoboHive` is a collection of environments/tasks simulated with the [MuJoCo](http://www.mujoco.org/) physics engine exposed using the OpenAI-Gym API. Its compatible with any gym-compatible agents training framework ([Stable Baselines](https://stable-baselines3.readthedocs.io/en/master), [RLlib](https://docs.ray.io/en/latest/rllib/index.html), [TorchRL](https://pytorch.org/rl/), [AgentHive](https://sites.google.com/view/robohive/baseline), etc)

# Getting Started
Getting started with RoboHive is as simple as -
Expand Down
42 changes: 29 additions & 13 deletions robohive/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,72 +7,88 @@


# RoboHive version
__version__ = "0.6.0"
__version__ = "0.7.0"


# Check for RoboHive initialization
from robohive.utils.import_utils import simhive_isavailable

simhive_isavailable(robohive_version = __version__)


# Register RoboHive Envs
import gym
_current_gym_envs = gym.envs.registration.registry.env_specs.keys()
_current_gym_envs = set(_current_gym_envs)
from robohive.utils import gym
from robohive.utils.implement_for import implement_for


#TODO: check versions
@implement_for("gym", None, "0.24")
def gym_registry_specs():
return gym.envs.registry.env_specs

@implement_for("gym", "0.24", None)
def gym_registry_specs():
return gym.envs.registry

@implement_for("gymnasium")
def gym_registry_specs():
return gym.envs.registry

_current_gym_envs = set(gym_registry_specs().keys())
robohive_env_suite = set()

# Register Arms Suite
import robohive.envs.arms # noqa
robohive_arm_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_arm_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_arm_suite = set(sorted(robohive_arm_suite))
robohive_env_suite = robohive_env_suite | robohive_arm_suite

# Register MyoBase Suite
import robohive.envs.myo.myobase # noqa
robohive_myobase_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_myobase_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_myobase_suite
robohive_myobase_suite = sorted(robohive_myobase_suite)

# Register MyoChal Suite
import robohive.envs.myo.myochallenge # noqa
robohive_myochal_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_myochal_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_myochal_suite
robohive_myochal_suite = sorted(robohive_myochal_suite)

# Register MyoDM Suite
import robohive.envs.myo.myodm # noqa
robohive_myodm_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_myodm_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_myodm_suite
robohive_myodm_suite = sorted(robohive_myodm_suite)

# Register FM suite
import robohive.envs.fm # noqa
robohive_fm_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_fm_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_fm_suite
robohive_fm_suite = sorted(robohive_fm_suite)

# Register Hands Suite
import robohive.envs.hands # noqa
# import robohive.envs.tcdm # noqa # WIP
robohive_hand_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_hand_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_hand_suite
robohive_hand_suite = sorted(robohive_hand_suite)

# Register Claw suite
import robohive.envs.claws # noqa
robohive_claw_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_claw_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_claw_suite
robohive_claw_suite = sorted(robohive_claw_suite)

# Register Multi-task Suite
import robohive.envs.multi_task # noqa
robohive_multitask_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_multitask_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_multitask_suite
robohive_multitask_suite = sorted(robohive_multitask_suite)

# Register Locomotion Suite
import robohive.envs.quadrupeds # noqa
robohive_quad_suite = set(gym.envs.registration.registry.env_specs.keys())-robohive_env_suite-_current_gym_envs
robohive_quad_suite = set(gym_registry_specs().keys())-robohive_env_suite-_current_gym_envs
robohive_env_suite = robohive_env_suite | robohive_quad_suite
robohive_quad_suite = sorted(robohive_quad_suite)

Expand Down
4 changes: 3 additions & 1 deletion robohive/envs/arms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
License :: Under 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.
================================================= """

from gym.envs.registration import register
# from gym.envs.registration import register
from robohive.utils import gym; register=gym.register

from robohive.envs.env_variants import register_env_variant
import os
curr_dir = os.path.dirname(os.path.abspath(__file__))
Expand Down
4 changes: 4 additions & 0 deletions robohive/envs/arms/fetch/assets/fetch_reach_v0.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@

</worldbody>

<keyframe>
<key name="pick_pose" qpos='-0.000445298 0 0.4334 0.0803 -0.906015 -0.0314 0.87789 0 1.62 0 0.0315 0.0315'/>
</keyframe>

</mujoco>
18 changes: 13 additions & 5 deletions robohive/envs/arms/pick_place_v0.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
================================================= """

import collections
import gym

import numpy as np

from robohive.envs import env_base
from robohive.utils import gym
from robohive.utils.quat_math import euler2quat


class PickPlaceV0(env_base.MujocoEnv):

DEFAULT_OBS_KEYS = [
Expand Down Expand Up @@ -70,6 +72,12 @@ def _setup(self,
self.randomize = randomize
self.geom_sizes = geom_sizes

# Save body init pos
self.init_body_pos = {}
for body in ["obj0", "obj1", "obj2"]:
bid = self.sim.model.body_name2id(body)
self.init_body_pos[body] = self.sim.model.body_pos[bid].copy()

super()._setup(obs_keys=obs_keys,
weighted_reward_keys=weighted_reward_keys,
reward_mode=reward_mode,
Expand Down Expand Up @@ -109,7 +117,7 @@ def get_reward_dict(self, obs_dict):
rwd_dict['dense'] = np.sum([wt*rwd_dict[key] for key, wt in self.rwd_keys_wt.items()], axis=0)
return rwd_dict

def reset(self):
def reset(self, **kwargs):

if self.randomize:
# target location
Expand All @@ -119,19 +127,19 @@ def reset(self):
# object shapes and locations
for body in ["obj0", "obj1", "obj2"]:
bid = self.sim.model.body_name2id(body)
self.sim.model.body_pos[bid] += self.np_random.uniform(low=[-.010, -.010, -.010], high=[-.010, -.010, -.010])# random pos
self.sim.model.body_pos[bid] = self.init_body_pos[body] + self.np_random.uniform(low=[-.010, -.010, -.010], high=[-.010, -.010, -.010])# random pos
self.sim.model.body_quat[bid] = euler2quat(self.np_random.uniform(low=(-np.pi/2, -np.pi/2, -np.pi/2), high=(np.pi/2, np.pi/2, np.pi/2)) ) # random quat

for gid in range(self.sim.model.body_geomnum[bid]):
gid+=self.sim.model.body_geomadr[bid]
self.sim.model.geom_type[gid]=self.np_random.randint(low=2, high=7) # random shape
self.sim.model.geom_type[gid]=self.np_random.choice([2,3,4,5,6]) # random shape
self.sim.model.geom_size[gid]=self.np_random.uniform(low=self.geom_sizes['low'], high=self.geom_sizes['high']) # random size
self.sim.model.geom_pos[gid]=self.np_random.uniform(low=-1*self.sim.model.geom_size[gid], high=self.sim.model.geom_size[gid]) # random pos
self.sim.model.geom_quat[gid]=euler2quat(self.np_random.uniform(low=(-np.pi/2, -np.pi/2, -np.pi/2), high=(np.pi/2, np.pi/2, np.pi/2)) ) # random quat
self.sim.model.geom_rgba[gid]=self.np_random.uniform(low=[.2, .2, .2, 1], high=[.9, .9, .9, 1]) # random color
self.sim.forward()

obs = super().reset(self.init_qpos, self.init_qvel)
obs = super().reset(self.init_qpos, self.init_qvel, **kwargs)
return obs

# def viewer_setup(self):
Expand Down
6 changes: 3 additions & 3 deletions robohive/envs/arms/push_base_v0.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
================================================= """

import collections
import gym
from robohive.utils import gym
import numpy as np

from robohive.envs import env_base
Expand Down Expand Up @@ -103,8 +103,8 @@ def get_reward_dict(self, obs_dict):
rwd_dict['dense'] = np.sum([wt*rwd_dict[key] for key, wt in self.rwd_keys_wt.items()], axis=0)
return rwd_dict

def reset(self):
def reset(self, **kwargs):
self.sim.model.site_pos[self.target_sid] = self.np_random.uniform(high=self.target_xyz_range['high'], low=self.target_xyz_range['low'])
self.sim_obsd.model.site_pos[self.target_sid] = self.sim.model.site_pos[self.target_sid]
obs = super().reset(self.init_qpos, self.init_qvel)
obs = super().reset(self.init_qpos, self.init_qvel, **kwargs)
return obs
6 changes: 3 additions & 3 deletions robohive/envs/arms/reach_base_v0.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
================================================= """

import collections
import gym
from robohive.utils import gym
import numpy as np

from robohive.envs import env_base
Expand Down Expand Up @@ -97,8 +97,8 @@ def get_reward_dict(self, obs_dict):
rwd_dict['dense'] = np.sum([wt*rwd_dict[key] for key, wt in self.rwd_keys_wt.items()], axis=0)
return rwd_dict

def reset(self, reset_qpos=None, reset_qvel=None):
def reset(self, reset_qpos=None, reset_qvel=None, **kwargs):
self.sim.model.site_pos[self.target_sid] = self.np_random.uniform(high=self.target_xyz_range['high'], low=self.target_xyz_range['low'])
self.sim_obsd.model.site_pos[self.target_sid] = self.sim.model.site_pos[self.target_sid]
obs = super().reset(reset_qpos, reset_qvel)
obs = super().reset(reset_qpos, reset_qvel, **kwargs)
return obs
4 changes: 2 additions & 2 deletions robohive/envs/claws/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
License :: Under 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.
================================================= """

from gym.envs.registration import register
from robohive.utils import gym; register=gym.register
import os
curr_dir = os.path.dirname(os.path.abspath(__file__))
from robohive.envs.env_variants import register_env_variant
Expand Down Expand Up @@ -38,7 +38,7 @@
'model_path': curr_dir+'/trifinger/trifinger_reorient.xml',
'object_site_name': "object",
'target_site_name': "target",
'target_xyz_range': {'high':[.05, .05, 0.9], 'low':[-.05, -.05, 0.99]},
'target_xyz_range': {'high':[.05, .05, 0.99], 'low':[-.05, -.05, 0.9]},
'target_euler_range': {'high':[1, 1, 1], 'low':[-1, -1, -1]}
}
)
Expand Down
6 changes: 3 additions & 3 deletions robohive/envs/claws/reorient_v0.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
================================================= """

import collections
import gym
from robohive.utils import gym
import numpy as np

from robohive.envs import env_base
Expand Down Expand Up @@ -98,7 +98,7 @@ def get_reward_dict(self, obs_dict):
rwd_dict['dense'] = np.sum([wt*rwd_dict[key] for key, wt in self.rwd_keys_wt.items()], axis=0)
return rwd_dict

def reset(self):
def reset(self, **kwargs):
desired_pos = self.np_random.uniform(high=self.target_xyz_range['high'], low=self.target_xyz_range['low'])
self.sim.model.site_pos[self.target_sid] = desired_pos
self.sim_obsd.model.site_pos[self.target_sid] = desired_pos
Expand All @@ -108,5 +108,5 @@ def reset(self):
self.sim.model.site_quat[self.target_sid] = euler2quat(desired_orien)
self.sim_obsd.model.site_quat[self.target_sid] = euler2quat(desired_orien)

obs = super().reset(self.init_qpos, self.init_qvel)
obs = super().reset(self.init_qpos, self.init_qvel, **kwargs)
return obs
Loading

0 comments on commit 6c14798

Please sign in to comment.