def eval_genomes(genome_id, genome, config, episode, trafic): """" SOMETHING SMETHING""" error = False error_return = 10000 timestep = 0 try: [simname, SUMO, error] = SimInitializer(trafic, episode) except Exception as ex: template = "An exception of type {0} occurred. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) if error == True: return error_return # fitness=timestep # raise Exception('Error SimInitializer', message) if error == True: return error_return try: x = 0 # state_empty=np.zeros([feature_number,1]) # for genome_id, genome in genomes: x += 1 SUMO.step = 0 SUMO.Colliion = False SUMO.RouteEnd = False v_episode = [] a_episode = [] distance_episode = [] timestep = 1 process_param = multiprocessing.Process() sim = simname #process_param.name timestep = [sim, simname] simulation = traci.getConnection(simname) timestep = 1.5 SUMO.init_vars_episode() """Anmerkung: Hier werden einige Variationen des Verkehrsszenarios für meine Trainingsepisoden definiert, wenn 'training = True' gesetzt ist. Im Fall 'training = False' oder 'evaluation = True' (Evaluierungsepisoden unter gleichen Randbedingungen) wird immer eine Episode mit gleichen Randbedingungen (z.B. Geschwindigkeitsprofil vorausfahrendes Fahrzeug) gesetzt""" if trafic.evaluation: simulation.vehicle.add(trafic.vehicle_ego.ID, trafic.vehicle_ego.RouteID, departSpeed='0', typeID='ego_vehicle') # Ego vehicle simulation.trafficlight.setPhase( 'junction1', 0 ) # set traffic light phase to 0 for evaluation (same conditions) else: simulation.vehicle.add( trafic.vehicle_ego.ID, trafic.vehicle_ego.RouteID, departSpeed=np.array2string( trafic.vehicle_ego.depart_speed[episode - 1]), typeID='ego_vehicle') # Ego vehicle if trafic.vehicle2_exist: simulation.vehicle.add( trafic.vehicle_2.ID, trafic.vehicle_2.RouteID, typeID='traffic_vehicle') # preceding vehicle 1 timestep = 1.7 if trafic.vehicle3: simulation.vehicle.add( trafic.vehicle_3.ID, trafic.vehicle_3.RouteID, typeID='traffic_vehicle') # preceding vehicle 2 if trafic.training and not trafic.evaluation: simulation.vehicle.moveTo(trafic.vehicle_3.ID, 'gneE01_0', trafic.episoden_variante) else: simulation.vehicle.moveTo(trafic.vehicle_3.ID, 'gneE01_0', 0.) timestep = 2 simulation.simulationStep() # to spawn vehicles # if controller != 'SUMO': simulation.vehicle.setSpeedMode( trafic.vehicle_ego.ID, 16 ) # only emergency stopping at red traffic lights --> episode ends if trafic.vehicle2_exist: simulation.vehicle.setSpeedMode(trafic.vehicle_2.ID, 17) if trafic.vehicle3: simulation.vehicle.setSpeedMode(trafic.vehicle_3.ID, 17) SUMO.currentvehiclelist = simulation.vehicle.getIDList() # SUMO subscriptions simulation.vehicle.subscribeLeader(trafic.vehicle_ego.ID, 10000) simulation.vehicle.subscribe(trafic.vehicle_ego.ID, [ traci.constants.VAR_SPEED, traci.constants.VAR_BEST_LANES, traci.constants.VAR_FUELCONSUMPTION, traci.constants.VAR_NEXT_TLS, traci.constants.VAR_ALLOWED_SPEED, traci.constants.VAR_LANE_ID ]) timestep = 3 dynamics_ego = Longitudinal_dynamics(tau=0.5) timestep = 3.1 net = neat.nn.FeedForwardNetwork.create(genome[1], config) """"Run episode =======================================================================""" while simulation.simulation.getMinExpectedNumber( ) > 0: # timestep loop """Get state for first iteration ===================================================================""" if SUMO.step == 0: calculate_features_firststep(sim, SUMO) # if controller == 'DDPG_v' or controller == 'DDPG' or controller == 'DQN': # nn_controller.state = get_state() timestep = 3.3 """Controller ====================================================================================== Hier wird die Stellgröße des Reglers (z.B. Sollbeschleunigung) in Abhängigkeit der Reglereingänge (zusammengefasst in 'features' für den ACC Controller bzw. 'nn_controller.state' für die Neuronalen Regler""" state = get_state(trafic.state_empty) timestep = 4 # print(state) # net = neat.nn.FeedForwardNetwork.create(genome, config) SUMO.a_set[SUMO.step] = net.activate( state) #[0,0], state[0,1], state[0,2], state[0,3]) SUMO.a_set[SUMO.step] = 10 * SUMO.a_set[ SUMO.step] #-10 #[0,0], state[0,1], state[0,2], state[0,3]) # print(SUMO.a_set[SUMO.step], SUMO.step) timestep = 5 """Longitudinal Dynamics =========================================================================== Hier werden Längsdynamische Größen des Egofahrzeugs berechnet. beispielsweise die Realbeschleunigung aus den Stellgrößen des Reglers oder der Kraftstoffverbrauch für ein definiertes Fahrzeug (aktuell konventionelles Verbrennerfahrzeug mit Mehrganggetriebe). Am Ende wird als Schnittstelle zu SUMO eine neue Geschwindigkeit für das Egofahrzeug für den nächsten Zeitschritt gesetzt""" dynamics_ego = Longitudinal_dynamics(tau=0.5) dynamics_ego.low_lev_controller( SUMO.a_set[SUMO.step], SUMO.sim['timestep'] ) # Calculate a_real with a_set and a PT1 Transfer function dynamics_ego.wheel_demand( SUMO.v_ego[SUMO.step], trafic.vehicle_ego, SUMO.step ) # Calculate the torque and speed wheel demand of this timestep dynamics_ego.operating_strategy(SUMO.sim['timestep'], trafic.vehicle_ego, s0=2, kp=10, step=SUMO.step) dynamics_ego.v_real_next = SUMO.v_ego[ SUMO.step] + dynamics_ego.a_real * SUMO.sim['timestep'] dynamics_ego.v_real_next = np.clip(dynamics_ego.v_real_next, 0., None) SUMO.a_real[SUMO.step] = dynamics_ego.a_real simulation.vehicle.setSpeed( trafic.vehicle_ego.ID, dynamics_ego.v_real_next ) # Set velocity of ego car for next time step timestep = 6 """Control traffic ================================================================""" if trafic.vehicle2_exist and trafic.vehicle_2.ID in SUMO.currentvehiclelist: if trafic.vehicle_2.end == False: if simulation.vehicle.getLaneID( trafic.vehicle_2.ID ) == 'junction_out_0' and simulation.vehicle.getLanePosition( trafic.vehicle_2.ID) > 90: simulation.vehicle.remove(trafic.vehicle_2.ID) trafic.vehicle_2.end = True else: #traci.vehicle.setSpeed(vehicle_2.ID, SUMO.v_profile[SUMO.step]) # set velocity of preceding car 1 pass if trafic.vehicle3 and trafic.vehicle_3.ID in SUMO.currentvehiclelist: simulation.vehicle.setSpeed( trafic.vehicle_3.ID, SUMO.v_profile[ SUMO.step]) # set velocity of preceding car 2 """SUMO simulation step ============================================================================""" simulation.simulationStep() SUMO.currentvehiclelist = traci.vehicle.getIDList() timestep = 7 """Check if any of the endstate conditions is true (e.g. collision) ===================================""" if trafic.vehicle_ego.ID not in SUMO.currentvehiclelist: SUMO.RouteEnd = True SUMO.endstate = True # print([x, SUMO.step],' Route finished!') elif simulation.simulation.getCollidingVehiclesNumber() > 0: SUMO.endstate = True SUMO.Collision = True # print([x, SUMO.step],' Collision!') elif trafic.vehicle_ego.ID in simulation.simulation.getEmergencyStoppingVehiclesIDList( ): # Check for ego vehicle passing red traffic light SUMO.Collision = True SUMO.endstate = True # print([x, SUMO.step],' Red lights passed!') # Set a maximum time step limit for 1 episode elif SUMO.step > 5000: SUMO.RouteEnd = True SUMO.endstate = True # print([x, SUMO.step],' Maximum time reached!') timestep = 7.5 """get new state ===================================================================================""" calculate_features(sim, SUMO) v_episode.append(features.v_ego) a_episode.append(dynamics_ego.a_real) distance_episode.append(features.distance) # """Prepare next timestep ===========================================================================""" if SUMO.Collision or SUMO.RouteEnd: # end episode when endstate conditions are true timestep = 9 break dynamics_ego.a_previous = copy( dynamics_ego.a_real ) # copy --> to create an independent copy of the variable, not a reference to it trafic.vehicle_ego.ID_prec_previous = copy( trafic.vehicle_ego.ID_prec) SUMO.step += 1 timestep = 8 """Calculate Reward ================================================================================""" # fitness = np.sqrt(len(v_episode))*np.sqrt(np.sum(np.square(np.asarray(v_episode)/250)))+np.sum(0.5*np.sign(features.v_allowed/250-np.asarray(v_episode)/250)+1) -0.0001*np.sum(np.square(a_episode))-1/sum(np.square(np.asarray(v_episode)/250*3.6-np.asarray(distance_episode)/250))-100000*int(SUMO.Collision) +100000*int(SUMO.RouteEnd) verbrauch = (10 * (np.mean(trafic.vehicle_ego.fuel_cons) / 0.05) - 1 ) #*50#*100 travelled_distance = sum([c * 0.2 for c in v_episode]) travelled_distance_divisor = 1 / 1800 if travelled_distance == 0 else travelled_distance abstand = np.sum([ 1 for ii in range(len(v_episode)) if distance_episode[ii] < 2 * v_episode[ii] * 3.6 and distance_episode[ii] > v_episode[ii] * 3.6 ]) crash = int(SUMO.Collision) #route_ende=int(SUMO.RouteEnd and not SUMO.maxtime) speed = np.mean(v_episode) / features.v_allowed if np.mean( v_episode) / features.v_allowed < 1 else 0 over_speed_limit = sum([ 1 for jj in range(len(v_episode)) if v_episode[jj] > features.v_allowed ]) evil_acc = sum([ 1 for kk in range(len(a_episode)) if abs(a_episode[kk].item()) > 4 ]) travelled_distance_divisor = evil_acc + 1 if travelled_distance == 0 else travelled_distance fitness = travelled_distance / 1800 + abstand / SUMO.step - crash + speed - 10 * over_speed_limit / SUMO.step - evil_acc / travelled_distance_divisor - 0.5 * verbrauch genome[1].fitness = fitness[0].item() # print(fitness) output = fitness[0].item() # cum_reward[episode] += reward """End of episode - prepare next episode ====================================================================== Reset position of vehicles by removing and (later) adding them again, call running plots and export data """ traci.close() except Exception as ex: template = "An exception of type {0} occurred. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) output = 10000 traci.close() # raise Exception('My error eval genome!', timestep, message) return output
def eval_genomes(genomes, config, episode): """" SOMETHING SMETHING""" x = 0 # state_empty=np.zeros([feature_number,1]) for genome_id, genome in genomes: x += 1 SUMO.step = 0 SUMO.Colliion = False SUMO.RouteEnd = False v_episode = [] a_episode = [] distance_episode = [] created = multiprocessing.Process() sim = current._identity[1] simulation = traci.getConnection('sim' + str(sim - 1)) SUMO.init_vars_episode() """Anmerkung: Hier werden einige Variationen des Verkehrsszenarios für meine Trainingsepisoden definiert, wenn 'training = True' gesetzt ist. Im Fall 'training = False' oder 'evaluation = True' (Evaluierungsepisoden unter gleichen Randbedingungen) wird immer eine Episode mit gleichen Randbedingungen (z.B. Geschwindigkeitsprofil vorausfahrendes Fahrzeug) gesetzt""" if trafic.evaluation: simulation.vehicle.add(trafic.vehicle_ego.ID, trafic.vehicle_ego.RouteID, departSpeed='0', typeID='ego_vehicle') # Ego vehicle simulation.trafficlight.setPhase( 'junction1', 0 ) # set traffic light phase to 0 for evaluation (same conditions) else: traci.vehicle.add(trafic.vehicle_ego.ID, trafic.vehicle_ego.RouteID, departSpeed=np.array2string( trafic.vehicle_ego.depart_speed[episode - 1]), typeID='ego_vehicle') # Ego vehicle if trafic.vehicle2_exist: simulation.vehicle.add( trafic.vehicle_2.ID, trafic.vehicle_2.RouteID, typeID='traffic_vehicle') # preceding vehicle 1 if trafic.vehicle3: simulation.vehicle.add( trafic.vehicle_3.ID, trafic.vehicle_3.RouteID, typeID='traffic_vehicle') # preceding vehicle 2 if trafic.training and not trafic.evaluation: simulation.vehicle.moveTo(trafic.vehicle_3.ID, 'gneE01_0', trafic.episoden_variante) else: simulation.vehicle.moveTo(trafic.vehicle_3.ID, 'gneE01_0', 0.) simulation.simulationStep() # to spawn vehicles # if controller != 'SUMO': simulation.vehicle.setSpeedMode( trafic.vehicle_ego.ID, 16 ) # only emergency stopping at red traffic lights --> episode ends if trafic.vehicle2_exist: simulation.vehicle.setSpeedMode(trafic.vehicle_2.ID, 17) if trafic.vehicle3: simulation.vehicle.setSpeedMode(trafic.vehicle_3.ID, 17) SUMO.currentvehiclelist = simulation.vehicle.getIDList() # SUMO subscriptions simulation.vehicle.subscribeLeader(trafic.vehicle_ego.ID, 10000) simulation.vehicle.subscribe(trafic.vehicle_ego.ID, [ traci.constants.VAR_SPEED, traci.constants.VAR_BEST_LANES, traci.constants.VAR_FUELCONSUMPTION, traci.constants.VAR_NEXT_TLS, traci.constants.VAR_ALLOWED_SPEED, traci.constants.VAR_LANE_ID ]) dynamics_ego = Longitudinal_dynamics(tau=0.5) net = neat.nn.FeedForwardNetwork.create(genome, config) """"Run episode =======================================================================""" while simulation.simulation.getMinExpectedNumber( ) > 0: # timestep loop """Get state for first iteration ===================================================================""" if SUMO.step == 0: calculate_features_firststep() # if controller == 'DDPG_v' or controller == 'DDPG' or controller == 'DQN': # nn_controller.state = get_state() """Controller ====================================================================================== Hier wird die Stellgröße des Reglers (z.B. Sollbeschleunigung) in Abhängigkeit der Reglereingänge (zusammengefasst in 'features' für den ACC Controller bzw. 'nn_controller.state' für die Neuronalen Regler""" # if controller == 'ACC': # SUMO.a_set[SUMO.step] = acc_controller.calculate_a(features) # Calculate set acceleration with ACC controller # # Save ACC mode to SUMO class # SUMO.mode_ego[SUMO.step] = acc_controller.mode # ACC control modes (speed control, headway control, etc) # elif controller == 'DQN': # # Calculate Q-Values for all actions # nn_controller.action_value = nn_controller.model.predict(nn_controller.state) # NN inputs: distance, delta_v # # Choose Action according to epsilon-greedy policy # nn_controller.index[SUMO.step] = nn_controller.choose_action(nn_controller.action_value, episode) # # Calculate the set acceleration for the timestep # nn_controller.a_set = nn_controller.actions[nn_controller.index[SUMO.step]] # SUMO.a_set[SUMO.step] = nn_controller.a_set # elif controller == 'DDPG': # if training and not evaluation: # if exploration_policy == 'ACC': # SUMO.a_set[SUMO.step] = explo_policy.calculate_a(features) # SUMO.a_set[SUMO.step] = nn_controller.add_noise(SUMO.a_set[SUMO.step]) # else: # SUMO.a_set[SUMO.step] = nn_controller.choose_action(copy(nn_controller.state), network='main', noise=True) # else: # SUMO.a_set[SUMO.step] = nn_controller.choose_action(copy(nn_controller.state), network='main', noise=False) # elif controller == 'hybrid_a': # acc_controller.a_set = acc_controller.calculate_a( # features) # Calculate set acceleration with ACC controller # # Save ACC mode to SUMO class # SUMO.mode_ego[SUMO.step] = acc_controller.mode # ACC control modes (speed control, headway control, etc) # if SUMO.step == 0: # nn_controller.state[0, 3] = acc_controller.a_set # if training and not evaluation: # nn_controller.a_set = nn_controller.choose_action(copy(nn_controller.state), network='main', noise=True) # else: # nn_controller.a_set = nn_controller.choose_action(copy(nn_controller.state), network='main', noise=False) # SUMO.a_set[SUMO.step] = acc_controller.a_set + nn_controller.k_hybrid_a * nn_controller.a_set # SUMO.a_hybrid_a[SUMO.step] = nn_controller.a_set # elif controller == 'DDPG_v': # if training and not evaluation: # SUMO.v_set[SUMO.step], SUMO.v_set_nonoise[SUMO.step] = nn_controller.choose_action(copy(nn_controller.state), network='main', features=features, noise=True) # else: # SUMO.v_set[SUMO.step] = nn_controller.choose_action(copy(nn_controller.state), network='main', noise=False) # SUMO.a_set[SUMO.step] = acc_controller.calc_a_P(features, SUMO.v_set[SUMO.step]) state = get_state(trafic.state_empty) # print(state) # net = neat.nn.FeedForwardNetwork.create(genome, config) SUMO.a_set[SUMO.step] = net.activate( state) #[0,0], state[0,1], state[0,2], state[0,3]) SUMO.a_set[SUMO.step] = 20 * SUMO.a_set[ SUMO.step] - 10 #[0,0], state[0,1], state[0,2], state[0,3]) # print(SUMO.a_set[SUMO.step], SUMO.step) """Longitudinal Dynamics =========================================================================== Hier werden Längsdynamische Größen des Egofahrzeugs berechnet. beispielsweise die Realbeschleunigung aus den Stellgrößen des Reglers oder der Kraftstoffverbrauch für ein definiertes Fahrzeug (aktuell konventionelles Verbrennerfahrzeug mit Mehrganggetriebe). Am Ende wird als Schnittstelle zu SUMO eine neue Geschwindigkeit für das Egofahrzeug für den nächsten Zeitschritt gesetzt""" dynamics_ego = Longitudinal_dynamics(tau=0.5) # if controller == 'SUMO': # dynamics_ego.a_real = traci.vehicle.getAcceleration(vehicle_ego.ID) # dynamics_ego.wheel_demand(SUMO.v_ego[SUMO.step], vehicle_ego, # SUMO.step) # Calculate the torque and speed wheel demand of this timestep # dynamics_ego.operating_strategy(SUMO.sim['timestep'], vehicle_ego, s0=2, kp=10, step=SUMO.step) # SUMO.a_real[SUMO.step] = dynamics_ego.a_real # else: dynamics_ego.low_lev_controller( SUMO.a_set[SUMO.step], SUMO.sim['timestep'] ) # Calculate a_real with a_set and a PT1 Transfer function dynamics_ego.wheel_demand( SUMO.v_ego[SUMO.step], trafic.vehicle_ego, SUMO.step ) # Calculate the torque and speed wheel demand of this timestep dynamics_ego.operating_strategy(SUMO.sim['timestep'], trafic.vehicle_ego, s0=2, kp=10, step=SUMO.step) dynamics_ego.v_real_next = SUMO.v_ego[ SUMO.step] + dynamics_ego.a_real * SUMO.sim['timestep'] dynamics_ego.v_real_next = np.clip(dynamics_ego.v_real_next, 0., None) SUMO.a_real[SUMO.step] = dynamics_ego.a_real simulation.vehicle.setSpeed( trafic.vehicle_ego.ID, dynamics_ego.v_real_next ) # Set velocity of ego car for next time step """Control traffic ================================================================""" if trafic.vehicle2_exist and trafic.vehicle_2.ID in SUMO.currentvehiclelist: if trafic.vehicle_2.end == False: if simulation.vehicle.getLaneID( trafic.vehicle_2.ID ) == 'junction_out_0' and traci.vehicle.getLanePosition( trafic.vehicle_2.ID) > 90: simulation.vehicle.remove(trafic.vehicle_2.ID) trafic.vehicle_2.end = True else: #traci.vehicle.setSpeed(vehicle_2.ID, SUMO.v_profile[SUMO.step]) # set velocity of preceding car 1 pass if trafic.vehicle3 and trafic.vehicle_3.ID in SUMO.currentvehiclelist: traci.vehicle.setSpeed(trafic.vehicle_3.ID, SUMO.v_profile[ SUMO.step]) # set velocity of preceding car 2 """SUMO simulation step ============================================================================""" simulation.simulationStep() SUMO.currentvehiclelist = traci.vehicle.getIDList() """Check if any of the endstate conditions is true (e.g. collision) ===================================""" if trafic.vehicle_ego.ID not in SUMO.currentvehiclelist: SUMO.RouteEnd = True SUMO.endstate = True print([x, SUMO.step], ' Route finished!') elif simulation.simulation.getCollidingVehiclesNumber() > 0: SUMO.endstate = True SUMO.Collision = True print([x, SUMO.step], ' Collision!') elif trafic.vehicle_ego.ID in simulation.simulation.getEmergencyStoppingVehiclesIDList( ): # Check for ego vehicle passing red traffic light SUMO.Collision = True SUMO.endstate = True print([x, SUMO.step], ' Red lights passed!') # Set a maximum time step limit for 1 episode elif SUMO.step > 5000: SUMO.RouteEnd = True SUMO.endstate = True print([x, SUMO.step], ' Maximum time reached!') """get new state ===================================================================================""" calculate_features() v_episode.append(features.v_ego) a_episode.append(dynamics_ego.a_real) distance_episode.append(features.distance) # if controller == 'DDPG_v' or controller == 'DDPG' or controller == 'DQN': # nn_controller.new_state = get_state() """Prepare next timestep ===========================================================================""" if SUMO.Collision or SUMO.RouteEnd: # end episode when endstate conditions are true break dynamics_ego.a_previous = copy( dynamics_ego.a_real ) # copy --> to create an independent copy of the variable, not a reference to it # if controller == 'DQN' or controller == 'hybrid_a' or controller == 'DDPG' or controller == 'DDPG_v': # nn_controller.state = copy(nn_controller.new_state) if sample_generation: sample_generator.state = copy(sample_generator.new_state) trafic.vehicle_ego.ID_prec_previous = copy( trafic.vehicle_ego.ID_prec) # print(SUMO.step) SUMO.step += 1 # print(v_episode) """Calculate Reward ================================================================================""" fitness = len(v_episode) * np.sqrt(np.sum( np.square(v_episode))) - np.sum( 0.5 * np.sign(features.v_allowed - np.asarray(v_episode)) + 1) - np.mean(np.square(a_episode)) - 1 / sum( np.square( np.asarray(v_episode) * 3.6 - np.asarray(distance_episode))) - 100000 * int( SUMO.Collision) genome.fitness = fitness[0].item() print(fitness) # cum_reward[episode] += reward """End of episode - prepare next episode ====================================================================== Reset position of vehicles by removing and (later) adding them again, call running plots and export data """ if trafic.vehicle_ego.ID in SUMO.currentvehiclelist: simulation.vehicle.remove(trafic.vehicle_ego.ID) if trafic.vehicle2_exist and trafic.vehicle_2.ID in SUMO.currentvehiclelist: simulation.vehicle.remove(trafic.vehicle_2.ID) if trafic.vehicle3 and trafic.vehicle_3.ID in SUMO.currentvehiclelist: simulation.vehicle.remove(trafic.vehicle_3.ID) simulation.simulationStep() dynamics_ego.reset_variables()
# if controller == 'SUMO': # dynamics_ego.a_real = traci.vehicle.getAcceleration(vehicle_ego.ID) # dynamics_ego.wheel_demand(SUMO.v_ego[SUMO.step], vehicle_ego, # SUMO.step) # Calculate the torque and speed wheel demand of this timestep # dynamics_ego.operating_strategy(SUMO.sim['timestep'], vehicle_ego, s0=2, kp=10, step=SUMO.step) # SUMO.a_real[SUMO.step] = dynamics_ego.a_real # else: dynamics_ego.low_lev_controller( SUMO.a_set[SUMO.step], SUMO.sim['timestep'] ) # Calculate a_real with a_set and a PT1 Transfer function dynamics_ego.wheel_demand( SUMO.v_ego[SUMO.step], trafic.vehicle_ego, SUMO.step ) # Calculate the torque and speed wheel demand of this timestep dynamics_ego.operating_strategy(SUMO.sim['timestep'], trafic.vehicle_ego, s0=2, kp=10, step=SUMO.step) dynamics_ego.v_real_next = SUMO.v_ego[ SUMO.step] + dynamics_ego.a_real * SUMO.sim['timestep'] dynamics_ego.v_real_next = np.clip(dynamics_ego.v_real_next, 0., None) SUMO.a_real[SUMO.step] = dynamics_ego.a_real traci.vehicle.setSpeed( trafic.vehicle_ego.ID, dynamics_ego.v_real_next ) # Set velocity of ego car for next time step """Control traffic ================================================================""" if trafic.vehicle2_exist and trafic.vehicle_2.ID in SUMO.currentvehiclelist: if trafic.vehicle_2.end == False: if traci.vehicle.getLaneID( trafic.vehicle_2.ID