コード例 #1
0
    def rollout(self,
                drive,
                reward_func,
                max_step: float = 1200,
                restart: bool = True):
        """
        :param return_data: what data should we return? 'action', 'image', 'next_image', 'done', 'reward'
        :return:
        """

        import collections
        Data = collections.namedtuple('Data',
                                      'action image reward done next_image')
        assert self.race is not None, "You need to start the case before the rollout"

        if restart:
            self.race.restart()

        self.race.step()

        action = pystk.Action()
        result = []

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

        i = 1 * np.asarray(self.race.render_data[0].image)

        total_reward = 0.

        for it in range(max_step):

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

            a = drive(i)

            self.race.step(a)

            next_i = 1 * np.asarray(self.race.render_data[0].image)

            d = (it + 1 == max_step)  # Feel free to experiment with this
            r = reward_func(state)
            total_reward += r

            result.append(
                Data(image=i, action=a, reward=r, next_image=next_i, done=d))

            i = next_i

            if d:
                break

        return result, total_reward
コード例 #2
0
ファイル: utils.py プロジェクト: javadba/deepteam
    def play(self, save=None, max_frames=50):
        state = pystk.WorldState()
        track = pystk.Track()
        if save is not None:
            import PIL.Image
            import os
            if not os.path.exists(save):
                os.makedirs(save)

        for t in range(max_frames):
            print('\rframe %d' % t, end='\r')

            state.update()
            #print(state.soccer.ball.location)
            #print(state.soccer.goal_line)

            #goal_line = False
            #opposing_goal = state.soccer.goal_line[:-1]
            #goal_target = []
            #if goal_line == True:
             #   goal_target = [statistics.mean([opposing_goal[0][0][0], opposing_goal[0][1][0]]), statistics.mean([opposing_goal[0][0][1], opposing_goal[0][1][1]]),statistics.mean([opposing_goal[0][0][2], opposing_goal[0][1][2]]), ]

            list_actions = []
            for i, p in enumerate(self.active_players):
                kart = state.players[i].kart
                aim_point_world = state.soccer.ball.location
                proj = np.array(state.players[i].camera.projection).T
                view = np.array(state.players[i].camera.view).T
                aim_point_image = self._to_image(aim_point_world, proj, view)
                player = state.players[i]
                image = np.array(self.k.render_data[i].image)
                
                action = pystk.Action()
                player_action = p(image, player)
                for a in player_action:
                    setattr(action, a, player_action[a])
                
                list_actions.append(action)

                if save is not None:
                    PIL.Image.fromarray(image).save(os.path.join(save, 'player%02d_%05d.png' % (i, t)))
                    dest = os.path.join(save, 'player%02d_%05d' % (i, t))
                    with open(dest + '.csv', 'w') as f:
                        f.write('%0.1f,%-0.1f' % tuple(aim_point_image))

            s = self.k.step(list_actions)
            if not s:  # Game over
                break

        if save is not None:
            import subprocess
            for i, p in enumerate(self.active_players):
                dest = os.path.join(save, 'player%02d' % i)
                output = save + '_player%02d.mp4' % i
                subprocess.call(['ffmpeg', '-y', '-framerate', '10', '-i', dest + '_%05d.png', output])


        if hasattr(state, 'soccer'):
            return state.soccer.score
        return state.soccer_score
