예제 #1
0
def collect(client, args):
    """
    The main loop for the data collection process.
    Args:
        client: carla client object
        args: arguments passed on the data collection main.
    Returns:
        None
    """
    # Here we instantiate a sample carla settings. The name of the configuration should be
    # passed as a parameter.
    settings_module = __import__('dataset_configurations.' +
                                 (args.data_configuration_name),
                                 fromlist=['dataset_configurations'])

    # Suppress output to some logfile, that is useful when running a massive number of collectors
    if not args.verbose:
        suppress_logs(args.episode_number)

    # Instatiate the carlagame debug screen. This is basically a interface to visualize
    # the oracle data collection process
    carla_game = CarlaGame(False, args.debug, WINDOW_WIDTH, WINDOW_HEIGHT,
                           MINI_WINDOW_WIDTH, MINI_WINDOW_HEIGHT)

    # The collision checker , checks for collision at any moment.
    collision_checker = CollisionChecker()
    lane_checker = LaneChecker()
    ##### Start the episode #####
    random_episode = True
    # ! This returns all the aspects from the episodes.
    episode_aspects = reset_episode(client, carla_game, settings_module,
                                    args.debug, random_episode, {},
                                    args.episode_number)
    planner = Planner(episode_aspects["town_name"])
    # We instantiate the agent, depending on the parameter
    controlling_agent = make_controlling_agent(args,
                                               episode_aspects["town_name"])

    # The noise object to add noise to some episodes is instanced
    longitudinal_noiser = Noiser('Throttle',
                                 frequency=15,
                                 intensity=10,
                                 min_noise_time_amount=2.0)
    lateral_noiser = Noiser('Spike',
                            frequency=50,
                            intensity=3,
                            min_noise_time_amount=2.0)

    episode_lateral_noise, episode_longitudinal_noise = check_episode_has_noise(
        args.episode_number, settings_module, True)
    episode_aspects.update({
        'episode_lateral_noise':
        episode_lateral_noise,
        'episode_longitudinal_noise':
        episode_longitudinal_noise
    })
    if ENABLE_WRITER:
        ##### DATASET writer initialization #####
        # here we make the full path for the dataset that is going to be created.
        # Make dataset path
        writer.make_dataset_path(args.data_path)
        # We start by writing the  metadata for the entire data collection process.
        # That basically involves writing the configuration that was set on the settings module.
        writer.add_metadata(args.data_path, settings_module)
        # Also write the metadata for the current episode

    # We start the episode number with the one set as parameter
    episode_number = args.episode_number
    enable_autopilot = False
    autopilot_counter = 0
    noisy_episode = True
    image_count = 0
    # The maximum episode is equal to the current episode plus the number of episodes you
    # want to run
    maximun_episode = int(args.number_of_episodes) + int(args.episode_number)
    try:
        while carla_game.is_running() and episode_number < maximun_episode:
            try:
                # we add the vehicle and the connection outside of the game.
                measurements, sensor_data = client.read_data()

                # run a step for the agent. regardless of the type

                control, controller_state = controlling_agent.run_step(
                    measurements, sensor_data, [],
                    episode_aspects['player_target_transform'],
                    enable_autopilot)

                # Get the directions, also important to save those for future training
                # Check if we made infraction here last time
                if image_count in episode_aspects['expert_points']:
                    autopilot_counter = 0
                    enable_autopilot = False  # Turning off for now
                    print(" Enabling Autopilot ")
                # We are in trouble some state enable autopilot
                if enable_autopilot:
                    autopilot_counter += 1
                    if autopilot_counter > FRAMES_GIVEN_TO_ORACLE:
                        enable_autopilot = False
                        print("Disabling Autopilot")
                directions = get_directions(
                    measurements, episode_aspects['player_target_transform'],
                    planner)
                controller_state.update({'directions': directions})

                # if this is a noisy episode, add noise to the controls
                # if autopilot is ON  curb all noises
                #TODO add a function here.
                if episode_longitudinal_noise and noisy_episode:
                    control_noise, _, _ = longitudinal_noiser.compute_noise(
                        control,
                        measurements.player_measurements.forward_speed * 3.6)
                else:
                    control_noise = control

                if episode_lateral_noise and noisy_episode:
                    control_noise_f, _, _ = lateral_noiser.compute_noise(
                        control_noise,
                        measurements.player_measurements.forward_speed * 3.6)
                else:
                    control_noise_f = control_noise

                # Set the player position
                # if you want to debug also render everything
                if args.debug:
                    objects_to_render = controller_state.copy()
                    objects_to_render[
                        'player_transform'] = measurements.player_measurements.transform
                    objects_to_render[
                        'agents'] = measurements.non_player_agents
                    objects_to_render[
                        "draw_pedestrians"] = args.draw_pedestrians
                    objects_to_render["draw_vehicles"] = args.draw_vehicles
                    objects_to_render[
                        "draw_traffic_lights"] = args.draw_traffic_lights
                    # Comment the following two lines to see the waypoints and routes.
                    objects_to_render['waypoints'] = None
                    objects_to_render['route'] = None

                    # Render with the provided map
                    carla_game.render(sensor_data['CameraRGB'],
                                      objects_to_render)

                # Check two important conditions for the episode, if it has ended
                # and if the episode was a success
                collided = collision_checker.test_collision(
                    measurements.player_measurements)
                lane_crossed = lane_checker.test_lane_crossing(
                    measurements.player_measurements)
                episode_ended =  collided or lane_crossed  or \
                                carla_game.is_reset(measurements.player_measurements.transform.location) #or controller_state['traffic_light_crossed_on_red']
                episode_success = not (
                    collided or lane_crossed
                )  # or controller_state['traffic_light_crossed_on_red']

                # Check if there is collision
                # Start a new episode if there is a collision but repeat the same by not incrementing
                # episode number.

                if episode_ended:
                    if episode_success:
                        episode_aspects.update({
                            "time_taken":
                            measurements.game_timestamp / 1000.0
                        })
                        if ENABLE_WRITER:
                            #if WRITE_H5:
                            '''fileCounter = writer.get_file_counter()
                                                                                                                if fileCounter:
                                                                                                                    data_point_id = (image_count - NUMBER_OF_FRAMES_CAR_FLIES) % (FILE_SIZE * fileCounter)
                                                                                                                else:
                                                                                                                    data_point_id = (image_count - NUMBER_OF_FRAMES_CAR_FLIES)
                                                                                                                writer.writeh5(args.data_path , str(episode_number).zfill(5) , data_point_id)'''
                            writer.add_episode_metadata(
                                args.data_path,
                                str(episode_number).zfill(5), episode_aspects)
                        episode_number += 1
                        random_episode = True
                        noisy_episode = True
                    else:
                        random_episode = False
                        episode_aspects['expert_points'].append(
                            image_count - FRAMES_TO_REWIND)
                        noisy_episode = not noisy_episode
                        if ENABLE_WRITER:
                            writer.delete_episode(args.data_path,
                                                  str(episode_number).zfill(5))
                        if len(
                                episode_aspects['expert_points']
                        ) >= MAX_EXPERT_TAKEOVERS:  # if we repeated the same episode for n times skip it
                            random_episode = True
                            episode_number += 1

                    if ENABLE_WRITER:
                        writer.reset_file_counter()
                    episode_lateral_noise, episode_longitudinal_noise = check_episode_has_noise(
                        episode_number, settings_module, noisy_episode)
                    # We reset the episode and receive all the characteristics of this episode.
                    episode_aspects = reset_episode(client, carla_game,
                                                    settings_module,
                                                    args.debug, random_episode,
                                                    episode_aspects,
                                                    episode_number)
                    controlling_agent.param_controller['target_speed'] = 30
                    episode_aspects.update({
                        'episode_lateral_noise':
                        episode_lateral_noise,
                        'episode_longitudinal_noise':
                        episode_longitudinal_noise
                    })

                    # Reset the image count
                    image_count = 0
                if ENABLE_WRITER:
                    # We do this to avoid the frames that the car is coming from the sky.
                    if image_count >= NUMBER_OF_FRAMES_CAR_FLIES and not args.not_record:
                        #if WRITE_H5:
                        writer.add_data_point(
                            measurements, control, control_noise_f,
                            sensor_data, controller_state, args.data_path,
                            str(episode_number).zfill(5),
                            image_count - NUMBER_OF_FRAMES_CAR_FLIES,
                            settings_module.sensors_frequency)
                        #else:
                        #    writer.add_data_point(measurements, control, control_noise_f, sensor_data,
                        #                      controller_state,
                        #                      args.data_path, str(episode_number).zfill(5),
                        #                      str(image_count - NUMBER_OF_FRAMES_CAR_FLIES),
                        #                      settings_module.sensors_frequency)
                # End the loop by sending control
                client.send_control(control_noise_f)
                # Add one more image to the counting
                image_count += 1

            except TCPConnectionError as error:
                """
                If there is any connection error we delete the current episode, 
                This avoid incomplete episodes
                """
                import traceback
                traceback.print_exc()

                if not args.not_record and ENABLE_WRITER:
                    writer.delete_episode(args.data_path,
                                          str(episode_number).zfill(5))

                time.sleep(10)

    except KeyboardInterrupt:
        import traceback
        traceback.print_exc()
        if not args.not_record and ENABLE_WRITER:
            writer.delete_episode(args.data_path, str(episode_number).zfill(5))
