Beispiel #1
0
def run(ts: TrafficStorage,
        tb: TrafficBalancer,
        tls_name: str,
        shutdowntime=None):
    # iniciando la simulacion
    traci.start(['sumo-gui', "-c", config.sumo_data_path + 'osm.sumocfg'])
    t = 0
    wait = 0
    estado_anterior = ''
    estado_actual = ''
    activenet = pn.generateDinamycNet(tls_name, [15, 25])

    def onSaveCallback(data):
        nonlocal activenet  # declarando que esta variable se va a usar del scope de afuera de esta funcion interna (es un closure)
        result = tb.balance(data)
        # cambiando los tiempos de la red activa dinamicamente
        time_we = result['from_west']['time'] + result['from_east'][
            'time']  # [0] controla la duracion del tiempo de green en las calles que vienen del este y oeste
        time_n = result['from_north'][
            'time']  # [1] controla la duracion del tiempo de green en las calles que vienes del norte
        time_we = int(
            round(time_we)
        )  # redondeando, porque los tiempos deben ser enteros, si no la red de Petri se buguea
        time_n = int(
            round(time_n)
        )  # redondeando, porque los tiempos deben ser enteros, si no la red de Petri se buguea
        activenet = pn.generateDinamycNet(tls_name, [time_we, time_n])

    ts.onSave = onSaveCallback
    # Ejecuta el bucle de control de TraCI
    while traci.simulation.getMinExpectedNumber() > 0 and (
            t <= shutdowntime if shutdowntime else True):
        estado_anterior = traci.trafficlight.getRedYellowGreenState(tls_name)
        # recorriendo todas las calles y generando el estado de cada una
        ts.collect(simulation_time=t,
                   state_label=pn.getStateLabel(state=estado_actual),
                   active_net_name=activenet.name)
        # avanzando la simulacion
        traci.simulationStep()
        activenet.nextStep(t)
        t += 1
        wait += 1
        estado_actual = traci.trafficlight.getRedYellowGreenState(tls_name)
        if estado_actual != estado_anterior:
            # guardar en la bd en cada inicio de ciclo del semaforo, de tal manera que los datos sean por ciclo
            if pn.isStartOfCycle(state=estado_actual):
                ts.save(t)
            pn.stateChangeMsg(t, wait, estado_actual, estado_anterior,
                              activenet.name)
            wait = 0
    traci.close()
    return t
Beispiel #2
0
        if (100 < t < 200):
            if programaActual != "manual":
                traci.trafficlight.setProgram("semaforo_principal", "manual")
                print("[Cambiado a modo manual con redes de Petri]")
            net.nextStep()
        else:
            if programaActual != "principal":
                traci.trafficlight.setProgram("semaforo_principal",
                                              "principal")
                print("[Cambiado a modo automatico de SUMO]")
        estado_actual = traci.trafficlight.getRedYellowGreenState(
            "semaforo_principal")
        if estado_actual != estado_anterior:
            print("Estado cambiado: {}->{}".format(estado_anterior,
                                                   estado_actual))
        t += 1

    traci.close()


# este es el punto de entrada al script
if __name__ == "__main__":
    #? genera el archivo de configuracion que controla las rutas, tipos y flujo de los vehiculos
    config.generar_archivo_vehiculos()
    #? Generando la red de Petri
    net = generatePetriNet()
    #? este es el modo normal de usar traci. sumo es iniciado como un subproceso y entonces el script de python se conecta y ejecuta
    traci.start(['sumo-gui', "-c", config.sumo_data_path + 'demo.sumocfg'])
    #? ejecutando la funcion que controla a la simulacion
    run(net)