|
|
import logging, warnings |
|
|
import numpy as np |
|
|
from ROAR_Sim.configurations.configuration import Configuration as CarlaConfig |
|
|
from ROAR.configurations.configuration import Configuration as AgentConfig |
|
|
from pathlib import Path |
|
|
from ROAR.agent_module.pure_pursuit_agent \ |
|
|
import PurePursuitAgent |
|
|
from ROAR_Sim.carla_client.carla_runner import CarlaRunner |
|
|
from typing import Tuple |
|
|
from prettytable import PrettyTable |
|
|
from ROAR.agent_module.michael_pid_agent import PIDAgent |
|
|
|
|
|
|
|
|
def compute_score(carla_runner: CarlaRunner) -> Tuple[float, int, int]: |
|
|
""" |
|
|
Calculates the score of the vehicle upon completion of the track based on certain metrics |
|
|
Args: |
|
|
carla_runner (): |
|
|
|
|
|
Returns: |
|
|
time_elapsed: |
|
|
num_collision: number of collisions during simulation |
|
|
laps_completed: Number of laps completed |
|
|
|
|
|
""" |
|
|
time_elapsed: float = carla_runner.end_simulation_time - carla_runner.start_simulation_time |
|
|
num_collision: int = carla_runner.agent_collision_counter |
|
|
laps_completed = 0 if carla_runner.completed_lap_count < 0 else carla_runner.completed_lap_count |
|
|
|
|
|
return time_elapsed, num_collision, laps_completed |
|
|
|
|
|
|
|
|
def run(agent_class, agent_config_file_path: Path, carla_config_file_path: Path, |
|
|
num_laps: int = 10) -> Tuple[float, int, int]: |
|
|
""" |
|
|
Run the agent along the track and produce a score based on certain metrics |
|
|
Args: |
|
|
num_laps: int number of laps that the agent should run |
|
|
agent_class: the participant's agent |
|
|
agent_config_file_path: agent configuration path |
|
|
carla_config_file_path: carla configuration path |
|
|
Returns: |
|
|
float between 0 - 1 representing scores |
|
|
""" |
|
|
|
|
|
agent_config: AgentConfig = AgentConfig.parse_file(agent_config_file_path) |
|
|
carla_config = CarlaConfig.parse_file(carla_config_file_path) |
|
|
|
|
|
|
|
|
agent_config.num_laps = num_laps |
|
|
carla_runner = CarlaRunner(carla_settings=carla_config, |
|
|
agent_settings=agent_config, |
|
|
npc_agent_class=PurePursuitAgent, |
|
|
competition_mode=True, |
|
|
lap_count=num_laps) |
|
|
try: |
|
|
my_vehicle = carla_runner.set_carla_world() |
|
|
agent = agent_class(vehicle=my_vehicle, agent_settings=agent_config) |
|
|
carla_runner.start_game_loop(agent=agent, use_manual_control=False) |
|
|
return compute_score(carla_runner) |
|
|
except Exception as e: |
|
|
print(f"something bad happened during initialization: {e}") |
|
|
carla_runner.on_finish() |
|
|
logging.error(f"{e}. Might be a good idea to restart Server") |
|
|
return 0, 0, False |
|
|
|
|
|
|
|
|
def suppress_warnings(): |
|
|
logging.basicConfig(format='%(levelname)s - %(asctime)s - %(name)s ' |
|
|
'- %(message)s', |
|
|
level=logging.INFO) |
|
|
logging.getLogger("matplotlib").setLevel(logging.WARNING) |
|
|
warnings.simplefilter("ignore") |
|
|
np.set_printoptions(suppress=True) |
|
|
|
|
|
|
|
|
def main(): |
|
|
suppress_warnings() |
|
|
agent_class = PIDAgent |
|
|
num_trials = 10 |
|
|
total_score_array = [] |
|
|
num_laps = 1 |
|
|
table = PrettyTable() |
|
|
table.field_names = ["time_elapsed (sec)", "num_collisions", "laps completed"] |
|
|
|
|
|
for i in range(num_trials): |
|
|
print(f"runner_competition_evaluator -> Trial: {i}") |
|
|
scores = run(agent_class=agent_class, |
|
|
agent_config_file_path=Path("./ROAR/configurations/carla/carla_agent_configuration.json"), |
|
|
carla_config_file_path=Path("./ROAR_Sim/configurations/configuration.json"), |
|
|
num_laps=num_laps) |
|
|
total_score_array.append(scores[0]) |
|
|
table.add_row(scores) |
|
|
table.add_row((f"AVG for {num_trials} trials = {np.average(total_score_array)}", "N/A", "N/A")) |
|
|
print(table) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|