|
@@ -2,14 +2,12 @@ import hashlib
|
|
|
import math
|
|
|
from abc import abstractmethod
|
|
|
from enum import IntEnum
|
|
|
-from functools import partial
|
|
|
from typing import Any, Callable, Optional, Union
|
|
|
|
|
|
import gym
|
|
|
import numpy as np
|
|
|
from gym import spaces
|
|
|
from gym.utils import seeding
|
|
|
-from gym.utils.renderer import Renderer
|
|
|
|
|
|
# Size in pixels of a tile in the full-scale human view
|
|
|
from gym_minigrid.rendering import (
|
|
@@ -827,7 +825,7 @@ class MiniGridEnv(gym.Env):
|
|
|
"""
|
|
|
|
|
|
metadata = {
|
|
|
- "render_modes": ["human", "rgb_array", "single_rgb_array"],
|
|
|
+ "render_modes": ["human", "rgb_array"],
|
|
|
"render_fps": 10,
|
|
|
}
|
|
|
|
|
@@ -837,7 +835,6 @@ class MiniGridEnv(gym.Env):
|
|
|
left = 0
|
|
|
right = 1
|
|
|
forward = 2
|
|
|
-
|
|
|
# Pick up an object
|
|
|
pickup = 3
|
|
|
# Drop an object
|
|
@@ -862,9 +859,6 @@ class MiniGridEnv(gym.Env):
|
|
|
tile_size: int = TILE_PIXELS,
|
|
|
agent_pov: bool = False,
|
|
|
):
|
|
|
- # Rendering attributes
|
|
|
- self.render_mode = render_mode
|
|
|
-
|
|
|
# Initialize mission
|
|
|
self.mission = mission_space.sample()
|
|
|
|
|
@@ -920,13 +914,13 @@ class MiniGridEnv(gym.Env):
|
|
|
self.grid = Grid(width, height)
|
|
|
self.carrying = None
|
|
|
|
|
|
- frame_rendering = partial(
|
|
|
- self._render, highlight=highlight, tile_size=tile_size, agent_pov=agent_pov
|
|
|
- )
|
|
|
-
|
|
|
- self.renderer = Renderer(self.render_mode, frame_rendering)
|
|
|
+ # Rendering attributes
|
|
|
+ self.render_mode = render_mode
|
|
|
+ self.highlight = highlight
|
|
|
+ self.tile_size = tile_size
|
|
|
+ self.agent_pov = agent_pov
|
|
|
|
|
|
- def reset(self, *, seed=None, return_info=False, options=None):
|
|
|
+ def reset(self, *, seed=None, options=None):
|
|
|
super().reset(seed=seed)
|
|
|
|
|
|
# Reinitialize episode-specific variables
|
|
@@ -953,17 +947,13 @@ class MiniGridEnv(gym.Env):
|
|
|
# Step count since episode start
|
|
|
self.step_count = 0
|
|
|
|
|
|
+ if self.render_mode == "human":
|
|
|
+ self.render()
|
|
|
+
|
|
|
# Return first observation
|
|
|
obs = self.gen_obs()
|
|
|
|
|
|
- # Reset Renderer
|
|
|
- self.renderer.reset()
|
|
|
- self.renderer.render_step()
|
|
|
-
|
|
|
- if not return_info:
|
|
|
- return obs
|
|
|
- else:
|
|
|
- return obs, {}
|
|
|
+ return obs, {}
|
|
|
|
|
|
def hash(self, size=16):
|
|
|
"""Compute a hash that uniquely identifies the current state of the environment.
|
|
@@ -1378,10 +1368,10 @@ class MiniGridEnv(gym.Env):
|
|
|
if self.step_count >= self.max_steps:
|
|
|
truncated = True
|
|
|
|
|
|
- obs = self.gen_obs()
|
|
|
+ if self.render_mode == "human":
|
|
|
+ self.render()
|
|
|
|
|
|
- # Reset Renderer
|
|
|
- self.renderer.render_step()
|
|
|
+ obs = self.gen_obs()
|
|
|
|
|
|
return obs, reward, terminated, truncated, {}
|
|
|
|
|
@@ -1529,42 +1519,19 @@ class MiniGridEnv(gym.Env):
|
|
|
else:
|
|
|
return self.get_full_render(highlight, tile_size)
|
|
|
|
|
|
- def _render(self, mode: str = "human", **kwargs):
|
|
|
- """
|
|
|
- Render the whole-grid human view
|
|
|
- """
|
|
|
- img = self.get_frame(**kwargs)
|
|
|
+ def render(self):
|
|
|
|
|
|
- mode = self.render_mode
|
|
|
- if mode == "human":
|
|
|
+ img = self.get_frame(self.highlight, self.tile_size, self.agent_pov)
|
|
|
+
|
|
|
+ if self.render_mode == "human":
|
|
|
if self.window is None:
|
|
|
self.window = Window("gym_minigrid")
|
|
|
self.window.show(block=False)
|
|
|
self.window.set_caption(self.mission)
|
|
|
self.window.show_img(img)
|
|
|
- else:
|
|
|
+ elif self.render_mode == "rgb_array":
|
|
|
return img
|
|
|
|
|
|
- def render(
|
|
|
- self,
|
|
|
- mode: str = "human",
|
|
|
- highlight: Optional[bool] = None,
|
|
|
- tile_size: Optional[int] = None,
|
|
|
- agent_pov: Optional[bool] = None,
|
|
|
- ):
|
|
|
- if self.render_mode is not None:
|
|
|
- assert (
|
|
|
- highlight is None and tile_size is None and agent_pov is None
|
|
|
- ), "Unexpected argument for render. Specify render arguments at environment initialization."
|
|
|
- return self.renderer.get_renders()
|
|
|
- else:
|
|
|
- highlight = highlight if highlight is not None else True
|
|
|
- tile_size = tile_size if tile_size is not None else TILE_PIXELS
|
|
|
- agent_pov = agent_pov if agent_pov is not None else False
|
|
|
- return self._render(
|
|
|
- mode=mode, highlight=highlight, tile_size=tile_size, agent_pov=agent_pov
|
|
|
- )
|
|
|
-
|
|
|
def close(self):
|
|
|
if self.window:
|
|
|
self.window.close()
|