コード例 #3
0
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
コード例 #4
0
    def play(self, save=None, max_frames=50):
        state = pystk.WorldState()
        # soccer = pystk.Soccer()
        # soccer_ball = pystk.SoccerBall()
        if save is not None:
            import PIL.Image
            import os
            if not os.path.exists(save):
                os.makedirs(save)
        time = datetime.now()
        for t in range(max_frames):
            # print('\rframe %d' % t, end='\r')
            print('\rframe {} time {}'.format(t,
                                              (datetime.now() - time).seconds),
                  end='\r')
            state.update()

            list_actions = []
            for i, p in enumerate(self.active_players):
                player = state.players[i]
                image = np.array(self.k.render_data[i].image)

                action = pystk.Action()
                player_action = p(image, player)
                for a in player_action:
                    setattr(action, a, player_action[a])

                list_actions.append(action)

                if save is not None:
                    PIL.Image.fromarray(image).save(
                        os.path.join(save, 'player%02d_%05d.png' % (i, t)))

            s = self.k.step(list_actions)
            if not s:  # Game over
                break
            # print(state.soccer.score)
            # print(state.soccer.ball.location)
            # print(state.soccer.goal_line)
            # print(state.karts[0].location)
            # print(dir(state.karts[0]))
            # print(t)
            # print('end')

        if save is not None:
            import subprocess
            for i, p in enumerate(self.active_players):
                dest = os.path.join(save, 'player%02d' % i)
                output = save + '_player%02d.mp4' % i
                subprocess.call([
                    'ffmpeg', '-y', '-framerate', '10', '-i',
                    dest + '_%05d.png', output
                ])
        if hasattr(state, 'soccer'):
            return state.soccer.score
        return state.soccer_score
コード例 #5
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
コード例 #6
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)
コード例 #7
0
    def play(self, save=None, max_frames=50):
        state = pystk.WorldState()
        if save is not None:
            import PIL.Image
            import os
            if not os.path.exists(save):
                os.makedirs(save)

        for t in range(max_frames):
            print('\rframe %d' % t, end='\r')

            state.update()

            list_info = []
            list_actions = []
            for i, p in enumerate(self.active_players):
                player = state.players[i]
                image = np.array(self.k.render_data[i].image)

                action = pystk.Action()
                player_action = p(image, player)
                for a in player_action:
                    setattr(action, a, player_action[a])

                list_actions.append(action)

                if save is not None:
                    PIL.Image.fromarray(image).save(
                        os.path.join(save, 'player%02d_%05d.png' % (i, t)))
            # self.uis[players.kart.player_id].show(self.k.render_data[players.kart.player_id])
            # list_info = []
            s = self.k.step(list_actions)
            if not s:  # Game over
                break
            # step 2 viz
            # for ui, d in zip(self.uis, self.k.render_data):
            #     ui.show(d)
        if save is not None:
            import subprocess
            for i, p in enumerate(self.active_players):
                dest = os.path.join(save, 'player%02d' % i)
                output = save + '_player%02d.mp4' % i
                subprocess.call([
                    'ffmpeg', '-y', '-framerate', '10', '-i',
                    dest + '_%05d.png', output
                ])
        if hasattr(state, 'soccer'):
            return state.soccer.score
        return state.soccer_score
コード例 #8
0
    def step(self, action):
        self.curr_iter += 1

        steer_dir = action[0]
        gas = action[1]
        brake = action[2]
        fire = action[3]
        #rescue = action[1]
        action = pystk.Action(steer=steer_dir,
                              acceleration=gas,
                              brake=brake,
                              fire=fire)  # , rescue=rescue)
        self.race.step(action)
        self.race.step(action)
        self.race.step(action)
        self.race.step(action)
        self.race.step(action)
        self.race.step(action)
        self.race.step(action)

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

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

        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

        new_distance = state.karts[0].distance_down_track
        delta = new_distance - self.prev_distance
        is_stuck = (self.curr_iter > 10) and delta < 0.001

        done = (self.curr_iter == self.max_step) or is_stuck

        # if self.curr_iter % 6 == 0:
        self.prev_distance = new_distance

        # return <obs>, <reward: float>, <done: bool>, <info: dict>
        return i, reward, done, {}
コード例 #9
0
ファイル: test.py プロジェクト: benhoff/pystk
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()
コード例 #10
0
ファイル: tests.py プロジェクト: ahmchua/dl-proj5
 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
コード例 #11
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.
コード例 #12
0
    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
コード例 #13
0
    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
