Compare commits
	
		
			No commits in common. "e3a1044cb3332bf3dfa45722320679755fa960af" and "40d1129640a67bf3c8c658ba1f7502d2a429abb4" have entirely different histories.
		
	
	
		
			e3a1044cb3
			...
			40d1129640
		
	
		
| @ -31,7 +31,6 @@ class ColumbusEnv(gym.Env): | |||||||
|         self.acc_fac = 0.03/fps*60 |         self.acc_fac = 0.03/fps*60 | ||||||
|         self.die_on_zero = False |         self.die_on_zero = False | ||||||
|         self.return_on_score = -1  # -1 = never |         self.return_on_score = -1  # -1 = never | ||||||
|         self.reward_mult = 1 |  | ||||||
|         self.agent_drag = 0  # 0.01 is a good value |         self.agent_drag = 0  # 0.01 is a good value | ||||||
|         self.controll_type = 'SPEED'  # one of SPEED, ACC |         self.controll_type = 'SPEED'  # one of SPEED, ACC | ||||||
|         self.limit_inp_to_unit_circle = True |         self.limit_inp_to_unit_circle = True | ||||||
| @ -39,7 +38,6 @@ class ColumbusEnv(gym.Env): | |||||||
|         self.aux_reward_discretize = 0  # 0 = dont discretize |         self.aux_reward_discretize = 0  # 0 = dont discretize | ||||||
|         self.draw_observable = True |         self.draw_observable = True | ||||||
|         self.draw_joystick = True |         self.draw_joystick = True | ||||||
|         self.draw_entities = True |  | ||||||
| 
 | 
 | ||||||
|         self.rng = random_dont_use.Random() |         self.rng = random_dont_use.Random() | ||||||
|         self.reset() |         self.reset() | ||||||
| @ -79,11 +77,11 @@ class ColumbusEnv(gym.Env): | |||||||
|                 new_timers.append((time_left, func, arg)) |                 new_timers.append((time_left, func, arg)) | ||||||
|         self.timers = new_timers |         self.timers = new_timers | ||||||
| 
 | 
 | ||||||
