Exemplo n.º 1
0
    def render(self, attn_list=None, mode='human', close=False):
        # attn_list = [[teamates_attn, opp_attn] for each team]
        self.shot = False
        if mode == 'human':
            alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
            message = ''
            for agent in self.world.agents:
                comm = []
                for other in self.agents:
                    if other is agent: continue
                    if np.all(other.state.c == 0):
                        word = '_'
                    else:
                        word = alphabet[np.argmax(other.state.c)]
                    message += (other.name + ' to ' + agent.name + ': ' +
                                word + '   ')
            # print(message)

        for i in range(len(self.viewers)):
            # create viewers (if necessary)
            if self.viewers[i] is None:
                # import rendering only if we need it (and don't import for headless machines)
                # from gym.envs.classic_control import rendering
                from gym_fortattack import rendering
                self.viewers[i] = rendering.Viewer(700, 700)

        # create rendering geometry and text for the scene
        if self.render_geoms is None or True:
            # import rendering only if we need it (and don't import for headless machines)
            # from gym.envs.classic_control import rendering
            from gym_fortattack import rendering
            self.render_geoms = []
            self.render_geoms_xform = []
            self.render_texts = []
            self.render_texts_xforms = []

            # add black background for active world, border of active region/world
            xMin, xMax, yMin, yMax = self.world.wall_pos
            borPts = np.array([[xMin, yMin], [xMax, yMin], [xMax, yMax],
                               [xMin, yMax]])
            geom = rendering.make_polygon(borPts)
            xform = rendering.Transform()
            geom.add_attr(xform)
            self.render_geoms.append(geom)
            self.render_geoms_xform.append(xform)

            geom = rendering.make_circle(self.world.fortDim)
            geom.set_color(*[0, 1, 1], alpha=1)
            xform = rendering.Transform()
            geom.add_attr(xform)
            xform.set_translation(*self.world.doorLoc)
            self.render_geoms.append(geom)
            self.render_geoms_xform.append(xform)

            # ---------------- visualize attention ---------------- #
            # select reference, show attn wrt this agent
            for i, agent in enumerate(self.world.agents):
                if agent.alive or i == self.world.numGuards - 1:
                    k = i
                    break

            if self.world.vizAttn and attn_list is not None:
                # will plot attention for dead agents as well, we would know if the agents are able disregard the dead agents based of alive flag = 0
                # print('inside attn viz')
                for i, agent in enumerate(self.world.agents):
                    if agent.alive or self.world.vizDead:  # alive agents are always visualized, dead are visualized if asked
                        if i != k:
                            # if it is in the same team
                            if i < self.world.numGuards:
                                attn = attn_list[0][0][k, i]
                            else:
                                # if opponent
                                attn = attn_list[0][1][k, i -
                                                       self.world.numGuards]
                                # print('attacker')
                            geom = rendering.make_circle(agent.size *
                                                         (1 + attn))
                            xform = rendering.Transform()
                            geom.add_attr(xform)
                            xform.set_translation(*agent.state.p_pos)
                            alpha = 0.9 if agent.alive else 0.3
                            geom.set_color(*[1, 1, 0], alpha=alpha)
                            self.render_geoms.append(geom)
                            self.render_geoms_xform.append(xform)

            # visualize the dead agents
            if self.world.vizDead:
                for agent in self.world.agents:
                    # print(agent.name, agent.alive)
                    if not agent.alive:
                        geom = rendering.make_circle(agent.size)
                        xform = rendering.Transform()
                        geom.add_attr(xform)
                        xform.set_translation(*agent.state.p_pos)
                        geom.set_color(*agent.color, alpha=1)
                        head = rendering.make_circle(0.5 * agent.size)
                        head.set_color(*agent.color, alpha=1)
                        headXform = rendering.Transform()
                        head.add_attr(headXform)
                        shift = 0.8 * agent.size * np.array([
                            np.cos(agent.state.p_ang),
                            np.sin(agent.state.p_ang)
                        ])
                        headLoc = agent.state.p_pos + shift
                        headXform.set_translation(*headLoc)
                        self.render_geoms.append(head)
                        self.render_geoms_xform.append(headXform)
                        self.render_geoms.append(geom)
                        self.render_geoms_xform.append(xform)
                        self.render_texts.append(agent.name[5:])
                        self.render_texts_xforms.append(agent.state.p_pos)

            # visualize alive agents
            for entity in self.world.active_entities:  ## won't work with obstacles
                geom = rendering.make_circle(entity.size)
                xform = rendering.Transform()
                geom.add_attr(xform)
                xform.set_translation(*entity.state.p_pos)

                if 'agent' in entity.name:
                    geom.set_color(*entity.color, alpha=1)
                    head = rendering.make_circle(0.5 * entity.size)
                    head.set_color(*entity.color, alpha=1)
                    headXform = rendering.Transform()
                    head.add_attr(headXform)
                    shift = 0.8 * entity.size * np.array([
                        np.cos(entity.state.p_ang),
                        np.sin(entity.state.p_ang)
                    ])
                    headLoc = entity.state.p_pos + shift
                    headXform.set_translation(*headLoc)
                    self.render_geoms.append(head)
                    self.render_geoms_xform.append(headXform)
                    self.render_texts.append(entity.name[5:])
                    self.render_texts_xforms.append(entity.state.p_pos)
                    # print(entity.name)

                    if entity.action.shoot:
                        self.shot = True
                        ## render the laser shots, maybe add extra delay when there is a laser shot
                        v = self.world.get_tri_pts_arr(
                            entity)[:2, :].transpose()
                        laser = rendering.make_polygon(v)
                        laser.set_color(*entity.color, alpha=0.3)
                        laserXform = rendering.Transform()
                        laser.add_attr(laserXform)
                        self.render_geoms.append(laser)
                        self.render_geoms_xform.append(laserXform)

                else:
                    geom.set_color(*entity.color)

                self.render_geoms.append(geom)
                self.render_geoms_xform.append(xform)

            # dot for reference agent
            if self.world.vizAttn and attn_list is not None:
                # will plot attention for dead agents as well, we would know if the agents are able disregard the dead agents based of alive flag = 0
                # print('inside attn viz')
                for i, agent in enumerate(self.world.agents):
                    if agent.alive or self.world.vizDead:  # alive agents are always visualized, dead are visualized if asked
                        # select reference agent for attention viz
                        if i == k:
                            # simply put a black dot at the center of this agent
                            geom = rendering.make_circle(0.5 * agent.size)
                            xform = rendering.Transform()
                            geom.add_attr(xform)
                            xform.set_translation(*agent.state.p_pos)
                            geom.set_color(*0.5 * agent.color, alpha=1)
                            self.render_geoms.append(geom)
                            self.render_geoms_xform.append(xform)

            # add grey strips, corners of visualization window
            corPtsArr = [
                np.array([[xMin, yMax], [xMax, yMax], [xMax, 1], [xMin, 1]]),
                np.array([[xMin, -1], [xMax, -1], [xMax, yMin], [xMin, yMin]])
            ]
            for corPts in corPtsArr:
                geom = rendering.make_polygon(corPts)
                geom.set_color(*[0.5, 0.5, 0.5], alpha=1)
                xform = rendering.Transform()
                geom.add_attr(xform)
                self.render_geoms.append(geom)
                self.render_geoms_xform.append(xform)

                # add geoms to viewer ## viewer is object of class Viewer defined in rendering.py file inside gym_fortattack
            for viewer in self.viewers:
                viewer.geoms = []
                viewer.texts = []
                viewer.text_poses = []
                for geom in self.render_geoms:
                    viewer.add_geom(geom)
                for text, xform in zip(self.render_texts,
                                       self.render_texts_xforms):
                    viewer.add_text(text, xform)

        results = []
        for i in range(len(self.viewers)):
            from gym_fortattack import rendering
            # update bounds to center around agent
            cam_range = 1
            if self.shared_viewer:
                pos = np.zeros(self.world.dim_p)
            else:
                pos = self.agents[i].state.p_pos
            self.viewers[i].set_bounds(pos[0] - cam_range, pos[0] + cam_range,
                                       pos[1] - cam_range, pos[1] + cam_range)
            self.viewers[i].render(return_rgb_array=False)

        self.prevShot = self.shot
        return results  ## this thing is really doing nothing