コード例 #14
0
    if args.track is not None:
        config.track = args.track
        if args.track in soccer_tracks:
            config.mode = config.RaceMode.SOCCER
    if args.step_size is not None:
        config.step_size = args.step_size

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

    uis = [gui.UI([gui.VT[x] for x in args.visualization]) for i in range(args.num_player)]
    save_depth = "DEPTH" in args.visualization
    save_labels = "SEMANTIC" in args.visualization or "INSTANCE" in args.visualization

    state = pystk.WorldState()
    t0 = time()
    n = 0
    while all(ui.visible for ui in uis):
        if not all(ui.pause for ui in uis):
            race.step(uis[0].current_action)
            state.update()
            if args.verbose and config.mode == config.RaceMode.SOCCER:
                print('Score ', state.soccer.score)
                print('      ', state.soccer.ball)
                print('      ', state.soccer.goal_line)

        for ui, d in zip(uis, race.render_data):
            ui.show(d)

        if args.save_dir:
コード例 #15
0
ファイル: rollout.py プロジェクト: bradyz/supertuxkart_rl
    def rollout(
            self,
            policy: policy.BasePolicy,
            max_step: float = 100,
            frame_skip: int = 0,
            gamma: float = 1.0):
        self.race.restart()
        self.race.step(pystk.Action())
        self.track.update()

        result = list()

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

        r_total = 0
        d = state.karts[0].distance_down_track
        s = np.array(self.race.render_data[0].image)

        off_track = deque(maxlen=20)
        traveled = deque(maxlen=50)

        for it in range(max_step):
            # Early termination.
            if it > 20 and (np.median(traveled) < 0.05 or all(off_track)):
                break

            v = np.linalg.norm(state.karts[0].velocity)
            action, action_i, p_action = policy(s, v)

            if isinstance(action, pystk.Action):
                action_raw = [action.steer, action.acceleration, action.drift]
            else:
                action_raw = action

                action = pystk.Action()
                action.steer = action_raw[0]
                action.acceleration = np.clip(action_raw[1] - v, 0, np.inf)
                action.drift = action_raw[2] > 0.5

            for _ in range(1 + frame_skip):
                self.race.step(action)
                self.track.update()

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

            s_p = np.array(self.race.render_data[0].image)

            d_new = min(state.karts[0].distance_down_track, d + 5.0)
            node_idx = np.searchsorted(
                    self.track.path_distance[:, 1],
                    d_new % self.track.path_distance[-1, 1]) % len(self.track.path_nodes)
            a_b = self.track.path_nodes[node_idx]

            distance = point_from_line(state.karts[0].location, a_b[0], a_b[1])
            distance_traveled = get_distance(d_new, d, self.track.path_distance[-1, 1])
            gain = distance_traveled if distance_traveled > 0 else 0
            mult = int(distance < 6.0)

            traveled.append(gain)
            off_track.append(distance > 6.0)

            r_total = max(r_total, d_new * mult)
            r = np.clip(0.5 * max(mult * gain, 0) + 0.5 * mult, -1.0, 1.0)

            result.append(
                    Data(
                        s.copy(),
                        np.float32(action_raw),
                        np.uint8([action_i]), np.float32([p_action]),
                        np.float32([r]), s_p.copy(),
                        np.float32([np.nan]),
                        np.float32([0])))

            d = d_new
            s = s_p

        G = 0

        # Ugly.
        for i, data in enumerate(reversed(result)):
            G = data.r + gamma * G
            result[-(i + 1)] = Data(
                    data.s,
                    data.a, data.a_i, data.p_a,
                    data.r, data.sp,
                    np.float32([G]),
                    np.float32([i == 0]))

        # HACK PLEASE REMEMBER THIS
        return result[4:], r_total / self.track.path_distance[-1, 1]