|     def sq_dist(self, pos1, pos2): |     def sq_dist(self, entity1, entity2): | ||||||
|         return (pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2 |         return (entity1.pos[0] - entity2.pos[0])**2 + (entity1.pos[1] - entity2.pos[1])**2 | ||||||
| 
 | 
 | ||||||
|     def dist(self, pos1, pos2): |     def dist(self, entity1, entity2): | ||||||
|         return math.sqrt(self.sq_dist(pos1, pos2)) |         return math.sqrt(self._sq_dist(entity1, entity2)) | ||||||
| 
 | 
 | ||||||
|     def _get_aux_reward(self): |     def _get_aux_reward(self): | ||||||
|         aux_reward = 0 |         aux_reward = 0 | ||||||
| @ -91,7 +89,7 @@ class ColumbusEnv(gym.Env): | |||||||
|             if isinstance(entity, entities.Reward): |             if isinstance(entity, entities.Reward): | ||||||
|                 if entity.avaible: |                 if entity.avaible: | ||||||
|                     reward = self.aux_reward_max / \ |                     reward = self.aux_reward_max / \ | ||||||
|                         (1 + self.sq_dist(entity.pos, self.agent.pos)) |                         (1 + self.sq_dist(entity, self.agent)) | ||||||
| 
 | 
 | ||||||
|                     if self.aux_reward_discretize: |                     if self.aux_reward_discretize: | ||||||
|                         reward = int(reward*self.aux_reward_discretize*2) / \ |                         reward = int(reward*self.aux_reward_discretize*2) / \ | ||||||
| @ -117,8 +115,7 @@ class ColumbusEnv(gym.Env): | |||||||
|         done = self.die_on_zero and self.score <= 0 or self.return_on_score != - \ |         done = self.die_on_zero and self.score <= 0 or self.return_on_score != - \ | ||||||
|             1 and self.score > self.return_on_score |             1 and self.score > self.return_on_score | ||||||
|         info = {'score': self.score, 'reward': reward} |         info = {'score': self.score, 'reward': reward} | ||||||
|         self._rendered = False |         return observation, reward, done, info | ||||||
|         return observation, reward*self.reward_mult, done, info |  | ||||||
| 
 | 
 | ||||||
|     def check_collisions_for(self, entity): |     def check_collisions_for(self, entity): | ||||||
|         for other in self.entities: |         for other in self.entities: | ||||||
| @ -167,7 +164,6 @@ class ColumbusEnv(gym.Env): | |||||||
| 
 | 
 | ||||||
|     def reset(self): |     def reset(self): | ||||||
|         pygame.init() |         pygame.init() | ||||||
|         self._rendered = False |  | ||||||
|         self.inp = (0.5, 0.5) |         self.inp = (0.5, 0.5) | ||||||
|         # will get rescaled acording to fps (=reward per second) |         # will get rescaled acording to fps (=reward per second) | ||||||
|         self.new_reward = 0 |         self.new_reward = 0 | ||||||
| @ -197,18 +193,12 @@ class ColumbusEnv(gym.Env): | |||||||
|             pygame.draw.circle(self.screen, (100, 100, 100), (20+int(60*x) + |             pygame.draw.circle(self.screen, (100, 100, 100), (20+int(60*x) + | ||||||
|                                                               self.joystick_offset[0], 20+int(60*y)+self.joystick_offset[1]), 20, width=0) |                                                               self.joystick_offset[0], 20+int(60*y)+self.joystick_offset[1]), 20, width=0) | ||||||
| 
 | 
 | ||||||
|     def render(self, mode='human', dont_show=False): |     def render(self, mode='human'): | ||||||
|         self.visible = self.visible or not dont_show |         self.visible = True | ||||||
|         self._ensure_surface() |         self._ensure_surface() | ||||||
|         pygame.draw.rect(self.surface, (0, 0, 0), |         pygame.draw.rect(self.surface, (0, 0, 0), | ||||||
|                          pygame.Rect(0, 0, self.width, self.height)) |                          pygame.Rect(0, 0, self.width, self.height)) | ||||||
|         if self.draw_entities: |  | ||||||
|         self._draw_entities() |         self._draw_entities() | ||||||
|         else: |  | ||||||
|             self.agent.draw() |  | ||||||
|         self._rendered = True |  | ||||||
|         if dont_show: |  | ||||||
|             return |  | ||||||
|         self.screen.blit(self.surface, (0, 0)) |         self.screen.blit(self.surface, (0, 0)) | ||||||
|         self._draw_observable() |         self._draw_observable() | ||||||
|         self._draw_joystick() |         self._draw_joystick() | ||||||
| @ -227,16 +217,3 @@ class ColumbusTest3_1(ColumbusEnv): | |||||||
|         self.start_pos = [0.6, 0.3] |         self.start_pos = [0.6, 0.3] | ||||||
|         self.fps = 30 |         self.fps = 30 | ||||||
|         self.score = 0 |         self.score = 0 | ||||||
|         self.reward_mult = 0.001 |  | ||||||
|         self.aux_reward_max = 1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class ColumbusTestRay(ColumbusEnv): |  | ||||||
|     def __init__(self): |  | ||||||
|         super(ColumbusTestRay, self).__init__( |  | ||||||
|             observable=observables.RayObservable()) |  | ||||||
|         self.start_pos = [0.6, 0.3] |  | ||||||
|         self.fps = 30 |  | ||||||
|         self.score = 0 |  | ||||||
|         self.reward_mult = 0.001 |  | ||||||
|         self.aux_reward_max = 1 |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| from time import sleep, time | from time import sleep, time | ||||||
| from env import * | from env import ColumbusEnv, ColumbusTest3_1 | ||||||
| import numpy as np | import numpy as np | ||||||
| import pygame | import pygame | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,6 @@ | |||||||
| from gym import spaces | from gym import spaces | ||||||
| import numpy as np | import numpy as np | ||||||
| import pygame | import pygame | ||||||
| import math |  | ||||||
| from columbus import entities |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Observable(): | class Observable(): | ||||||
| @ -18,12 +16,6 @@ class Observable(): | |||||||
|         return spaces.Box(low=0, high=255, |         return spaces.Box(low=0, high=255, | ||||||
|                           shape=(1,), dtype=np.uint8) |                           shape=(1,), dtype=np.uint8) | ||||||
| 
 | 
 | ||||||
|     def get_observation(self): |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     def draw(self): |  | ||||||
|         pass |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class CnnObservable(Observable): | class CnnObservable(Observable): | ||||||
|     def __init__(self, in_width=256, in_height=256, out_width=32, out_height=32, draw_width=128, draw_height=128, smooth_scaling=True): |     def __init__(self, in_width=256, in_height=256, out_width=32, out_height=32, draw_width=128, draw_height=128, smooth_scaling=True): | ||||||
| @ -44,8 +36,6 @@ class CnnObservable(Observable): | |||||||
|                           shape=(self.out_width, self.out_height, 3), dtype=np.uint8) |                           shape=(self.out_width, self.out_height, 3), dtype=np.uint8) | ||||||
| 
 | 
 | ||||||
