def observation(self, observation): """Updates the observations by resizing the observation to shape given by :attr:`shape`. Args: observation: The observation to reshape Returns: The reshaped observations Raises: DependencyNotInstalled: opencv-python is not installed """ try: import cv2 except ImportError: raise DependencyNotInstalled( "opencv is not install, run `pip install gym[other]`" ) observation = cv2.resize( observation, self.shape[::-1], interpolation=cv2.INTER_AREA ) if observation.ndim == 2: observation = np.expand_dims(observation, -1) return observation
def _error(self): """docstring for _print_error""" msg = 'Importing MujocoEnv failed. Please run: \n' + \ '\n`pip install mujoco-py` \n\n' + \ 'and visit: ' + \ 'https://github.com/openai/mujoco-py/' raise DependencyNotInstalled(msg)
def render(self, mode: str = "human"): try: import pygame except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[box2d]`") pygame.font.init() assert mode in ["human", "state_pixels", "rgb_array"] if self.screen is None and mode == "human": pygame.init() pygame.display.init() self.screen = pygame.display.set_mode((WINDOW_W, WINDOW_H)) if self.clock is None: self.clock = pygame.time.Clock() if "t" not in self.__dict__: return # reset() not called yet self.surf = pygame.Surface((WINDOW_W, WINDOW_H)) # computing transformations angle = -self.car.hull.angle # Animating first second zoom. zoom = 0.1 * SCALE * max(1 - self.t, 0) + ZOOM * SCALE * min(self.t, 1) scroll_x = -(self.car.hull.position[0]) * zoom scroll_y = -(self.car.hull.position[1]) * zoom trans = pygame.math.Vector2((scroll_x, scroll_y)).rotate_rad(angle) trans = (WINDOW_W / 2 + trans[0], WINDOW_H / 4 + trans[1]) self._render_road(zoom, trans, angle) self.car.draw(self.surf, zoom, trans, angle, mode != "state_pixels") self.surf = pygame.transform.flip(self.surf, False, True) # showing stats self._render_indicators(WINDOW_W, WINDOW_H) font = pygame.font.Font(pygame.font.get_default_font(), 42) text = font.render("%04i" % self.reward, True, (255, 255, 255), (0, 0, 0)) text_rect = text.get_rect() text_rect.center = (60, WINDOW_H - WINDOW_H * 2.5 / 40.0) self.surf.blit(text, text_rect) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) self.screen.fill(0) self.screen.blit(self.surf, (0, 0)) pygame.display.flip() if mode == "rgb_array": return self._create_image_array(self.surf, (VIDEO_W, VIDEO_H)) elif mode == "state_pixels": return self._create_image_array(self.surf, (STATE_W, STATE_H)) else: return self.isopen
def __init__(self, frames: list, lz4_compress: bool = False): """Lazyframe for a set of frames and if to apply lz4. Args: frames (list): The frames to convert to lazy frames lz4_compress (bool): Use lz4 to compress the frames internally """ self.frame_shape = tuple(frames[0].shape) self.shape = (len(frames), ) + self.frame_shape self.dtype = frames[0].dtype if lz4_compress: try: from lz4.block import compress except ImportError: raise DependencyNotInstalled( "lz4 is not installed, run `pip install gym[other]`") frames = [compress(frame) for frame in frames] self._frames = frames self.lz4_compress = lz4_compress
def __init__( self, callback: callable, horizon_timesteps: int, plot_names: List[str] ): """Constructor of :class:`PlayPlot`. The function ``callback`` that is passed to this constructor should return a list of metrics that is of length ``len(plot_names)``. Args: callback: Function that computes metrics from environment transitions horizon_timesteps: The time horizon used for the live plots plot_names: List of plot titles Raises: DependencyNotInstalled: If matplotlib is not installed """ deprecation( "`PlayPlot` is marked as deprecated and will be removed in the near future." ) self.data_callback = callback self.horizon_timesteps = horizon_timesteps self.plot_names = plot_names if plt is None: raise DependencyNotInstalled( "matplotlib is not installed, run `pip install gym[other]`" ) num_plots = len(self.plot_names) self.fig, self.ax = plt.subplots(num_plots) if num_plots == 1: self.ax = [self.ax] for axis, name in zip(self.ax, plot_names): axis.set_title(name) self.t = 0 self.cur_plot = [None for _ in range(num_plots)] self.data = [deque(maxlen=horizon_timesteps) for _ in range(num_plots)]
def render(self, mode="human"): try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[classic_control]`" ) if self.screen is None: pygame.init() pygame.display.init() self.screen = pygame.display.set_mode( (self.SCREEN_DIM, self.SCREEN_DIM)) if self.clock is None: self.clock = pygame.time.Clock() self.surf = pygame.Surface((self.SCREEN_DIM, self.SCREEN_DIM)) self.surf.fill((255, 255, 255)) s = self.state bound = self.LINK_LENGTH_1 + self.LINK_LENGTH_2 + 0.2 # 2.2 for default scale = self.SCREEN_DIM / (bound * 2) offset = self.SCREEN_DIM / 2 if s is None: return None p1 = [ -self.LINK_LENGTH_1 * cos(s[0]) * scale, self.LINK_LENGTH_1 * sin(s[0]) * scale, ] p2 = [ p1[0] - self.LINK_LENGTH_2 * cos(s[0] + s[1]) * scale, p1[1] + self.LINK_LENGTH_2 * sin(s[0] + s[1]) * scale, ] xys = np.array([[0, 0], p1, p2])[:, ::-1] thetas = [s[0] - pi / 2, s[0] + s[1] - pi / 2] link_lengths = [self.LINK_LENGTH_1 * scale, self.LINK_LENGTH_2 * scale] pygame.draw.line( self.surf, start_pos=(-2.2 * scale + offset, 1 * scale + offset), end_pos=(2.2 * scale + offset, 1 * scale + offset), color=(0, 0, 0), ) for ((x, y), th, llen) in zip(xys, thetas, link_lengths): x = x + offset y = y + offset l, r, t, b = 0, llen, 0.1 * scale, -0.1 * scale coords = [(l, b), (l, t), (r, t), (r, b)] transformed_coords = [] for coord in coords: coord = pygame.math.Vector2(coord).rotate_rad(th) coord = (coord[0] + x, coord[1] + y) transformed_coords.append(coord) gfxdraw.aapolygon(self.surf, transformed_coords, (0, 204, 204)) gfxdraw.filled_polygon(self.surf, transformed_coords, (0, 204, 204)) gfxdraw.aacircle(self.surf, int(x), int(y), int(0.1 * scale), (204, 204, 0)) gfxdraw.filled_circle(self.surf, int(x), int(y), int(0.1 * scale), (204, 204, 0)) self.surf = pygame.transform.flip(self.surf, False, True) self.screen.blit(self.surf, (0, 0)) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() if mode == "rgb_array": return np.transpose(np.array(pygame.surfarray.pixels3d( self.screen)), axes=(1, 0, 2)) else: return self.isopen
def _render(self, mode): assert mode in self.metadata["render_modes"] try: import pygame except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[toy_text]`" ) player_sum, dealer_card_value, usable_ace = self._get_obs() screen_width, screen_height = 600, 500 card_img_height = screen_height // 3 card_img_width = int(card_img_height * 142 / 197) spacing = screen_height // 20 bg_color = (7, 99, 36) white = (255, 255, 255) if not hasattr(self, "screen"): pygame.init() if mode == "human": pygame.display.init() self.screen = pygame.display.set_mode((screen_width, screen_height)) else: pygame.font.init() self.screen = pygame.Surface((screen_width, screen_height)) if not hasattr(self, "clock"): self.clock = pygame.time.Clock() self.screen.fill(bg_color) def get_image(path): cwd = os.path.dirname(__file__) image = pygame.image.load(os.path.join(cwd, path)) return image def get_font(path, size): cwd = os.path.dirname(__file__) font = pygame.font.Font(os.path.join(cwd, path), size) return font small_font = get_font( os.path.join("font", "Minecraft.ttf"), screen_height // 15 ) dealer_text = small_font.render( "Dealer: " + str(dealer_card_value), True, white ) dealer_text_rect = self.screen.blit(dealer_text, (spacing, spacing)) suits = ["C", "D", "H", "S"] dealer_card_suit = self.np_random.choice(suits) if dealer_card_value == 1: dealer_card_value_str = "A" elif dealer_card_value == 10: dealer_card_value_str = self.np_random.choice(["J", "Q", "K"]) else: dealer_card_value_str = str(dealer_card_value) def scale_card_img(card_img): return pygame.transform.scale(card_img, (card_img_width, card_img_height)) dealer_card_img = scale_card_img( get_image( os.path.join("img", dealer_card_suit + dealer_card_value_str + ".png") ) ) dealer_card_rect = self.screen.blit( dealer_card_img, ( screen_width // 2 - card_img_width - spacing // 2, dealer_text_rect.bottom + spacing, ), ) hidden_card_img = scale_card_img(get_image(os.path.join("img", "Card.png"))) self.screen.blit( hidden_card_img, ( screen_width // 2 + spacing // 2, dealer_text_rect.bottom + spacing, ), ) player_text = small_font.render("Player", True, white) player_text_rect = self.screen.blit( player_text, (spacing, dealer_card_rect.bottom + 1.5 * spacing) ) large_font = get_font(os.path.join("font", "Minecraft.ttf"), screen_height // 6) player_sum_text = large_font.render(str(player_sum), True, white) player_sum_text_rect = self.screen.blit( player_sum_text, ( screen_width // 2 - player_sum_text.get_width() // 2, player_text_rect.bottom + spacing, ), ) if usable_ace: usable_ace_text = small_font.render("usable ace", True, white) self.screen.blit( usable_ace_text, ( screen_width // 2 - usable_ace_text.get_width() // 2, player_sum_text_rect.bottom + spacing // 2, ), ) if mode == "human": pygame.event.pump() pygame.display.update() self.clock.tick(self.metadata["render_fps"]) else: return np.transpose( np.array(pygame.surfarray.pixels3d(self.screen)), axes=(1, 0, 2) )
def _render(self, mode="human"): assert mode in self.metadata["render_modes"] try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[classic_control]`" ) if self.screen is None: pygame.init() if mode == "human": pygame.display.init() self.screen = pygame.display.set_mode( (self.screen_width, self.screen_height)) else: # mode in {"rgb_array", "single_rgb_array"} self.screen = pygame.Surface( (self.screen_width, self.screen_height)) if self.clock is None: self.clock = pygame.time.Clock() world_width = self.x_threshold * 2 scale = self.screen_width / world_width polewidth = 10.0 polelen = scale * (2 * self.length) cartwidth = 50.0 cartheight = 30.0 if self.state is None: return None x = self.state self.surf = pygame.Surface((self.screen_width, self.screen_height)) self.surf.fill((255, 255, 255)) l, r, t, b = -cartwidth / 2, cartwidth / 2, cartheight / 2, -cartheight / 2 axleoffset = cartheight / 4.0 cartx = x[0] * scale + self.screen_width / 2.0 # MIDDLE OF CART carty = 100 # TOP OF CART cart_coords = [(l, b), (l, t), (r, t), (r, b)] cart_coords = [(c[0] + cartx, c[1] + carty) for c in cart_coords] gfxdraw.aapolygon(self.surf, cart_coords, (0, 0, 0)) gfxdraw.filled_polygon(self.surf, cart_coords, (0, 0, 0)) l, r, t, b = ( -polewidth / 2, polewidth / 2, polelen - polewidth / 2, -polewidth / 2, ) pole_coords = [] for coord in [(l, b), (l, t), (r, t), (r, b)]: coord = pygame.math.Vector2(coord).rotate_rad(-x[2]) coord = (coord[0] + cartx, coord[1] + carty + axleoffset) pole_coords.append(coord) gfxdraw.aapolygon(self.surf, pole_coords, (202, 152, 101)) gfxdraw.filled_polygon(self.surf, pole_coords, (202, 152, 101)) gfxdraw.aacircle( self.surf, int(cartx), int(carty + axleoffset), int(polewidth / 2), (129, 132, 203), ) gfxdraw.filled_circle( self.surf, int(cartx), int(carty + axleoffset), int(polewidth / 2), (129, 132, 203), ) gfxdraw.hline(self.surf, 0, self.screen_width, carty, (0, 0, 0)) self.surf = pygame.transform.flip(self.surf, False, True) self.screen.blit(self.surf, (0, 0)) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() elif mode in {"rgb_array", "single_rgb_array"}: return np.transpose(np.array(pygame.surfarray.pixels3d( self.screen)), axes=(1, 0, 2))
def _render(self, mode: str = "human"): assert mode in self.metadata["render_modes"] try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[box2d]`" ) if self.screen is None and mode == "human": pygame.init() pygame.display.init() self.screen = pygame.display.set_mode((VIEWPORT_W, VIEWPORT_H)) if self.clock is None: self.clock = pygame.time.Clock() self.surf = pygame.Surface((VIEWPORT_W + self.scroll * SCALE, VIEWPORT_H)) pygame.transform.scale(self.surf, (SCALE, SCALE)) pygame.draw.polygon( self.surf, color=(215, 215, 255), points=[ (self.scroll * SCALE, 0), (self.scroll * SCALE + VIEWPORT_W, 0), (self.scroll * SCALE + VIEWPORT_W, VIEWPORT_H), (self.scroll * SCALE, VIEWPORT_H), ], ) for poly, x1, x2 in self.cloud_poly: if x2 < self.scroll / 2: continue if x1 > self.scroll / 2 + VIEWPORT_W / SCALE: continue pygame.draw.polygon( self.surf, color=(255, 255, 255), points=[ (p[0] * SCALE + self.scroll * SCALE / 2, p[1] * SCALE) for p in poly ], ) gfxdraw.aapolygon( self.surf, [(p[0] * SCALE + self.scroll * SCALE / 2, p[1] * SCALE) for p in poly], (255, 255, 255), ) for poly, color in self.terrain_poly: if poly[1][0] < self.scroll: continue if poly[0][0] > self.scroll + VIEWPORT_W / SCALE: continue scaled_poly = [] for coord in poly: scaled_poly.append([coord[0] * SCALE, coord[1] * SCALE]) pygame.draw.polygon(self.surf, color=color, points=scaled_poly) gfxdraw.aapolygon(self.surf, scaled_poly, color) self.lidar_render = (self.lidar_render + 1) % 100 i = self.lidar_render if i < 2 * len(self.lidar): single_lidar = ( self.lidar[i] if i < len(self.lidar) else self.lidar[len(self.lidar) - i - 1] ) if hasattr(single_lidar, "p1") and hasattr(single_lidar, "p2"): pygame.draw.line( self.surf, color=(255, 0, 0), start_pos=(single_lidar.p1[0] * SCALE, single_lidar.p1[1] * SCALE), end_pos=(single_lidar.p2[0] * SCALE, single_lidar.p2[1] * SCALE), width=1, ) for obj in self.drawlist: for f in obj.fixtures: trans = f.body.transform if type(f.shape) is circleShape: pygame.draw.circle( self.surf, color=obj.color1, center=trans * f.shape.pos * SCALE, radius=f.shape.radius * SCALE, ) pygame.draw.circle( self.surf, color=obj.color2, center=trans * f.shape.pos * SCALE, radius=f.shape.radius * SCALE, ) else: path = [trans * v * SCALE for v in f.shape.vertices] if len(path) > 2: pygame.draw.polygon(self.surf, color=obj.color1, points=path) gfxdraw.aapolygon(self.surf, path, obj.color1) path.append(path[0]) pygame.draw.polygon( self.surf, color=obj.color2, points=path, width=1 ) gfxdraw.aapolygon(self.surf, path, obj.color2) else: pygame.draw.aaline( self.surf, start_pos=path[0], end_pos=path[1], color=obj.color1, ) flagy1 = TERRAIN_HEIGHT * SCALE flagy2 = flagy1 + 50 x = TERRAIN_STEP * 3 * SCALE pygame.draw.aaline( self.surf, color=(0, 0, 0), start_pos=(x, flagy1), end_pos=(x, flagy2) ) f = [ (x, flagy2), (x, flagy2 - 10), (x + 25, flagy2 - 5), ] pygame.draw.polygon(self.surf, color=(230, 51, 0), points=f) pygame.draw.lines( self.surf, color=(0, 0, 0), points=f + [f[0]], width=1, closed=False ) self.surf = pygame.transform.flip(self.surf, False, True) if mode == "human": self.screen.blit(self.surf, (-self.scroll * SCALE, 0)) pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() elif mode in {"rgb_array", "single_rgb_array"}: return np.transpose( np.array(pygame.surfarray.pixels3d(self.surf)), axes=(1, 0, 2) )
from gym.error import DependencyNotInstalled from gym.utils import EzPickle from gym.utils.renderer import Renderer try: import Box2D from Box2D.b2 import ( circleShape, contactListener, edgeShape, fixtureDef, polygonShape, revoluteJointDef, ) except ImportError: raise DependencyNotInstalled("box2D is not installed, run `pip install gym[box2d]`") FPS = 50 SCALE = 30.0 # affects how fast-paced the game is, forces should be adjusted as well MOTORS_TORQUE = 80 SPEED_HIP = 4 SPEED_KNEE = 6 LIDAR_RANGE = 160 / SCALE INITIAL_RANDOM = 5 HULL_POLY = [(-30, +9), (+6, +9), (+34, +1), (+34, -8), (-30, -8)] LEG_DOWN = -8 / SCALE LEG_W, LEG_H = 8 / SCALE, 34 / SCALE
def __init__( self, env: gym.Env, noop_max: int = 30, frame_skip: int = 4, screen_size: int = 84, terminal_on_life_loss: bool = False, grayscale_obs: bool = True, grayscale_newaxis: bool = False, scale_obs: bool = False, ): """Wrapper for Atari 2600 preprocessing. Args: env (Env): The environment to apply the preprocessing noop_max (int): For No-op reset, the max number no-ops actions are taken at reset, to turn off, set to 0. frame_skip (int): The number of frames between new observation the agents observations effecting the frequency at which the agent experiences the game. screen_size (int): resize Atari frame terminal_on_life_loss (bool): `if True`, then :meth:`step()` returns `done=True` whenever a life is lost. grayscale_obs (bool): if True, then gray scale observation is returned, otherwise, RGB observation is returned. grayscale_newaxis (bool): `if True and grayscale_obs=True`, then a channel axis is added to grayscale observations to make them 3-dimensional. scale_obs (bool): if True, then observation normalized in range [0,1) is returned. It also limits memory optimization benefits of FrameStack Wrapper. """ super().__init__(env) if cv2 is None: raise DependencyNotInstalled( "opencv-python package not installed, run `pip install gym[other]` to get dependencies for atari" ) assert frame_skip > 0 assert screen_size > 0 assert noop_max >= 0 if frame_skip > 1: if ("NoFrameskip" not in env.spec.id and getattr(env.unwrapped, "_frameskip", None) != 1): raise ValueError( "Disable frame-skipping in the original env. Otherwise, more than one " "frame-skip will happen as through this wrapper") self.noop_max = noop_max assert env.unwrapped.get_action_meanings()[0] == "NOOP" self.frame_skip = frame_skip self.screen_size = screen_size self.terminal_on_life_loss = terminal_on_life_loss self.grayscale_obs = grayscale_obs self.grayscale_newaxis = grayscale_newaxis self.scale_obs = scale_obs # buffer of most recent two observations for max pooling if grayscale_obs: self.obs_buffer = [ np.empty(env.observation_space.shape[:2], dtype=np.uint8), np.empty(env.observation_space.shape[:2], dtype=np.uint8), ] else: self.obs_buffer = [ np.empty(env.observation_space.shape, dtype=np.uint8), np.empty(env.observation_space.shape, dtype=np.uint8), ] self.ale = env.unwrapped.ale self.lives = 0 self.game_over = False _low, _high, _obs_dtype = ((0, 255, np.uint8) if not scale_obs else (0, 1, np.float32)) _shape = (screen_size, screen_size, 1 if grayscale_obs else 3) if grayscale_obs and not grayscale_newaxis: _shape = _shape[:-1] # Remove channel axis self.observation_space = Box(low=_low, high=_high, shape=_shape, dtype=_obs_dtype)
def _render_gui(self, mode): try: import pygame # dependency to pygame only if rendering with human except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[toy_text]`") if self.window is None: pygame.init() pygame.display.set_caption("Taxi") if mode == "human": self.window = pygame.display.set_mode(WINDOW_SIZE) else: # "rgb_array" self.window = pygame.Surface(WINDOW_SIZE) if self.clock is None: self.clock = pygame.time.Clock() if self.taxi_imgs is None: file_names = [ path.join(path.dirname(__file__), "img/cab_front.png"), path.join(path.dirname(__file__), "img/cab_rear.png"), path.join(path.dirname(__file__), "img/cab_right.png"), path.join(path.dirname(__file__), "img/cab_left.png"), ] self.taxi_imgs = [ pygame.transform.scale(pygame.image.load(file_name), self.cell_size) for file_name in file_names ] if self.passenger_img is None: file_name = path.join(path.dirname(__file__), "img/passenger.png") self.passenger_img = pygame.transform.scale( pygame.image.load(file_name), self.cell_size) if self.destination_img is None: file_name = path.join(path.dirname(__file__), "img/hotel.png") self.destination_img = pygame.transform.scale( pygame.image.load(file_name), self.cell_size) self.destination_img.set_alpha(170) if self.median_horiz is None: file_names = [ path.join(path.dirname(__file__), "img/gridworld_median_left.png"), path.join(path.dirname(__file__), "img/gridworld_median_horiz.png"), path.join(path.dirname(__file__), "img/gridworld_median_right.png"), ] self.median_horiz = [ pygame.transform.scale(pygame.image.load(file_name), self.cell_size) for file_name in file_names ] if self.median_vert is None: file_names = [ path.join(path.dirname(__file__), "img/gridworld_median_top.png"), path.join(path.dirname(__file__), "img/gridworld_median_vert.png"), path.join(path.dirname(__file__), "img/gridworld_median_bottom.png"), ] self.median_vert = [ pygame.transform.scale(pygame.image.load(file_name), self.cell_size) for file_name in file_names ] if self.background_img is None: file_name = path.join(path.dirname(__file__), "img/taxi_background.png") self.background_img = pygame.transform.scale( pygame.image.load(file_name), self.cell_size) desc = self.desc for y in range(0, desc.shape[0]): for x in range(0, desc.shape[1]): cell = (x * self.cell_size[0], y * self.cell_size[1]) self.window.blit(self.background_img, cell) if desc[y][x] == b"|" and (y == 0 or desc[y - 1][x] != b"|"): self.window.blit(self.median_vert[0], cell) elif desc[y][x] == b"|" and (y == desc.shape[0] - 1 or desc[y + 1][x] != b"|"): self.window.blit(self.median_vert[2], cell) elif desc[y][x] == b"|": self.window.blit(self.median_vert[1], cell) elif desc[y][x] == b"-" and (x == 0 or desc[y][x - 1] != b"-"): self.window.blit(self.median_horiz[0], cell) elif desc[y][x] == b"-" and (x == desc.shape[1] - 1 or desc[y][x + 1] != b"-"): self.window.blit(self.median_horiz[2], cell) elif desc[y][x] == b"-": self.window.blit(self.median_horiz[1], cell) for cell, color in zip(self.locs, self.locs_colors): color_cell = pygame.Surface(self.cell_size) color_cell.set_alpha(128) color_cell.fill(color) loc = self.get_surf_loc(cell) self.window.blit(color_cell, (loc[0], loc[1] + 10)) taxi_row, taxi_col, pass_idx, dest_idx = self.decode(self.s) if pass_idx < 4: self.window.blit(self.passenger_img, self.get_surf_loc(self.locs[pass_idx])) if self.lastaction in [0, 1, 2, 3]: self.taxi_orientation = self.lastaction dest_loc = self.get_surf_loc(self.locs[dest_idx]) taxi_location = self.get_surf_loc((taxi_row, taxi_col)) if dest_loc[1] <= taxi_location[1]: self.window.blit( self.destination_img, (dest_loc[0], dest_loc[1] - self.cell_size[1] // 2), ) self.window.blit(self.taxi_imgs[self.taxi_orientation], taxi_location) else: # change blit order for overlapping appearance self.window.blit(self.taxi_imgs[self.taxi_orientation], taxi_location) self.window.blit( self.destination_img, (dest_loc[0], dest_loc[1] - self.cell_size[1] // 2), ) if mode == "human": pygame.display.update() self.clock.tick(self.metadata["render_fps"]) else: # rgb_array return np.transpose(np.array(pygame.surfarray.pixels3d( self.window)), axes=(1, 0, 2))
def render(self, mode="human"): try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[classic_control]`" ) screen_width = 600 screen_height = 400 world_width = self.max_position - self.min_position scale = screen_width / world_width carwidth = 40 carheight = 20 if self.screen is None: pygame.init() pygame.display.init() self.screen = pygame.display.set_mode( (screen_width, screen_height)) if self.clock is None: self.clock = pygame.time.Clock() self.surf = pygame.Surface((screen_width, screen_height)) self.surf.fill((255, 255, 255)) pos = self.state[0] xs = np.linspace(self.min_position, self.max_position, 100) ys = self._height(xs) xys = list(zip((xs - self.min_position) * scale, ys * scale)) pygame.draw.aalines(self.surf, points=xys, closed=False, color=(0, 0, 0)) clearance = 10 l, r, t, b = -carwidth / 2, carwidth / 2, carheight, 0 coords = [] for c in [(l, b), (l, t), (r, t), (r, b)]: c = pygame.math.Vector2(c).rotate_rad(math.cos(3 * pos)) coords.append(( c[0] + (pos - self.min_position) * scale, c[1] + clearance + self._height(pos) * scale, )) gfxdraw.aapolygon(self.surf, coords, (0, 0, 0)) gfxdraw.filled_polygon(self.surf, coords, (0, 0, 0)) for c in [(carwidth / 4, 0), (-carwidth / 4, 0)]: c = pygame.math.Vector2(c).rotate_rad(math.cos(3 * pos)) wheel = ( int(c[0] + (pos - self.min_position) * scale), int(c[1] + clearance + self._height(pos) * scale), ) gfxdraw.aacircle(self.surf, wheel[0], wheel[1], int(carheight / 2.5), (128, 128, 128)) gfxdraw.filled_circle(self.surf, wheel[0], wheel[1], int(carheight / 2.5), (128, 128, 128)) flagx = int((self.goal_position - self.min_position) * scale) flagy1 = int(self._height(self.goal_position) * scale) flagy2 = flagy1 + 50 gfxdraw.vline(self.surf, flagx, flagy1, flagy2, (0, 0, 0)) gfxdraw.aapolygon( self.surf, [(flagx, flagy2), (flagx, flagy2 - 10), (flagx + 25, flagy2 - 5)], (204, 204, 0), ) gfxdraw.filled_polygon( self.surf, [(flagx, flagy2), (flagx, flagy2 - 10), (flagx + 25, flagy2 - 5)], (204, 204, 0), ) self.surf = pygame.transform.flip(self.surf, False, True) self.screen.blit(self.surf, (0, 0)) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() if mode == "rgb_array": return np.transpose(np.array(pygame.surfarray.pixels3d( self.screen)), axes=(1, 0, 2)) else: return self.isopen
def _render_gui(self, desc, mode): try: import pygame except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[toy_text]`") if self.window_surface is None: pygame.init() pygame.display.init() pygame.display.set_caption("Frozen Lake") if mode == "human": self.window_surface = pygame.display.set_mode(self.window_size) else: # rgb_array self.window_surface = pygame.Surface(self.window_size) if self.clock is None: self.clock = pygame.time.Clock() if self.hole_img is None: file_name = path.join(path.dirname(__file__), "img/hole.png") self.hole_img = pygame.image.load(file_name) if self.cracked_hole_img is None: file_name = path.join(path.dirname(__file__), "img/cracked_hole.png") self.cracked_hole_img = pygame.image.load(file_name) if self.ice_img is None: file_name = path.join(path.dirname(__file__), "img/ice.png") self.ice_img = pygame.image.load(file_name) if self.goal_img is None: file_name = path.join(path.dirname(__file__), "img/goal.png") self.goal_img = pygame.image.load(file_name) if self.start_img is None: file_name = path.join(path.dirname(__file__), "img/stool.png") self.start_img = pygame.image.load(file_name) if self.elf_images is None: elfs = [ path.join(path.dirname(__file__), "img/elf_left.png"), path.join(path.dirname(__file__), "img/elf_down.png"), path.join(path.dirname(__file__), "img/elf_right.png"), path.join(path.dirname(__file__), "img/elf_up.png"), ] self.elf_images = [pygame.image.load(f_name) for f_name in elfs] cell_width = self.window_size[0] // self.ncol cell_height = self.window_size[1] // self.nrow smaller_cell_scale = 0.6 small_cell_w = int(smaller_cell_scale * cell_width) small_cell_h = int(smaller_cell_scale * cell_height) # prepare images last_action = self.lastaction if self.lastaction is not None else 1 elf_img = self.elf_images[last_action] elf_scale = min( small_cell_w / elf_img.get_width(), small_cell_h / elf_img.get_height(), ) elf_dims = ( elf_img.get_width() * elf_scale, elf_img.get_height() * elf_scale, ) elf_img = pygame.transform.scale(elf_img, elf_dims) hole_img = pygame.transform.scale(self.hole_img, (cell_width, cell_height)) cracked_hole_img = pygame.transform.scale(self.cracked_hole_img, (cell_width, cell_height)) ice_img = pygame.transform.scale(self.ice_img, (cell_width, cell_height)) goal_img = pygame.transform.scale(self.goal_img, (cell_width, cell_height)) start_img = pygame.transform.scale(self.start_img, (small_cell_w, small_cell_h)) for y in range(self.nrow): for x in range(self.ncol): rect = (x * cell_width, y * cell_height, cell_width, cell_height) if desc[y][x] == b"H": self.window_surface.blit(hole_img, (rect[0], rect[1])) elif desc[y][x] == b"G": self.window_surface.blit(ice_img, (rect[0], rect[1])) goal_rect = self._center_small_rect( rect, goal_img.get_size()) self.window_surface.blit(goal_img, goal_rect) elif desc[y][x] == b"S": self.window_surface.blit(ice_img, (rect[0], rect[1])) stool_rect = self._center_small_rect( rect, start_img.get_size()) self.window_surface.blit(start_img, stool_rect) else: self.window_surface.blit(ice_img, (rect[0], rect[1])) pygame.draw.rect(self.window_surface, (180, 200, 230), rect, 1) # paint the elf bot_row, bot_col = self.s // self.ncol, self.s % self.ncol cell_rect = ( bot_col * cell_width, bot_row * cell_height, cell_width, cell_height, ) if desc[bot_row][bot_col] == b"H": self.window_surface.blit(cracked_hole_img, (cell_rect[0], cell_rect[1])) else: elf_rect = self._center_small_rect(cell_rect, elf_img.get_size()) self.window_surface.blit(elf_img, elf_rect) if mode == "human": pygame.event.pump() pygame.display.update() self.clock.tick(self.metadata["render_fps"]) else: # rgb_array return np.transpose(np.array( pygame.surfarray.pixels3d(self.window_surface)), axes=(1, 0, 2))
def _render(self, mode="human"): assert mode in self.metadata["render_modes"] try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[classic_control]`" ) if self.screen is None: pygame.init() if mode == "human": pygame.display.init() self.screen = pygame.display.set_mode( (self.screen_dim, self.screen_dim)) else: # mode in {"rgb_array", "single_rgb_array"} self.screen = pygame.Surface( (self.screen_dim, self.screen_dim)) if self.clock is None: self.clock = pygame.time.Clock() self.surf = pygame.Surface((self.screen_dim, self.screen_dim)) self.surf.fill((255, 255, 255)) bound = 2.2 scale = self.screen_dim / (bound * 2) offset = self.screen_dim // 2 rod_length = 1 * scale rod_width = 0.2 * scale l, r, t, b = 0, rod_length, rod_width / 2, -rod_width / 2 coords = [(l, b), (l, t), (r, t), (r, b)] transformed_coords = [] for c in coords: c = pygame.math.Vector2(c).rotate_rad(self.state[0] + np.pi / 2) c = (c[0] + offset, c[1] + offset) transformed_coords.append(c) gfxdraw.aapolygon(self.surf, transformed_coords, (204, 77, 77)) gfxdraw.filled_polygon(self.surf, transformed_coords, (204, 77, 77)) gfxdraw.aacircle(self.surf, offset, offset, int(rod_width / 2), (204, 77, 77)) gfxdraw.filled_circle(self.surf, offset, offset, int(rod_width / 2), (204, 77, 77)) rod_end = (rod_length, 0) rod_end = pygame.math.Vector2(rod_end).rotate_rad(self.state[0] + np.pi / 2) rod_end = (int(rod_end[0] + offset), int(rod_end[1] + offset)) gfxdraw.aacircle(self.surf, rod_end[0], rod_end[1], int(rod_width / 2), (204, 77, 77)) gfxdraw.filled_circle(self.surf, rod_end[0], rod_end[1], int(rod_width / 2), (204, 77, 77)) fname = path.join(path.dirname(__file__), "assets/clockwise.png") img = pygame.image.load(fname) if self.last_u is not None: scale_img = pygame.transform.smoothscale( img, (scale * np.abs(self.last_u) / 2, scale * np.abs(self.last_u) / 2), ) is_flip = bool(self.last_u > 0) scale_img = pygame.transform.flip(scale_img, is_flip, True) self.surf.blit( scale_img, ( offset - scale_img.get_rect().centerx, offset - scale_img.get_rect().centery, ), ) # drawing axle gfxdraw.aacircle(self.surf, offset, offset, int(0.05 * scale), (0, 0, 0)) gfxdraw.filled_circle(self.surf, offset, offset, int(0.05 * scale), (0, 0, 0)) self.surf = pygame.transform.flip(self.surf, False, True) self.screen.blit(self.surf, (0, 0)) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() else: # mode == "rgb_array": return np.transpose(np.array(pygame.surfarray.pixels3d( self.screen)), axes=(1, 0, 2))
def render(self, mode="human"): try: import pygame from pygame import gfxdraw except ImportError: raise DependencyNotInstalled( "pygame is not installed, run `pip install gym[box2d]`" ) if self.screen is None: pygame.init() pygame.display.init() self.screen = pygame.display.set_mode((VIEWPORT_W, VIEWPORT_H)) if self.clock is None: self.clock = pygame.time.Clock() self.surf = pygame.Surface(self.screen.get_size()) pygame.transform.scale(self.surf, (SCALE, SCALE)) pygame.draw.rect(self.surf, (255, 255, 255), self.surf.get_rect()) for obj in self.particles: obj.ttl -= 0.15 obj.color1 = ( int(max(0.2, 0.15 + obj.ttl) * 255), int(max(0.2, 0.5 * obj.ttl) * 255), int(max(0.2, 0.5 * obj.ttl) * 255), ) obj.color2 = ( int(max(0.2, 0.15 + obj.ttl) * 255), int(max(0.2, 0.5 * obj.ttl) * 255), int(max(0.2, 0.5 * obj.ttl) * 255), ) self._clean_particles(False) for p in self.sky_polys: scaled_poly = [] for coord in p: scaled_poly.append((coord[0] * SCALE, coord[1] * SCALE)) pygame.draw.polygon(self.surf, (0, 0, 0), scaled_poly) gfxdraw.aapolygon(self.surf, scaled_poly, (0, 0, 0)) for obj in self.particles + self.drawlist: for f in obj.fixtures: trans = f.body.transform if type(f.shape) is circleShape: pygame.draw.circle( self.surf, color=obj.color1, center=trans * f.shape.pos * SCALE, radius=f.shape.radius * SCALE, ) pygame.draw.circle( self.surf, color=obj.color2, center=trans * f.shape.pos * SCALE, radius=f.shape.radius * SCALE, ) else: path = [trans * v * SCALE for v in f.shape.vertices] pygame.draw.polygon(self.surf, color=obj.color1, points=path) gfxdraw.aapolygon(self.surf, path, obj.color1) pygame.draw.aalines( self.surf, color=obj.color2, points=path, closed=True ) for x in [self.helipad_x1, self.helipad_x2]: x = x * SCALE flagy1 = self.helipad_y * SCALE flagy2 = flagy1 + 50 pygame.draw.line( self.surf, color=(255, 255, 255), start_pos=(x, flagy1), end_pos=(x, flagy2), width=1, ) pygame.draw.polygon( self.surf, color=(204, 204, 0), points=[ (x, flagy2), (x, flagy2 - 10), (x + 25, flagy2 - 5), ], ) gfxdraw.aapolygon( self.surf, [(x, flagy2), (x, flagy2 - 10), (x + 25, flagy2 - 5)], (204, 204, 0), ) self.surf = pygame.transform.flip(self.surf, False, True) self.screen.blit(self.surf, (0, 0)) if mode == "human": pygame.event.pump() self.clock.tick(self.metadata["render_fps"]) pygame.display.flip() if mode == "rgb_array": return np.transpose( np.array(pygame.surfarray.pixels3d(self.surf)), axes=(1, 0, 2) ) else: return self.isopen