9
9
import gym
10
10
11
11
try :
12
- import mujoco_py
12
+ import dm_control . mujoco as dm_mujoco
13
13
except ImportError as e :
14
14
raise error .DependencyNotInstalled (
15
- "{}. (HINT: you need to install mujoco_py, and also perform the setup instructions here: https://github.com/openai/mujoco-py/. )" .format (
15
+ "{}. (HINT: you need to install dm_control )" .format (
16
16
e
17
17
)
18
18
)
@@ -51,8 +51,8 @@ def __init__(self, model_path, frame_skip):
51
51
if not path .exists (fullpath ):
52
52
raise OSError (f"File { fullpath } does not exist" )
53
53
self .frame_skip = frame_skip
54
- self .model = mujoco_py . load_model_from_path (fullpath )
55
- self .sim = mujoco_py . MjSim ( self .model )
54
+ self .sim = dm_mujoco . Physics . from_xml_path (fullpath )
55
+ self .model = self .sim . model
56
56
self .data = self .sim .data
57
57
self .viewer = None
58
58
self ._viewers = {}
@@ -111,11 +111,10 @@ def reset(self, seed: Optional[int] = None):
111
111
112
112
def set_state (self , qpos , qvel ):
113
113
assert qpos .shape == (self .model .nq ,) and qvel .shape == (self .model .nv ,)
114
- old_state = self .sim .get_state ()
115
- new_state = mujoco_py .MjSimState (
116
- old_state .time , qpos , qvel , old_state .act , old_state .udd_state
117
- )
118
- self .sim .set_state (new_state )
114
+ state = self .sim .get_state ()
115
+ state [:self .model .nq ] = qpos
116
+ state [self .model .nq :self .model .nq + self .model .nv ] = qvel
117
+ self .sim .set_state (state )
119
118
self .sim .forward ()
120
119
121
120
@property
@@ -138,55 +137,18 @@ def render(
138
137
camera_id = None ,
139
138
camera_name = None ,
140
139
):
141
- if mode == "rgb_array" or mode == "depth_array" :
142
- if camera_id is not None and camera_name is not None :
143
- raise ValueError (
144
- "Both `camera_id` and `camera_name` cannot be"
145
- " specified at the same time."
146
- )
147
-
148
- no_camera_specified = camera_name is None and camera_id is None
149
- if no_camera_specified :
150
- camera_name = "track"
151
-
152
- if camera_id is None and camera_name in self .model ._camera_name2id :
153
- camera_id = self .model .camera_name2id (camera_name )
154
-
155
- self ._get_viewer (mode ).render (width , height , camera_id = camera_id )
156
-
157
140
if mode == "rgb_array" :
158
- # window size used for old mujoco-py:
159
- data = self ._get_viewer (mode ).read_pixels (width , height , depth = False )
160
- # original image is upside-down, so flip it
161
- return data [::- 1 , :, :]
162
- elif mode == "depth_array" :
163
- self ._get_viewer (mode ).render (width , height )
164
- # window size used for old mujoco-py:
165
- # Extract depth part of the read_pixels() tuple
166
- data = self ._get_viewer (mode ).read_pixels (width , height , depth = True )[1 ]
167
- # original image is upside-down, so flip it
168
- return data [::- 1 , :]
169
- elif mode == "human" :
170
- self ._get_viewer (mode ).render ()
141
+ camera_id = camera_id or 0
142
+ return self .sim .render (height , width , camera_id )
143
+ else :
144
+ raise NotImplemented
171
145
172
146
def close (self ):
173
147
if self .viewer is not None :
174
148
# self.viewer.finish()
175
149
self .viewer = None
176
150
self ._viewers = {}
177
151
178
- def _get_viewer (self , mode ):
179
- self .viewer = self ._viewers .get (mode )
180
- if self .viewer is None :
181
- if mode == "human" :
182
- self .viewer = mujoco_py .MjViewer (self .sim )
183
- elif mode == "rgb_array" or mode == "depth_array" :
184
- self .viewer = mujoco_py .MjRenderContextOffscreen (self .sim , - 1 )
185
-
186
- self .viewer_setup ()
187
- self ._viewers [mode ] = self .viewer
188
- return self .viewer
189
-
190
152
def get_body_com (self , body_name ):
191
153
return self .data .get_body_xpos (body_name )
192
154
0 commit comments