|     def get_observation(self): |     def get_observation(self): | ||||||
|         if not self.env._rendered: |  | ||||||
|             self.env.render(dont_show=True) |  | ||||||
|         self.env._ensure_surface() |         self.env._ensure_surface() | ||||||
|         x, y = self.env.agent.pos[0]*self.env.width - self.in_width / \ |         x, y = self.env.agent.pos[0]*self.env.width - self.in_width / \ | ||||||
|             2, self.env.agent.pos[1]*self.env.height - self.in_height/2 |             2, self.env.agent.pos[1]*self.env.height - self.in_height/2 | ||||||
| @ -79,66 +69,3 @@ class CnnObservable(Observable): | |||||||
| 
 | 
 | ||||||
| def _clip(num, lower, upper): | def _clip(num, lower, upper): | ||||||
|     return min(max(num, lower), upper) |     return min(max(num, lower), upper) | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class RayObservable(Observable): |  | ||||||
|     def __init__(self, num_rays=24, chans=[entities.Enemy, entities.Reward], ray_len=256): |  | ||||||
|         super(RayObservable, self).__init__() |  | ||||||
|         self.num_rays = num_rays |  | ||||||
|         self.chans = chans |  | ||||||
|         self.num_chans = len(chans) |  | ||||||
|         self.ray_len = ray_len |  | ||||||
|         self.num_steps = 32  # max = 255 |  | ||||||
|         self.occlusion = True  # previous channels block view onto later channels |  | ||||||
| 
 |  | ||||||
|     def get_observation_space(self): |  | ||||||
|         return spaces.Box(low=0, high=self.num_steps, |  | ||||||
|                           shape=(self.num_rays, self.num_chans), dtype=np.uint8) |  | ||||||
| 
 |  | ||||||
|     def _get_ray_heads(self): |  | ||||||
|         for i in range(self.num_rays): |  | ||||||
|             rad = 2*math.pi/self.num_rays*i |  | ||||||
|             yield self.ray_len*math.sin(rad), self.ray_len*math.cos(rad) |  | ||||||
| 
 |  | ||||||
|     def _check_collision(self, pos, entity_type): |  | ||||||
|         for entity in self.env.entities: |  | ||||||
|             if isinstance(entity, entity_type): |  | ||||||
|                 if entity.shape != 'circle': |  | ||||||
|                     raise Exception('Can only raycast circular entities!') |  | ||||||
|                 sq_dist = (pos[0]-entity.pos[0]*self.env.width) ** 2 \ |  | ||||||
|                     + (pos[1]-entity.pos[1]*self.env.height)**2 |  | ||||||
|                 if sq_dist < entity.radius**2: |  | ||||||
|                     return True |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
|     def get_observation(self): |  | ||||||
|         self.rays = np.zeros((self.num_rays, self.num_chans)) |  | ||||||
|         for r, (hx, hy) in enumerate(self._get_ray_heads()): |  | ||||||
|             occ_dist = self.num_steps |  | ||||||
|             for c, entity_type in enumerate(self.chans): |  | ||||||
|                 for s in range(self.num_steps): |  | ||||||
|                     if s > occ_dist: |  | ||||||
|                         break |  | ||||||
|                     sx, sy = s*hx/self.num_steps, s*hy/self.num_steps |  | ||||||
|                     rx, ry = sx + \ |  | ||||||
|                         self.env.agent.pos[0]*self.env.width, sy + \ |  | ||||||
|                         self.env.agent.pos[1]*self.env.height |  | ||||||
|                     if self._check_collision((rx, ry), entity_type): |  | ||||||
|                         self.rays[r, c] = self.num_steps-s |  | ||||||
|                         if self.occlusion: |  | ||||||
|                             occ_dist = s |  | ||||||
|                         break |  | ||||||
|         return self.rays |  | ||||||
| 
 |  | ||||||
|     def draw(self): |  | ||||||
|         for c, entity_type in enumerate(self.chans): |  | ||||||
|             for r, (hx, hy) in enumerate(self._get_ray_heads()): |  | ||||||
|                 s = self.num_steps - self.rays[r, c] |  | ||||||
|                 sx, sy = s*hx/self.num_steps, s*hy/self.num_steps |  | ||||||
|                 rx, ry = sx + \ |  | ||||||
|                     self.env.agent.pos[0]*self.env.width, sy + \ |  | ||||||
|                     self.env.agent.pos[1]*self.env.height |  | ||||||
|                 # TODO: How stupid do I want to code? |  | ||||||
|                 col = entity_type(self.env).col |  | ||||||
|                 col = int(col[0]/2), int(col[1]/2), int(col[2]/2) |  | ||||||
|                 pygame.draw.circle(self.env.screen, col, (rx, ry), 3, width=0) |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user