integrated metaworld tasks into the framework
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
# MetaWorld Wrappers
|
||||
|
||||
These are the Environment Wrappers for selected [Metaworld](https://meta-world.github.io/) environments in order to use our Motion Primitive gym interface with them.
|
||||
All Metaworld environments have a 39 dimensional observation space with the same structure. The tasks differ only in the objective and the initial observations that are randomized.
|
||||
Unused observations are zeroed out. E.g. for `Button-Press-v2` the observation mask looks the following:
|
||||
```python
|
||||
return np.hstack([
|
||||
# Current observation
|
||||
[False] * 3, # end-effector position
|
||||
[False] * 1, # normalized gripper open distance
|
||||
[True] * 3, # main object position
|
||||
[False] * 4, # main object quaternion
|
||||
[False] * 3, # secondary object position
|
||||
[False] * 4, # secondary object quaternion
|
||||
# Previous observation
|
||||
[False] * 3, # previous end-effector position
|
||||
[False] * 1, # previous normalized gripper open distance
|
||||
[False] * 3, # previous main object position
|
||||
[False] * 4, # previous main object quaternion
|
||||
[False] * 3, # previous second object position
|
||||
[False] * 4, # previous second object quaternion
|
||||
# Goal
|
||||
[True] * 3, # goal position
|
||||
])
|
||||
```
|
||||
For other tasks only the boolean values have to be adjusted accordingly.
|
||||
@@ -0,0 +1 @@
|
||||
from alr_envs.meta import button_press
|
||||
@@ -0,0 +1,48 @@
|
||||
from typing import Tuple, Union
|
||||
|
||||
import numpy as np
|
||||
|
||||
from mp_env_api import MPEnvWrapper
|
||||
|
||||
|
||||
class MPWrapper(MPEnvWrapper):
|
||||
|
||||
@property
|
||||
def active_obs(self):
|
||||
# This structure is the same for all metaworld environments.
|
||||
# Only the observations which change could differ
|
||||
return np.hstack([
|
||||
# Current observation
|
||||
[False] * 3, # end-effector position
|
||||
[False] * 1, # normalized gripper open distance
|
||||
[True] * 3, # main object position
|
||||
[False] * 4, # main object quaternion
|
||||
[False] * 3, # secondary object position
|
||||
[False] * 4, # secondary object quaternion
|
||||
# Previous observation
|
||||
# TODO: Include previous values? According to their source they might be wrong for the first iteration.
|
||||
[False] * 3, # previous end-effector position
|
||||
[False] * 1, # previous normalized gripper open distance
|
||||
[False] * 3, # previous main object position
|
||||
[False] * 4, # previous main object quaternion
|
||||
[False] * 3, # previous second object position
|
||||
[False] * 4, # previous second object quaternion
|
||||
# Goal
|
||||
[True] * 3, # goal position
|
||||
])
|
||||
|
||||
@property
|
||||
def current_pos(self) -> Union[float, int, np.ndarray]:
|
||||
return self.env.physics.named.data.qpos[:]
|
||||
|
||||
@property
|
||||
def current_vel(self) -> Union[float, int, np.ndarray, Tuple]:
|
||||
return self.env.physics.named.data.qvel[:]
|
||||
|
||||
@property
|
||||
def goal_pos(self) -> Union[float, int, np.ndarray, Tuple]:
|
||||
raise ValueError("Goal position is not available and has to be learnt based on the environment.")
|
||||
|
||||
@property
|
||||
def dt(self) -> Union[float, int]:
|
||||
return self.env.dt
|
||||
Reference in New Issue
Block a user