コード例 #16
0
ファイル: utils.py プロジェクト: cook-jeremy/pytux_nn
    def play(self, save=None, max_frames=50, save_callback=None):
        global SAVE_COUNT, SAVE_AT
        state = pystk.WorldState()

        if save is not None:
            import PIL.Image
            if not os.path.exists(save):
                os.makedirs(save)

        # turn on interactive mode for controller visualization
        plt.ion()

        for t in range(max_frames):
            print('\rframe %d' % t, end='\r')

            state.update()
            list_actions = []

            for i, p in enumerate(self.active_players):
                HACK_DICT['race'] = self.k
                HACK_DICT['render_data'] = self.k.render_data[i]
                HACK_DICT['kart'] = state.karts[i]
                HACK_DICT['state'] = state

                #print('kart: ', state.karts[i].name, '\t\t max_steer: ', "{:.4f}".format(state.karts[i].max_steer_angle))

                player = state.players[i]
                image = np.array(self.k.render_data[i].image)

                action = pystk.Action()
                player_action = p(image, player)
                for a in player_action:
                    setattr(action, a, player_action[a])

                list_actions.append(action)

                if save is not None:
                    im = PIL.Image.fromarray(image)
                    #draw = ImageDraw.Draw(im)
                    #draw.text((0, 0),"Sample Text",(255,255,255))
                    im.save(os.path.join(save, 'player%02d_%05d.png' % (i, t)))

            for i, action in enumerate(list_actions):
                HACK_DICT['player_%d' % i] = {
                    'steer': action.steer,
                    'acceleration': action.acceleration
                }

            if save_callback is not None:
                save_callback(self.k, state, t, HACK_DICT)

            SAVE_COUNT += 1

            s = self.k.step(list_actions)
            if not s:  # Game over
                break

        if save is not None:
            import subprocess
            for i, p in enumerate(self.active_players):
                dest = os.path.join(save, 'player%02d' % i)
                output = 'videos/_player%02d.mp4' % i
                subprocess.call([
                    'ffmpeg', '-y', '-framerate', '10', '-i',
                    dest + '_%05d.png', output
                ])

        if hasattr(state, 'soccer'):
            return state.soccer.score
        return state.soccer_score
コード例 #17
0
ファイル: player.py プロジェクト: KirbyCake/MachineLearning
    def act(self, image, player_info):
        world = pystk.WorldState()
        world.update()
        kart0 = world.karts[2]
        pos_ball = to_numpy(world.soccer.ball.location)
        pos_me1 = to_numpy(kart0.location)
        """
        Set the action given the current image
        :param image: numpy array of shape (300, 400, 3)
        :param player_info: pystk.Player object for the current kart.
        return: Dict describing the action
        """
        # pos_me[1] is up and down
        action = {
            'acceleration': 0,
            'brake': False,
            'drift': False,
            'nitro': False,
            'rescue': False,
            'steer': 0
        }
        angle_kart1 = quaternion_to_euler(kart0.rotation[0], kart0.rotation[1],
                                          kart0.rotation[2], kart0.rotation[3])
        angle_puck = math.degrees(
            math.atan((pos_ball[0] - pos_me1[0]) / (pos_ball[1] - pos_me1[1])))
        # print(pos_ball[0]-pos_me[0])
        # print(pos_ball[1]-pos_me[1])
        # print(pos_ball[1], pos_me[1], pos_ball[0], pos_me[0])
        # print(angle_puck)
        # print(angle_kart)
        # print(pos_me1[1])
        global forward
        if pos_ball[1] - pos_me1[1] > 10 and abs(angle_kart1 -
                                                 angle_puck) < 20:
            forward = 1
        if pos_ball[1] - pos_me1[1] > 15 and abs(angle_kart1 -
                                                 angle_puck) < 40:
            forward = 1
        if pos_ball[1] - pos_me1[1] > 25 or abs(angle_kart1 - angle_puck) < 15:
            forward = 1
        if pos_ball[1] - pos_me1[
                1] > 0 and angle_kart1 < angle_puck and forward == 1:
            action['steer'] = 1
            action['acceleration'] = 1
        if pos_ball[1] - pos_me1[
                1] > 0 and angle_kart1 > angle_puck and forward == 1:
            action['steer'] = -1
            action['acceleration'] = 1
        if pos_ball[1] - pos_me1[1] < 0 and angle_kart1 > 0:
            forward = 0
            action['steer'] = 1
            action['brake'] = True
            action['acceleration'] = 0
        if pos_ball[1] - pos_me1[1] < 0 and angle_kart1 < 0:
            forward = 0
            action['steer'] = -1
            action['brake'] = True
            action['acceleration'] = 0
        if forward == 0 and angle_kart1 > 0:
            action['steer'] = 1
            action['brake'] = True
            action['acceleration'] = 0
        if forward == 0 and angle_kart1 < 0:
            action['steer'] = -1
            action['brake'] = True
            action['acceleration'] = 0
        # if angle_kart1 > 80:
        #     action['acceleration'] = .7
        # if angle_kart1 < -80:
        #     action['acceleration'] = .7
        # if world.karts[0].velocity == 0 and angle_kart1 < 0:
        #     action['steer'] = -1
        #     action['brake'] = True
        #     action['acceleration'] = 0
        # if world.karts[0].velocity == 0 and angle_kart1 > 0:
        #     action['steer'] = 1
        #     action['brake'] = True
        #     action['acceleration'] = 0
        # if angle_puck > 80:
        #     action['steer'] = 1
        #     action['brake'] = True
        #     action['acceleration'] = 0
        # if angle_puck < -80:
        #     action['steer'] = -1
        #     action['brake'] = True
        #     action['acceleration'] = 0
        """
        Your code here.
        """

        return action