Exemplo n.º 2
0
    def render(self, mode='human', close=False):
        self.shot = False
        if mode == 'human':
            alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
            message = ''
            for agent in self.world.agents:
                comm = []
                for other in self.agents:
                    if other is agent: continue
                    if np.all(other.state.c == 0):
                        word = '_'
                    else:
                        word = alphabet[np.argmax(other.state.c)]
                    message += (other.name + ' to ' + agent.name + ': ' + word + '   ')
            # print(message)

        for i in range(len(self.viewers)):
            # create viewers (if necessary)
            if self.viewers[i] is None:
                # import rendering only if we need it (and don't import for headless machines)
                #from gym.envs.classic_control import rendering
                from gym_fortattack import rendering
                self.viewers[i] = rendering.Viewer(700,700)

        # create rendering geometry
        if self.render_geoms is None or True:
            # import rendering only if we need it (and don't import for headless machines)
            #from gym.envs.classic_control import rendering
            from gym_fortattack import rendering
            self.render_geoms = []
            self.render_geoms_xform = []

            # add black background
            doorPts = np.array([[-1,1],
                                [1,1],
                                [1,-1],
                                [-1,-1]])
            geom = rendering.make_polygon(doorPts)
            # geom.set_color(*[0.35,0.35,0.85], alpha=0.5)
            xform = rendering.Transform()
            geom.add_attr(xform)
            self.render_geoms.append(geom)
            self.render_geoms_xform.append(xform)

            ## add the fort door
            doorPts = np.array([[-0.2,1],
                                [0.2,1],
                                [0.2,0.9],
                                [-0.2,0.9]])
            geom = rendering.make_polygon(doorPts)
            geom.set_color(*[0,1,1], alpha=1)
            xform = rendering.Transform()
            geom.add_attr(xform)
            self.render_geoms.append(geom)
            self.render_geoms_xform.append(xform)

            for entity in self.world.entities:  ## won't work with obstacles
                geom = rendering.make_circle(entity.size)
                xform = rendering.Transform()
                geom.add_attr(xform)
                xform.set_translation(*entity.state.p_pos)
                
                if 'agent' in entity.name:
                    geom.set_color(*entity.color, alpha=1)
                    head = rendering.make_circle(0.5*entity.size)
                    head.set_color(*entity.color, alpha=1)
                    headXform = rendering.Transform()
                    head.add_attr(headXform)
                    shift = 0.8*entity.size*np.array([np.cos(entity.state.p_ang), np.sin(entity.state.p_ang)])
                    headLoc = entity.state.p_pos+shift
                    headXform.set_translation(*headLoc)
                    self.render_geoms.append(head)
                    self.render_geoms_xform.append(headXform)

                    if entity.action.shoot:
                        self.shot = True
                        ## render the laser shots, maybe add extra delay when there is a laser shot
                        v = self.world.get_tri_pts_arr(entity)[:2,:].transpose()
                        laser = rendering.make_polygon(v)
                        laser.set_color(*entity.color, alpha=0.3)
                        laserXform = rendering.Transform()
                        laser.add_attr(laserXform)
                        self.render_geoms.append(laser)
                        self.render_geoms_xform.append(laserXform)

                else:
                    geom.set_color(*entity.color)

                self.render_geoms.append(geom)
                self.render_geoms_xform.append(xform)
                

            # add geoms to viewer
            for viewer in self.viewers:
                viewer.geoms = []
                for geom in self.render_geoms:
                    viewer.add_geom(geom)


        results = []
        for i in range(len(self.viewers)):
            from gym_fortattack import rendering
            # update bounds to center around agent
            cam_range = 1
            if self.shared_viewer:
                pos = np.zeros(self.world.dim_p)
            else:
                pos = self.agents[i].state.p_pos
            self.viewers[i].set_bounds(pos[0]-cam_range,pos[0]+cam_range,pos[1]-cam_range,pos[1]+cam_range)
            results.append(self.viewers[i].render(return_rgb_array = mode=='rgb_array'))
        if self.shot and not self.prevShot:
            mixer.music.play()
        self.prevShot = self.shot
        return results