Added visual for confidence-ellipse
This commit is contained in:
		
							parent
							
								
									61750caacf
								
							
						
					
					
						commit
						51a734607d
					
				@ -7,6 +7,7 @@ import random as random_dont_use
 | 
			
		||||
from os import urandom
 | 
			
		||||
import math
 | 
			
		||||
from columbus import entities, observables
 | 
			
		||||
import torch as th
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ColumbusEnv(gym.Env):
 | 
			
		||||
@ -47,6 +48,7 @@ class ColumbusEnv(gym.Env):
 | 
			
		||||
 | 
			
		||||
        self.paused = False
 | 
			
		||||
        self.keypress_timeout = 0
 | 
			
		||||
        self.can_accept_chol = True
 | 
			
		||||
        self.rng = random_dont_use.Random()
 | 
			
		||||
        self._seed(self.env_seed)
 | 
			
		||||
 | 
			
		||||
@ -221,6 +223,40 @@ class ColumbusEnv(gym.Env):
 | 
			
		||||
            pygame.draw.circle(self.screen, smolcol, (20+int(60*x) +
 | 
			
		||||
                                                      self.joystick_offset[0], 20+int(60*y)+self.joystick_offset[1]), 20, width=0)
 | 
			
		||||
 | 
			
		||||
    def _draw_confidence_ellipse(self, chol, seconds=1):
 | 
			
		||||
        # def draw_ellipse_angle(surface, color, rect, angle, width=0):
 | 
			
		||||
        col = (255, 255, 255)
 | 
			
		||||
        f = seconds/self.speed_fac
 | 
			
		||||
 | 
			
		||||
        if len(chol.shape) == 3:
 | 
			
		||||
            chol = chol[0]
 | 
			
		||||
 | 
			
		||||
        cov = chol.T @ chol
 | 
			
		||||
 | 
			
		||||
        L, V = th.linalg.eig(cov)
 | 
			
		||||
        L, V = L.real, V.real
 | 
			
		||||
        w, h = int(abs(L[0].item()*f))+1, int(abs(L[1].item()*f))+1
 | 
			
		||||
        # TODO: Is this correct? We try to solve for teh angle from this:
 | 
			
		||||
        # R = [[cos, -sin],[sin, cos]]
 | 
			
		||||
        # Via only the -sin term.
 | 
			
		||||
        #ang1 = int(math.acos(V[0, 0])/math.pi*360)
 | 
			
		||||
        ang2 = int(math.asin(-V[0, 1])/math.pi*360)
 | 
			
		||||
        #ang3 = int(math.asin(V[1, 0])/math.pi*360)
 | 
			
		||||
        ang = ang2
 | 
			
		||||
 | 
			
		||||
        # print(cov)
 | 
			
		||||
        #print(w, h, (ang1, ang2, ang3))
 | 
			
		||||
 | 
			
		||||
        x, y = self.agent.pos
 | 
			
		||||
        x, y = x*self.width, y*self.height
 | 
			
		||||
        rect = pygame.Rect((x-w/2, y-h/2, w, h))
 | 
			
		||||
        shape_surface = pygame.Surface(rect.size, pygame.SRCALPHA)
 | 
			
		||||
        pygame.draw.ellipse(shape_surface, col,
 | 
			
		||||
                            (0, 0, *rect.size), 1)
 | 
			
		||||
        rotated_surf = pygame.transform.rotate(shape_surface, ang)
 | 
			
		||||
        self.screen.blit(rotated_surf, rotated_surf.get_rect(
 | 
			
		||||
            center=rect.center))
 | 
			
		||||
 | 
			
		||||
    def _handle_user_input(self):
 | 
			
		||||
        for event in pygame.event.get():
 | 
			
		||||
            pass
 | 
			
		||||
@ -251,7 +287,7 @@ class ColumbusEnv(gym.Env):
 | 
			
		||||
        elif keys[pygame.K_d]:
 | 
			
		||||
            self._disturb_next = (1.0, 0.5)
 | 
			
		||||
 | 
			
		||||
    def render(self, mode='human', dont_show=False):
 | 
			
		||||
    def render(self, mode='human', dont_show=False, chol=None):
 | 
			
		||||
        self._handle_user_input()
 | 
			
		||||
        self.visible = self.visible or not dont_show
 | 
			
		||||
        self._ensure_surface()
 | 
			
		||||
@ -267,6 +303,8 @@ class ColumbusEnv(gym.Env):
 | 
			
		||||
        self.screen.blit(self.surface, (0, 0))
 | 
			
		||||
        self._draw_observable()
 | 
			
		||||
        self._draw_joystick()
 | 
			
		||||
        if chol != None:
 | 
			
		||||
            self._draw_confidence_ellipse(chol)
 | 
			
		||||
        if self.visible:
 | 
			
		||||
            pygame.display.update()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user