コード例 #18
0
    def play(self, save=None, max_frames=50):
        state = pystk.WorldState()
        import PIL.Image
        import os
        prev_score = [0, 0]
        for t in range(max_frames):
            #print('\rframe %d' % t, end='\r')

            state.update()

            #print some info
            test = True
            if test:
                #print('soccer ball location', state.soccer.ball.location)
                #print('soccer ball location', state.soccer.ball.location[1])
                #print('soccer ball location', state.soccer.ball.location[2])
                #print('kart 1 location', state.karts[0].location)
                #print('kart 2 location', state.karts[1].location)
                #print('kart 3 location', state.karts[2].location)
                #print('kart 4 location', state.karts[3].location)
                #print('score', state.soccer.score)
                if prev_score != state.soccer.score:
                    print("Scored: ", state.soccer.score, " at frame ", t)
                    prev_score = state.soccer.score
                """
                goal = state.soccer.goal_line[0][0]
                print('Goal Poistion: ', goal[0],",", goal[1], ",",goal[2])
                goal1 = state.soccer.goal_line[0][1]
                print('Goal Poistion: ', goal1[0],",", goal1[1], ",",goal1[2])
                """
                #for kart in state.karts:
                #print(kart.location)
                #print('goal line', state.soccer.goal_line[0][0])
                #print('goal line', state.soccer.goal_line[0][0][0])
                #print('goal line', state.soccer.goal_line[0][0][1])
                #print('goal line', state.soccer.goal_line[0][0][2])

                #print("Soccer location: ", state.soccer.ball.location)
                #aim_point_car = self._to_kart(np.array(state.soccer.ball.location), state.karts[0])
                #print("Soccer location to car: ", aim_point_car )

            list_actions = []
            for i, p in enumerate(self.active_players):
                player = state.players[i]

                image = np.array(self.k.render_data[i].image)

                action = pystk.Action()
                #print('soccer ball location', state.soccer.ball.location)
                #player_action = p( state.soccer, player)
                player_action = p(image, player, state.soccer.ball.location)
                for a in player_action:
                    setattr(action, a, player_action[a])

                list_actions.append(action)

                proj = np.array(player.camera.projection).T
                view = np.array(player.camera.view).T
                # print(state.players)

                #Generate labels for training sets
                aim_point_world_soccer = state.soccer.ball.location
                aps = self._to_image(aim_point_world_soccer, proj, view)
                #print(state.soccer.goal_line )

                list = [[
                    state.soccer.ball.size / 2, 0.18,
                    state.soccer.ball.size / 2
                ],
                        [
                            state.soccer.ball.size / 2, 0.18,
                            -state.soccer.ball.size / 2
                        ],
                        [
                            state.soccer.ball.size / 2, -0.18,
                            state.soccer.ball.size / 2
                        ],
                        [
                            state.soccer.ball.size / 2, -0.18,
                            -state.soccer.ball.size / 2
                        ],
                        [
                            -state.soccer.ball.size / 2, 0.18,
                            state.soccer.ball.size / 2
                        ],
                        [
                            -state.soccer.ball.size / 2, 0.18,
                            -state.soccer.ball.size / 2
                        ],
                        [
                            -state.soccer.ball.size / 2, -0.18,
                            state.soccer.ball.size / 2
                        ],
                        [
                            -state.soccer.ball.size / 2, -0.18,
                            -state.soccer.ball.size / 2
                        ]]

                width1 = 400
                width2 = 0
                height1 = 300
                height2 = 0
                for item in list:
                    aps_flex = self._to_image([
                        aim_point_world_soccer[0] + item[0],
                        aim_point_world_soccer[1] + item[1],
                        aim_point_world_soccer[2] + item[2]
                    ], proj, view)
                    if width1 > aps_flex[0]:
                        width1 = aps_flex[0]
                    if width2 < aps_flex[0]:
                        width2 = aps_flex[0]
                    if height1 > aps_flex[1]:
                        height1 = aps_flex[1]
                    if height2 < aps_flex[1]:
                        height2 = aps_flex[1]

                player_x = player.kart.location[0]
                player_y = player.kart.location[2]
                front_x = player.kart.front[0]
                front_y = player.kart.front[2]
                ball_x = aim_point_world_soccer[0]
                ball_y = aim_point_world_soccer[2]

                vector_self = [front_x - player_x, front_y - player_y]
                vector_ball = [ball_x - player_x, ball_y - player_y]

                dot_prod = vector_self[0] * vector_ball[0] + vector_self[
                    1] * vector_ball[1]

                if dot_prod > 0 and 0 <= aps[
                        0] < self.graphics_config.screen_width and 0 <= aps[
                            1] < self.graphics_config.screen_height and -30 < player.kart.location[
                                0] < 30 and -55 < player.kart.location[2] < 55:
                    if (width2 - width1) * (height2 - height1) > 40:
                        # print([[width1, height1, width2, height2]])
                        PIL.Image.fromarray(image).save(
                            os.path.join('dense_data/train/',
                                         'player%02d_%05d.png' % (i, t)))
                        np.savez(os.path.join('dense_data/train/',
                                              'player%02d_%05d' % (i, t)) +
                                 '.npz',
                                 puck=[[width1, height1, width2, height2]])
                        '''
                        # with open(os.path.join(save, 'player%02d_%05d' % (i, t)) + '.csv', 'w') as f:
                        #     f.write('%0.3f,%0.3f,%0.3f,%0.3f,%0.3f,%0.3f' % (
                        #         state.soccer.ball.location[0],state.soccer.ball.location[1], state.soccer.ball.location[2],
                        #         state.soccer.goal_line[0][0][0], state.soccer.goal_line[0][0][1], state.soccer.goal_line[0][0][2]
                        #     ))
                        '''
                        '''
                        f.write('%0.3f %0.3f %0.3f %0.3f %0.3f %0.3f' %tuple(state.soccer.ball.location), tuple(state.soccer.goal_line[0][0])))
                        '''

            s = self.k.step(list_actions)
            if not s:  # Game over
                break

        if save is not None:
            import subprocess
            for i, p in enumerate(self.active_players):
                dest = os.path.join(save, 'player%02d' % i)
                output = save + '_player%02d.mp4' % i
                subprocess.call([
                    'ffmpeg', '-y', '-framerate', '10', '-i',
                    dest + '_%05d.png', output
                ])
        if hasattr(state, 'soccer'):
            return state.soccer.score
        return state.soccer_score