Ejemplo n.º 1
0
def rollout(device, vision, action, n_steps=200):
    race_config = pystk.RaceConfig(num_kart=1,
                                   track='icy_soccer_field',
                                   mode=pystk.RaceConfig.RaceMode.SOCCER)
    o = pystk.PlayerConfig(controller=pystk.PlayerConfig.Controller.AI_CONTROL,
                           team=0)
    race_config.players.append(o)
    k = pystk.Race(race_config)

    k.start()
    for i in range(5):  #Skip the first 5 steps since its the game starting
        k.step()
    try:
        data = []
        for n in range(n_steps):
            k.step()
            la = k.last_action[0]

            data.append(
                (np.array(k.render_data[0].image), (la.steer, la.acceleration,
                                                    la.brake)
                 ))  #TODO: remove /10 later 3 in this script and 1 in player
    finally:
        k.stop()
        del k
    return data
Ejemplo n.º 2
0
    def reset(self):
        self.curr_iter = 0
        self.prev_distance = 0

        #race_config = pystk.RaceConfig()
        race_config = pystk.RaceConfig(
            num_kart=6, mode=pystk.RaceConfig.RaceMode.FREE_FOR_ALL)
        race_config.players[
            0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.players[0].kart = "gnu"
        race_config.track = 'battleisland'
        race_config.step_size = 0.1

        if self.race != None:
            inst = np.asarray(self.race.render_data[0].instance) >> 24
            img = np.asarray(self.race.render_data[0].image) / 255
            #i = np.concatenate((img,inst[..., np.newaxis]), axis=2)
            i = img
            self.race.stop()
            self.race = None

        self.race = pystk.Race(race_config)
        self.race.start()
        self.race.step()

        # return obs
        inst = np.asarray(self.race.render_data[0].instance) >> 24
        img = np.asarray(self.race.render_data[0].image) / 255
        #i = np.concatenate((img,inst[..., np.newaxis]), axis=2)
        i = img
        return i
Ejemplo n.º 3
0
def rollout_agent(device, vision, action, n_steps=200):
    race_config = pystk.RaceConfig(num_kart=1,
                                   track='icy_soccer_field',
                                   mode=pystk.RaceConfig.RaceMode.SOCCER)

    k = pystk.Race(race_config)
    k.start()
    for i in range(5):  #Skip the first 5 steps since its the game starting
        k.step()
    try:
        data = []
        for n in range(n_steps):
            img = torch.tensor(np.array(k.render_data[0].image),
                               dtype=torch.float).to(device).permute(2, 0, 1)
            # heatmap = vision(img)
            # p = action(torch.sigmoid(heatmap))[0]
            p = action(img)[0]
            # print(p[0])
            k.step(
                pystk.Action(steer=float(p[0]),
                             acceleration=float(p[1]),
                             brake=float(p[2]) > 0.5))  #TODO: remove /10 later
            # print(pystk.Action(acceleration=float(p[0]), steer=float(p[1]), brake=float(p[2])>0.5))
            la = k.last_action[0]
            # print((la.acceleration, la.steer, la.brake))
            # print('end')
            data.append((np.array(k.render_data[0].image),
                         (la.steer, la.acceleration,
                          la.brake)))  #TODO: remove /10 later
    finally:
        k.stop()
        del k
    return data
Ejemplo n.º 4
0
    def __init__(self,
                 players,
                 screen_width=400,
                 screen_height=300,
                 track='icy_soccer_field'):
        assert Tournament._singleton is None, "Cannot create more than one Tournament object"
        Tournament._singleton = self

        self.graphics_config = pystk.GraphicsConfig.hd()
        self.graphics_config.screen_width = screen_width
        self.graphics_config.screen_height = screen_height
        pystk.init(self.graphics_config)

        self.race_config = pystk.RaceConfig(
            num_kart=len(players),
            track=track,
            mode=pystk.RaceConfig.RaceMode.SOCCER)
        self.race_config.players.pop()

        self.active_players = []
        for p in players:
            if p is not None:
                self.race_config.players.append(p.config)
                self.active_players.append(p)

        self.k = pystk.Race(self.race_config)

        self.k.start()
        self.k.step()
def rollout(num_players=4,
            max_steps=1000,
            track='icy_soccer_field',
            save='train_data_temp'):
    config = pystk.GraphicsConfig.hd()
    config.screen_width = 400
    config.screen_height = 300
    pystk.init(config)

    race_config = pystk.RaceConfig(num_kart=num_players,
                                   track=track,
                                   mode=pystk.RaceConfig.RaceMode.SOCCER)
    race_config.players.pop()

    if not os.path.exists(save):
        os.makedirs(save)

    for i in range(num_players):
        o = pystk.PlayerConfig(
            controller=pystk.PlayerConfig.Controller.AI_CONTROL,
            team=int((i + 1) % 2.0))
        race_config.players.append(o)

    active_players = race_config.players
    print('Number of Players', len(active_players))

    k = pystk.Race(race_config)
    k.start()
    k.step()

    # all_images = []
    all_actions = []
    state = pystk.WorldState()
    for t in range(max_steps):
        print('step:', t)
        state.update()

        s = k.step()
        t_actions = []
        for i in range(num_players):
            la = k.last_action[i]
            img = np.array(k.render_data[i].image)
            a = (img, la.steer, la.acceleration, la.brake)
            t_actions.append(a)
            if save is not None:
                PIL.Image.fromarray(img).save(
                    os.path.join(save, 'player%02d_%05d.png' % (i, t)))
                with open(os.path.join(save, 'player%02d_%05d.csv' % (i, t)),
                          mode='w') as new_data:
                    writer = csv.writer(new_data)
                    writer.writerow(a[1:])

        all_actions.append(t_actions)
        if not s:
            break
    print('score', state.soccer.score)
    return all_actions
Ejemplo n.º 6
0
def rollout(epoch=0, num_players=2, max_steps=1000, track='icy_soccer_field', save='train_data_two_players'):
    race_config = pystk.RaceConfig(num_kart=num_players, track=track, mode=pystk.RaceConfig.RaceMode.SOCCER, difficulty=2)
    race_config.players.pop()

    if not os.path.exists(save):
        os.makedirs(save)

    for i in range(num_players):
        o = pystk.PlayerConfig(controller = pystk.PlayerConfig.Controller.AI_CONTROL, team = int(i%2.0))
        race_config.players.append(o)

    active_players = race_config.players
    print('Number of Players',len(active_players))

    k = pystk.Race(race_config)
    k.start()
    try:
        k.step()

        # all_images = []
        all_actions = []
        state = pystk.WorldState()
        state.update()
        # print(dir(state.players[0].kart))
        # input()
        for t in range(max_steps):
            # print('step:',t)
            state.update()

            s = k.step()
            t_actions = []
            for i in range(num_players):
                la = k.last_action[i]
                img = np.array(k.render_data[i].image)
                a = [img, la.steer, la.acceleration, la.brake]
                a.extend(state.players[0].kart.rotation)
                a.extend(state.players[0].kart.velocity)
                a.extend(state.players[0].kart.location)
                
                t_actions.append(a)
                if save is not None:
                    PIL.Image.fromarray(img).save(os.path.join(save, 'player_%05d_%02d_%05d.png' % (epoch, i, t)))
                    with open(os.path.join(save, 'player_%05d_%02d_%05d.csv' % (epoch, i, t)), mode='w') as new_data:
                        writer = csv.writer(new_data)
                        writer.writerow(a[1:])
            
            all_actions.append(t_actions)
            if not s:
                break
        print('epoch',e,'score',state.soccer.score)
    finally:
        k.stop()
        del k
    
    return all_actions
Ejemplo n.º 7
0
    def _test(self, track, max_frames):
        config = pystk.RaceConfig(num_kart=1, laps=1)
        config.track = track
        config.players[
            0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        config.render = self.P is not None

        k = pystk.Race(config)
        try:
            state = pystk.WorldState()
            track = pystk.Track()

            k.start()
            k.step()

            last_rescue = 0
            for t in range(max_frames):
                state.update()
                track.update()

                kart = state.players[0].kart

                if kart.race_result:
                    break

                if self.P is None:
                    aim_point_world = self._point_on_track(
                        kart.distance_down_track + TRACK_OFFSET, track)
                else:
                    image = np.array(k.render_data[0].image)
                    aim_point_image = self.P(
                        TF.to_tensor(image)[None]).squeeze(0)

                    proj = np.array(state.players[0].camera.projection).T
                    view = np.array(state.players[0].camera.view).T
                    aim_point_world = self._to_world(aim_point_image, proj,
                                                     view, kart.location[1])

                aim_point_car = self._to_kart(aim_point_world, kart)
                current_vel = np.linalg.norm(kart.velocity)
                action = self.C(aim_point_car, current_vel)

                if current_vel <= 1.0 and t - last_rescue > RESCUE_TIMEOUT:
                    action.rescue = True
                    last_rescue = t

                k.step(action)
        finally:
            k.stop()
            del k
        if kart.race_result:
            return 1, '%0.1f s' % kart.finish_time
        return kart.overall_distance / track.length, '%0.1f%% done' % (
            100 * kart.overall_distance / track.length)
Ejemplo n.º 8
0
def main():
    config = pystk.GraphicsConfig.hd()
    config.screen_width = 800
    config.screen_height = 600
    pystk.init(config)

    config = pystk.RaceConfig()
    config.num_kart = 2
    # config.track ='battleisland'
    config.track = 'stadium'

    config.players[0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
    config.players[0].team = 0
    # NOTE: Add 4 players
    for _ in range(3):
        config.players.append(
            # pystk.PlayerConfig(args.kart, pystk.PlayerConfig.Controller.AI_CONTROL, (args.team + 1) % 2))
            pystk.PlayerConfig('', pystk.PlayerConfig.Controller.AI_CONTROL,
                               1))

    config.mode = config.RaceMode.THREE_STRIKES
    # TODO: Look at step size?
    # config.step_size = args.step_size

    race = pystk.Race(config)
    race.start()
    race.step()

    uis = [gui.UI(gui.VT['IMAGE']) for i in range(4)]

    state = pystk.WorldState()
    state.update()
    t0 = time()
    if not all(ui.pause for ui in uis):
        race.step(uis[0].current_action)
        state.update()
    for ui, d in zip(uis, race.render_data):
        ui.show(d)
    input('press enter to continue')

    race.stop()
    del race
    pystk.clean()
Ejemplo n.º 9
0
 def _race(self, drive, track_name, time_limit=1200):
     
     distance = 0.
     total_length = 1.0
     
     try:
         config = pystk.RaceConfig(laps=1)
         config.players[0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
         config.track = track_name
         config.step_size = 0.1
         
         race = pystk.Race(config)
         race.start()
         
         race.step()
         
         track = pystk.Track()
         track.update()
         total_length = track.length
         
         for t in range(time_limit):
             
             state = pystk.WorldState()
             state.update()
             kart = state.players[0].kart
             
             if kart.race_result:
                 distance = total_length
                 break
             
             distance = state.karts[0].distance_down_track
             
             image = 1*np.asarray(race.render_data[0].image)
             
             action = drive(image)
             
             race.step(action)
     
     finally:
         race.stop()
         del race
     
     return distance / total_length
Ejemplo n.º 10
0
    def __init__(self, track):
        config = pystk.GraphicsConfig.ld()
        config.screen_width = 64
        config.screen_height = 64
        config.render_window = False

        pystk.init(config)

        race_config = pystk.RaceConfig()
        race_config.players[0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.track = track
        race_config.step_size = 0.1
        race_config.render = True

        self.race = pystk.Race(race_config)
        self.race.start()
        self.race.step()

        self.track = pystk.Track()
        self.track.update()
Ejemplo n.º 11
0
    def start(self, config: pystk.RaceConfig = None, track_name='lighthouse'):

        if config is None:
            config = pystk.RaceConfig()
            config.players[
                0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
            config.track = track_name
            config.step_size = 0.1

        if self.race is not None:
            self.race.stop()
            del self.race

        self.config = config

        self.race = pystk.Race(config)
        self.race.start()

        self.track = pystk.Track()
        self.track.update()
Ejemplo n.º 12
0
    def _race(self, drive, track_name, time_limit=1200):

        total_length = 1.0

        score = 0.

        try:
            config = pystk.RaceConfig(
                num_kart=6,
                track=track_name,
                mode=pystk.RaceConfig.RaceMode.FREE_FOR_ALL)
            config.players[
                0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
            config.step_size = 0.1

            race = pystk.Race(config)
            race.start()
            race.step()

            for t in range(time_limit):

                state = pystk.WorldState()
                state.update()

                scores = state.ffa.scores
                kart = state.players[0].kart

                action = drive(np.asarray(race.render_data[0].image), kart)

                race.step(action)

            rank = sorted(scores, reverse=True).index(scores[kart.id])
            score = {0: 10, 1: 8, 2: 6}.get(rank, 7 - rank)

        finally:
            race.stop()
            del race

        return score / 10.
Ejemplo n.º 13
0
    def __init__(self, track: str):
        config = pystk.GraphicsConfig.ld()
        config.screen_width = 64
        config.screen_height = 64
        config.render_window = False

        pystk.init(config)

        race_config = pystk.RaceConfig()
        race_config.num_kart = 4

        race_config.players[
            0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.players[0].team = 0

        race_config.players[
            1].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.players[1].team = 0

        race_config.players[
            2].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.players[2].team = 1

        race_config.players[
            3].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
        race_config.players[2].team = 1

        race_config.track = track
        race_config.step_size = 0.1
        race_config.render = False
        race_config.mode = race_config.RaceMode.THREE_STRIKES

        self.race = pystk.Race(race_config)

        self.race.start()
        self.race.step()

        self.track = pystk.Track()
        self.track.update()
    def rollout(self,
                track,
                controller,
                planner=None,
                max_frames=1000,
                verbose=False,
                data_callback=None):
        """
        Play a level (track) for a single round.
        :param track: Name of the track
        :param controller: low-level controller, see controller.py
        :param planner: high-level planner, see planner.py
        :param max_frames: Maximum number of frames to play for
        :param verbose: Should we use matplotlib to show the agent drive?
        :param data_callback: Rollout calls data_callback(time_step, image, 2d_aim_point) every step, used to store the
                              data
        :return: Number of steps played
        """
        do_render = verbose or planner is not None or data_callback is not None
        if self.k is not None and self.k.config.track == track and do_render == self.k.config.render:
            self.k.restart()
            self.k.step()
        else:
            if self.k is not None:
                self.k.stop()
                del self.k
            config = pystk.RaceConfig(num_kart=1,
                                      laps=1,
                                      render=do_render,
                                      track=track)
            config.players[
                0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL

            self.k = pystk.Race(config)
            self.k.start()
            self.k.step()

        state = pystk.WorldState()
        track = pystk.Track()

        last_rescue = 0

        if verbose:
            import matplotlib.pyplot as plt
            fig, ax = plt.subplots(1, 1)

        for t in range(max_frames):

            state.update()
            track.update()

            kart = state.players[0].kart

            if np.isclose(kart.overall_distance / track.length, 1.0,
                          atol=2e-3):
                if verbose:
                    print("Finished at t=%d" % t)
                break

            proj = np.array(state.players[0].camera.projection).T
            view = np.array(state.players[0].camera.view).T

            if data_callback is not None:
                aim_point_world = self._point_on_track(
                    kart.distance_down_track + 20, track)
                ap = self._to_image(aim_point_world, proj, view)
                if 0 <= ap[0] < self.config.screen_width and 0 <= ap[
                        1] < self.config.screen_height:
                    data_callback(t, np.array(self.k.render_data[0].image), ap)

            if planner:
                image = np.array(self.k.render_data[0].image)
                aim_point_image = planner(TF.to_tensor(image)[None]).squeeze(0)
                aim_point_world = self._to_world(aim_point_image, proj, view,
                                                 kart.location[1])
            else:
                aim_point_world = self._point_on_track(
                    kart.distance_down_track + TRACK_OFFSET, track)

            aim_point_car = self._to_kart(aim_point_world, kart)
            current_vel = np.linalg.norm(kart.velocity)
            action = controller(aim_point_car, current_vel)

            if current_vel < 1.0 and t - last_rescue > RESCUE_TIMEOUT:
                last_rescue = t
                action.rescue = True

            if verbose:
                ax.clear()
                ax.imshow(self.k.render_data[0].image)
                ax.add_artist(
                    plt.Circle(self._to_image(kart.location, proj, view),
                               2,
                               ec='b',
                               fill=False,
                               lw=1.5))
                ax.add_artist(
                    plt.Circle(self._to_image(aim_point_world, proj, view),
                               2,
                               ec='r',
                               fill=False,
                               lw=1.5))
                if planner:
                    ap = self._point_on_track(
                        kart.distance_down_track + TRACK_OFFSET, track)
                    ax.add_artist(
                        plt.Circle(self._to_image(ap, proj, view),
                                   2,
                                   ec='g',
                                   fill=False,
                                   lw=1.5))
                plt.pause(1e-3)

            self.k.step(action)
            t += 1
        return t
    def rollout(self,
                track,
                controller,
                planner=None,
                max_frames=1000,
                verbose=False,
                data_callback=None):
        """
        Play a level (track) for a single round.
        :param track: Name of the track
        :param controller: low-level controller, see controller.py
        :param planner: high-level planner, see planner.py
        :param max_frames: Maximum number of frames to play for
        :param verbose: Should we use matplotlib to show the agent drive?
        :param data_callback: Rollout calls data_callback(time_step, image, 2d_aim_point) every step, used to store the
                              data
        :return: Number of steps played
        """
        if self.k is not None and self.k.config.track == track:
            self.k.restart()
            self.k.step()
        else:
            if self.k is not None:
                self.k.stop()
                del self.k
            config = pystk.RaceConfig(num_kart=1,
                                      laps=1,
                                      render=True,
                                      track=track)
            config.players[
                0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL

            self.k = pystk.Race(config)
            self.k.start()
            self.k.step()

        state = pystk.WorldState()
        track = pystk.Track()

        last_rescue = 0

        if verbose and not ON_COLAB:
            import matplotlib.pyplot as plt
            fig, ax = plt.subplots(1, 1)
        elif verbose and ON_COLAB:
            global COLAB_IMAGES
            COLAB_IMAGES = list()

        for t in range(max_frames):

            state.update()
            track.update()

            kart = state.players[0].kart

            if np.isclose(kart.overall_distance / track.length, 1.0,
                          atol=2e-3):
                if verbose:
                    print("Finished at t=%d" % t)
                break

            proj = np.array(state.players[0].camera.projection).T
            view = np.array(state.players[0].camera.view).T

            aim_point_world = self._point_on_track(
                kart.distance_down_track + TRACK_OFFSET, track)
            aim_point_image = self._to_image(aim_point_world, proj, view)
            aim_point = aim_point_image

            if data_callback is not None:
                data_callback(t, np.array(self.k.render_data[0].image),
                              aim_point_image)

            if planner:
                image = np.array(self.k.render_data[0].image)
                aim_point = planner(TF.to_tensor(image)[None]).squeeze(
                    0).cpu().detach().numpy()

            current_vel = np.linalg.norm(kart.velocity)
            action = controller(aim_point, current_vel)

            if current_vel < 1.0 and t - last_rescue > RESCUE_TIMEOUT:
                last_rescue = t
                action.rescue = True

            if verbose and not ON_COLAB:
                ax.clear()
                ax.imshow(self.k.render_data[0].image)
                WH2 = np.array(
                    [self.config.screen_width, self.config.screen_height]) / 2
                ax.add_artist(
                    plt.Circle(WH2 *
                               (1 + self._to_image(kart.location, proj, view)),
                               2,
                               ec='b',
                               fill=False,
                               lw=1.5))
                ax.add_artist(
                    plt.Circle(
                        WH2 *
                        (1 + self._to_image(aim_point_world, proj, view)),
                        2,
                        ec='r',
                        fill=False,
                        lw=1.5))
                if planner:
                    ap = self._point_on_track(
                        kart.distance_down_track + TRACK_OFFSET, track)
                    ax.add_artist(
                        plt.Circle(WH2 * (1 + aim_point_image),
                                   2,
                                   ec='g',
                                   fill=False,
                                   lw=1.5))
                plt.pause(1e-3)
            elif verbose and ON_COLAB:
                from PIL import Image, ImageDraw
                image = Image.fromarray(self.k.render_data[0].image)
                draw = ImageDraw.Draw(image)

                WH2 = np.array(
                    [self.config.screen_width, self.config.screen_height]) / 2

                p = (aim_point_image + 1) * WH2
                draw.ellipse((p[0] - 2, p[1] - 2, p[0] + 2, p[1] + 2),
                             fill=(255, 0, 0))
                if planner:
                    p = (aim_point + 1) * WH2
                    draw.ellipse((p[0] - 2, p[1] - 2, p[0] + 2, p[1] + 2),
                                 fill=(0, 255, 0))

                COLAB_IMAGES.append(np.array(image))

            self.k.step(action)
            t += 1

        if verbose and ON_COLAB:
            show_on_colab()

        return t, kart.overall_distance / track.length
Ejemplo n.º 16
0
    parser.add_argument('-n', '--num_player', type=int, default=1)
    args = parser.parse_args()

    for config in [pystk.GraphicsConfig.ld(), pystk.GraphicsConfig.sd(), pystk.GraphicsConfig.hd(), None]:
        print(config)
        t0 = time()
        render = True
        if config is None:
            config = pystk.GraphicsConfig.ld()
            render = False
        config.screen_width = 320
        config.screen_height = 240
        pystk.init(config)
        init_time, t0 = time() - t0, time()

        config = pystk.RaceConfig(render=render)
        if args.kart != '':
            config.players[0].kart = args.kart
        if args.track is not None:
            config.track = args.track
        if args.step_size is not None:
            config.step_size = args.step_size
        for i in range(1, args.num_player):
            config.players.append(pystk.PlayerConfig(args.kart, pystk.PlayerConfig.Controller.AI_CONTROL))

        race = pystk.Race(config)
        race_time, t0 = time() - t0, time()

        race.start()
        race.step()
        start_time, t0 = time() - t0, time()
Ejemplo n.º 17
0
    parser.add_argument('-n', '--num_player', type=int, default=1)
    parser.add_argument('-v', '--visualization', type=str, choices=list(gui.VT.__members__), nargs='+',
                        default=['IMAGE'])
    parser.add_argument('--verbose', action='store_true')
    parser.add_argument('--save_dir', type=Path, required=False)
    args = parser.parse_args()

    if args.save_dir:
        args.save_dir.mkdir(parents=True, exist_ok=True)

    config = pystk.GraphicsConfig.hd()
    config.screen_width = 400
    config.screen_height = 300
    pystk.init(config)

    config = pystk.RaceConfig()
    config.num_kart = 2
    if args.kart is not None:
        config.players[0].kart = args.kart

    config.players[0].controller = pystk.PlayerConfig.Controller.PLAYER_CONTROL
    config.players[0].team = args.team

    for i in range(1, args.num_player):
        config.players.append(
                pystk.PlayerConfig(args.kart, pystk.PlayerConfig.Controller.AI_CONTROL, (args.team + 1) % 2))

    if args.track is not None:
        config.track = args.track
        if args.track in soccer_tracks:
            config.mode = config.RaceMode.SOCCER
Ejemplo n.º 18
0
import pystk


def test(o):
    from pickle import dumps, loads
    print(o)
    s = dumps(o)
    print(len(s))
    print(loads(s))


test(pystk.GraphicsConfig.ld())
test(pystk.RaceConfig())

pystk.init(pystk.GraphicsConfig.ld())
config = pystk.RaceConfig()
k = pystk.Race(config)

k.start()

state = pystk.WorldState()
track = pystk.Track()

for it in range(10):
    k.step()
    state.update()
    track.update()
    test(state)
    test(track)
    test(k.last_action)
    test(k.render_data)