예제 #2
0
def collect(client, args):
    """
    The main loop for the data collection process.
    Args:
        client: carla client object
        args: arguments passed on the data collection main.

    Returns:
        None

    """
    # Here we instantiate a sample carla settings. The name of the configuration should be
    # passed as a parameter.
    settings_module = __import__('dataset_configurations.' +
                                 (args.data_configuration_name),
                                 fromlist=['dataset_configurations'])

    # Suppress output to some logfile, that is useful when running a massive number of collectors
    if not args.verbose:
        suppress_logs(args.episode_number)

    # Instatiate the carlagame debug screen. This is basically a interface to visualize
    # the oracle data collection process
    carla_game = CarlaGame(False, args.debug, WINDOW_WIDTH, WINDOW_HEIGHT,
                           MINI_WINDOW_WIDTH, MINI_WINDOW_HEIGHT)

    # The collision checker , checks for collision at any moment.
    collision_checker = CollisionChecker()

    ##### Start the episode #####
    # ! This returns all the aspects from the episodes.
    episode_aspects = reset_episode(client, carla_game, settings_module,
                                    args.debug)
    planner = Planner(episode_aspects["town_name"])
    # We instantiate the agent, depending on the parameter
    controlling_agent = make_controlling_agent(args,
                                               episode_aspects["town_name"])

    # The noise object to add noise to some episodes is instanced
    longitudinal_noiser = Noiser('Throttle',
                                 frequency=15,
                                 intensity=10,
                                 min_noise_time_amount=2.0)
    lateral_noiser = Noiser('Spike',
                            frequency=25,
                            intensity=4,
                            min_noise_time_amount=0.5)

    episode_lateral_noise, episode_longitudinal_noise = check_episode_has_noise(
        settings_module.lat_noise_percent, settings_module.long_noise_percent)

    ##### DATASET writer initialization #####
    # here we make the full path for the dataset that is going to be created.
    # Make dataset path
    writer.make_dataset_path(args.data_path)
    # We start by writing the  metadata for the entire data collection process.
    # That basically involves writing the configuration that was set on the settings module.
    writer.add_metadata(args.data_path, settings_module)
    # Also write the metadata for the current episode
    writer.add_episode_metadata(args.data_path,
                                str(args.episode_number).zfill(5),
                                episode_aspects)

    # We start the episode number with the one set as parameter
    episode_number = args.episode_number
    try:
        image_count = 0
        # The maximum episode is equal to the current episode plus the number of episodes you
        # want to run
        maximun_episode = int(args.number_of_episodes) + int(
            args.episode_number)
        while carla_game.is_running() and episode_number < maximun_episode:

            # we add the vehicle and the connection outside of the game.
            measurements, sensor_data = client.read_data()

            # run a step for the agent. regardless of the type
            control, controller_state = controlling_agent.run_step(
                measurements, sensor_data, [],
                episode_aspects['player_target_transform'])
            # Get the directions, also important to save those for future training

            directions = get_directions(
                measurements, episode_aspects['player_target_transform'],
                planner)

            controller_state.update({'directions': directions})

            # if this is a noisy episode, add noise to the controls
            #TODO add a function here.
            if episode_longitudinal_noise:
                control_noise, _, _ = longitudinal_noiser.compute_noise(
                    control,
                    measurements.player_measurements.forward_speed * 3.6)
            else:
                control_noise = control

            if episode_lateral_noise:
                control_noise_f, _, _ = lateral_noiser.compute_noise(
                    control_noise,
                    measurements.player_measurements.forward_speed * 3.6)
            else:
                control_noise_f = control_noise

            # Set the player position
            # if you want to debug also render everything
            if args.debug:
                objects_to_render = controller_state.copy()
                objects_to_render[
                    'player_transform'] = measurements.player_measurements.transform
                objects_to_render['agents'] = measurements.non_player_agents
                objects_to_render["draw_pedestrians"] = args.draw_pedestrians
                objects_to_render["draw_vehicles"] = args.draw_vehicles
                objects_to_render[
                    "draw_traffic_lights"] = args.draw_traffic_lights
                # Comment the following two lines to see the waypoints and routes.
                objects_to_render['waypoints'] = None
                objects_to_render['route'] = None

                # Render with the provided map
                carla_game.render(sensor_data['CameraRGB'], objects_to_render)

            # Check two important conditions for the episode, if it has ended
            # and if the episode was a success
            episode_ended = collision_checker.test_collision(measurements.player_measurements) or \
                            reach_timeout(measurements.game_timestamp / 1000.0,
                                          episode_aspects["timeout"]) or \
                            carla_game.is_reset(measurements.player_measurements.transform.location)
            episode_success = not (collision_checker.test_collision(
                measurements.player_measurements) or reach_timeout(
                    measurements.game_timestamp / 1000.0,
                    episode_aspects["timeout"]))

            # Check if there is collision
            # Start a new episode if there is a collision but repeat the same by not incrementing
            # episode number.

            if episode_ended:
                if episode_success:
                    episode_number += 1
                else:
                    # If the episode did go well and we were recording, delete this episode
                    if not args.not_record:
                        writer.delete_episode(args.data_path,
                                              str(episode_number - 1).zfill(5))

                episode_lateral_noise, episode_longitudinal_noise = check_episode_has_noise(
                    settings_module.lat_noise_percent,
                    settings_module.long_noise_percent)

                # We reset the episode and receive all the characteristics of this episode.
                episode_aspects = reset_episode(client, carla_game,
                                                settings_module, args.debug)

                writer.add_episode_metadata(args.data_path,
                                            str(episode_number).zfill(5),
                                            episode_aspects)

                # Reset the image count
                image_count = 0

            # We do this to avoid the frames that the car is coming from the sky.
            if image_count >= NUMBER_OF_FRAMES_CAR_FLIES and not args.not_record:
                writer.add_data_point(
                    measurements, control, control_noise_f, sensor_data,
                    controller_state, args.data_path,
                    str(episode_number).zfill(5),
                    str(image_count - NUMBER_OF_FRAMES_CAR_FLIES),
                    settings_module.sensors_frequency)
            # End the loop by sending control
            client.send_control(control_noise_f)
            # Add one more image to the counting
            image_count += 1

    except TCPConnectionError as error:
        """
        If there is any connection error we delete the current episode, 
        This avoid incomplete episodes
        """
        import traceback
        traceback.print_exc()
        if not args.not_record:
            writer.delete_episode(args.data_path, str(episode_number).zfill(5))

        raise error

    except KeyboardInterrupt:
        import traceback
        traceback.print_exc()
        if not args.not_record:
            writer.delete_episode(args.data_path, str(episode_number).zfill(5))