mirror of
https://github.com/Ahp06/SUMO_Emissions.git
synced 2024-11-22 03:26:30 +00:00
Refactored some code and changed logs filename
This commit is contained in:
parent
5b812d2dc1
commit
fef374c47f
@ -13,6 +13,7 @@ from model import Area, Vehicle
|
|||||||
This module defines all possible actions on the simulation
|
This module defines all possible actions on the simulation
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def compute_edge_weight(edge_id):
|
def compute_edge_weight(edge_id):
|
||||||
"""
|
"""
|
||||||
Sum the different pollutant emissions on the edge with the identifier edge_id
|
Sum the different pollutant emissions on the edge with the identifier edge_id
|
||||||
@ -100,7 +101,9 @@ def count_vehicles_in_area(area):
|
|||||||
def lock_area(area):
|
def lock_area(area):
|
||||||
"""
|
"""
|
||||||
Prohibits access to the area to a particular vehicle class
|
Prohibits access to the area to a particular vehicle class
|
||||||
NOT FIXED : Some vehicles continue to go into the area if they can not turn around and stay there
|
NOT FIXED : Some vehicles continue to go into the area
|
||||||
|
if they can not turn around and then will stay blocked there
|
||||||
|
as long as it will not be reversed
|
||||||
:param area: The Area object
|
:param area: The Area object
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
@ -41,22 +41,9 @@ class Config:
|
|||||||
with open(config_file, 'r') as f:
|
with open(config_file, 'r') as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
|
|
||||||
self._SUMOCMD = data["_SUMOCMD"]
|
for option in data:
|
||||||
self._SUMOCFG = data["_SUMOCFG"]
|
self.__setattr__(option, data[option])
|
||||||
|
self.config_filename = os.path.basename(f.name)
|
||||||
self.areas_number = data["areas_number"]
|
|
||||||
self.emissions_threshold = data["emissions_threshold"]
|
|
||||||
self.n_steps = data["n_steps"]
|
|
||||||
self.window_size = data["window_size"]
|
|
||||||
|
|
||||||
self.without_actions_mode = data["without_actions_mode"]
|
|
||||||
self.limit_speed_mode = data["limit_speed_mode"]
|
|
||||||
self.speed_rf = data["speed_rf"]
|
|
||||||
self.adjust_traffic_light_mode = data["adjust_traffic_light_mode"]
|
|
||||||
self.trafficLights_duration_rf = data["trafficLights_duration_rf"]
|
|
||||||
self.weight_routing_mode = data["weight_routing_mode"]
|
|
||||||
self.lock_area_mode = data["lock_area_mode"]
|
|
||||||
|
|
||||||
self.check_config()
|
self.check_config()
|
||||||
|
|
||||||
def check_config(self):
|
def check_config(self):
|
||||||
@ -64,13 +51,13 @@ class Config:
|
|||||||
Check the relevance of user configuration choices
|
Check the relevance of user configuration choices
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
# Weight routing mode cannot be combinated with other actions
|
# Weight routing mode cannot be combined with other actions
|
||||||
if self.weight_routing_mode:
|
if self.weight_routing_mode:
|
||||||
self.limit_speed_mode = False
|
self.limit_speed_mode = False
|
||||||
self.adjust_traffic_light_mode = False
|
self.adjust_traffic_light_mode = False
|
||||||
self.lock_area_mode = False
|
self.lock_area_mode = False
|
||||||
|
|
||||||
# If without_actions_mode is choosen
|
# If without_actions_mode is chosen
|
||||||
if self.without_actions_mode:
|
if self.without_actions_mode:
|
||||||
self.limit_speed_mode = False
|
self.limit_speed_mode = False
|
||||||
self.adjust_traffic_light_mode = False
|
self.adjust_traffic_light_mode = False
|
||||||
@ -118,7 +105,7 @@ class Config:
|
|||||||
if not os.path.exists('logs'):
|
if not os.path.exists('logs'):
|
||||||
os.makedirs('logs')
|
os.makedirs('logs')
|
||||||
|
|
||||||
log_filename = f'logs/sumo_logs_{current_date}.log'
|
log_filename = f'logs/sumo_logs_{current_date}_{self.config_filename}.log'
|
||||||
|
|
||||||
logger = logging.getLogger("sumo_logger")
|
logger = logging.getLogger("sumo_logger")
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
@ -24,6 +24,7 @@ from shapely.geometry import LineString
|
|||||||
This module defines the entry point of the application
|
This module defines the entry point of the application
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def init_grid(simulation_bounds, areas_number, window_size):
|
def init_grid(simulation_bounds, areas_number, window_size):
|
||||||
"""
|
"""
|
||||||
Initialize the grid of the loaded map from the configuration
|
Initialize the grid of the loaded map from the configuration
|
||||||
@ -43,7 +44,7 @@ def init_grid(simulation_bounds, areas_number, window_size):
|
|||||||
name = 'Area ({},{})'.format(i, j)
|
name = 'Area ({},{})'.format(i, j)
|
||||||
area = Area(ar_bounds, name, window_size)
|
area = Area(ar_bounds, name, window_size)
|
||||||
grid.append(area)
|
grid.append(area)
|
||||||
traci.polygon.add(area.name, ar_bounds, (255, 0, 0))
|
traci.polygon.add(area.name, ar_bounds, (255, 0, 0)) # Add polygon for UI
|
||||||
return grid
|
return grid
|
||||||
|
|
||||||
|
|
||||||
@ -105,7 +106,7 @@ def add_data_to_areas(areas: List[Area]):
|
|||||||
def compute_vehicle_emissions(veh_id):
|
def compute_vehicle_emissions(veh_id):
|
||||||
"""
|
"""
|
||||||
Recover the emissions of different pollutants from a vehicle and create an Emission instance
|
Recover the emissions of different pollutants from a vehicle and create an Emission instance
|
||||||
:param veh_id:
|
:param veh_id: The vehicle ID
|
||||||
:return: A new Emission instance
|
:return: A new Emission instance
|
||||||
"""
|
"""
|
||||||
co2 = traci.vehicle.getCO2Emission(veh_id)
|
co2 = traci.vehicle.getCO2Emission(veh_id)
|
||||||
@ -148,8 +149,10 @@ def get_emissions(grid: List[Area], vehicles: List[Vehicle], current_step, confi
|
|||||||
if vehicle.pos in area:
|
if vehicle.pos in area:
|
||||||
total_emissions += vehicle.emissions
|
total_emissions += vehicle.emissions
|
||||||
|
|
||||||
|
# Adding of the total of emissions pollutant at the current step into memory
|
||||||
area.emissions_by_step.append(total_emissions)
|
area.emissions_by_step.append(total_emissions)
|
||||||
|
|
||||||
|
# If the sum of pollutant emissions (in mg) exceeds the threshold
|
||||||
if area.sum_emissions_into_window(current_step) >= config.emissions_threshold:
|
if area.sum_emissions_into_window(current_step) >= config.emissions_threshold:
|
||||||
|
|
||||||
if config.limit_speed_mode and not area.limited_speed:
|
if config.limit_speed_mode and not area.limited_speed:
|
||||||
@ -178,8 +181,8 @@ def get_emissions(grid: List[Area], vehicles: List[Vehicle], current_step, confi
|
|||||||
def get_reduction_percentage(ref, total):
|
def get_reduction_percentage(ref, total):
|
||||||
"""
|
"""
|
||||||
Return the reduction percentage of total emissions between reference and an other simulation
|
Return the reduction percentage of total emissions between reference and an other simulation
|
||||||
:param ref:
|
:param ref: The sum of all pollutant emissions (in mg) for the simulation of reference
|
||||||
:param total:
|
:param total: The sum of all pollutant emissions (in mg) for the current simulation launched
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
return (ref - total) / ref * 100
|
return (ref - total) / ref * 100
|
||||||
@ -208,7 +211,7 @@ def export_data_to_csv(config, grid):
|
|||||||
writer.writerow(itertools.chain((step,), em_for_step))
|
writer.writerow(itertools.chain((step,), em_for_step))
|
||||||
|
|
||||||
|
|
||||||
def run(config, logger):
|
def run(config, logger, csv_export):
|
||||||
"""
|
"""
|
||||||
Run the simulation with the configuration chosen
|
Run the simulation with the configuration chosen
|
||||||
:param config: The simulation configuration
|
:param config: The simulation configuration
|
||||||
@ -230,7 +233,7 @@ def run(config, logger):
|
|||||||
|
|
||||||
logger.info('Simulation started...')
|
logger.info('Simulation started...')
|
||||||
step = 0
|
step = 0
|
||||||
while step < config.n_steps: # traci.simulation.getMinExpectedNumber() > 0:
|
while step < config.n_steps:
|
||||||
traci.simulationStep()
|
traci.simulationStep()
|
||||||
|
|
||||||
vehicles = get_all_vehicles()
|
vehicles = get_all_vehicles()
|
||||||
@ -241,10 +244,15 @@ def run(config, logger):
|
|||||||
|
|
||||||
finally:
|
finally:
|
||||||
traci.close(False)
|
traci.close(False)
|
||||||
|
|
||||||
|
if csv_export:
|
||||||
export_data_to_csv(config, grid)
|
export_data_to_csv(config, grid)
|
||||||
|
logger.info(f'Exported data into the csv folder')
|
||||||
|
|
||||||
simulation_time = round(time.perf_counter() - start, 2)
|
simulation_time = round(time.perf_counter() - start, 2)
|
||||||
logger.info(f'End of the simulation ({simulation_time}s)')
|
logger.info(f'End of the simulation ({simulation_time}s)')
|
||||||
|
|
||||||
|
# 1 step is equal to one second simulated
|
||||||
logger.info(f'Real-time factor : {config.n_steps / simulation_time}')
|
logger.info(f'Real-time factor : {config.n_steps / simulation_time}')
|
||||||
|
|
||||||
total_emissions = Emission()
|
total_emissions = Emission()
|
||||||
@ -253,9 +261,9 @@ def run(config, logger):
|
|||||||
|
|
||||||
logger.info(f'Total emissions = {total_emissions.value()} mg')
|
logger.info(f'Total emissions = {total_emissions.value()} mg')
|
||||||
|
|
||||||
if not config.without_actions_mode:
|
if not config.without_actions_mode: # If it's not a simulation without actions
|
||||||
ref = config.get_ref_emissions()
|
ref = config.get_ref_emissions()
|
||||||
if not (ref is None):
|
if not (ref is None): # If a reference value exist (add yours into config.py)
|
||||||
global_diff = (ref.value() - total_emissions.value()) / ref.value()
|
global_diff = (ref.value() - total_emissions.value()) / ref.value()
|
||||||
|
|
||||||
logger.info(f'Global reduction percentage of emissions = {global_diff * 100} %')
|
logger.info(f'Global reduction percentage of emissions = {global_diff * 100} %')
|
||||||
@ -281,7 +289,9 @@ def add_options(parser):
|
|||||||
parser.add_argument("-ref", "--ref", action="store_true",
|
parser.add_argument("-ref", "--ref", action="store_true",
|
||||||
help='Launch a reference simulation (without acting on areas)')
|
help='Launch a reference simulation (without acting on areas)')
|
||||||
parser.add_argument("-gui", "--gui", action="store_true",
|
parser.add_argument("-gui", "--gui", action="store_true",
|
||||||
help="Set GUI mode")
|
help="Show UI")
|
||||||
|
parser.add_argument("-csv", "--csv", action="store_true",
|
||||||
|
help="Export all data emissions into a CSV file")
|
||||||
|
|
||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
@ -295,9 +305,10 @@ def main(args):
|
|||||||
args = parser.parse_args(args)
|
args = parser.parse_args(args)
|
||||||
|
|
||||||
config = Config()
|
config = Config()
|
||||||
config.import_config_file(args.configfile)
|
config.import_config_file(args.configfile) # By default the configfile is default_config.json
|
||||||
config.init_traci()
|
config.init_traci()
|
||||||
logger = config.init_logger(save_logs=args.save)
|
logger = config.init_logger(save_logs=args.save)
|
||||||
|
csv_export = False
|
||||||
|
|
||||||
if args.ref:
|
if args.ref:
|
||||||
config.without_actions_mode = True
|
config.without_actions_mode = True
|
||||||
@ -309,11 +320,14 @@ def main(args):
|
|||||||
if args.gui:
|
if args.gui:
|
||||||
config._SUMOCMD = "sumo-gui"
|
config._SUMOCMD = "sumo-gui"
|
||||||
|
|
||||||
|
if args.csv:
|
||||||
|
csv_export = True
|
||||||
|
|
||||||
config.check_config()
|
config.check_config()
|
||||||
|
|
||||||
logger.info(f'Loaded configuration file : {args.configfile}')
|
logger.info(f'Loaded configuration file : {args.configfile}')
|
||||||
logger.info(f'Simulated time : {args.steps}s')
|
logger.info(f'Simulated time : {args.steps}s')
|
||||||
run(config, logger)
|
run(config, logger, csv_export)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
Reference in New Issue
Block a user