Skip to content

Exemplo da Aimsun Next Micro API 8

Exemplo de Controle (Prioridade de Ônibus em um Cruzamento)

Este exemplo mostra como usar a função da Aimsun Next API para gerenciar o plano de controle de modo que os ônibus que se aproximam de um cruzamento tenham sinal verde ao chegarem ao cruzamento. Uma vez que o ônibus sai do cruzamento, o plano de controle é restabelecido ao estado em que a chamada do ônibus foi detectada.

Versão em C++

#include "AKIProxie.h"
#include "CIProxie.h"
#include "ANGConProxie.h"
#include "AAPI.h"
#include <stdio.h>

double previousPhaseIndex, previousPhaseTime;

// Os procedimentos podem ser modificados pelo usuário
int AAPILoad()
{   
    return 0;
}

int AAPIInit()
{   
    ANGConnEnableVehiclesInBatch(true);
    previousPhaseIndex = -1;
    previousPhaseTime = -1; 
    return 0;
}
int AAPISimulationReady()
{
    return 0;
}
int AAPIManage(double time, double timeSta, double timeTrans, double acycle)
{
    return 0;
}

int AAPIPostManage(double time, double timeSta, double timeTrans, double acycle)
{ 
    int busPhase = 3;
    int intersection = 203;
    int busCallDetector = 383;
    int busExitDetector = 378;
    //obter a posição interna do ônibus
    int busVehiclePosition = AKIVehGetVehTypeInternalPosition( 9 );

    int currentPhase = ECIGetCurrentPhase( intersection );
    //verificar presença do ônibus no busCallDetector 
    if( AKIDetGetCounterCyclebyId( busCallDetector, busVehiclePosition ) > 0 && currentPhase != busPhase && previousPhaseIndex == -1){
        AKIPrintString( "ônibus detectado");            
        #mudar o controle para a fase do ônibus
        previousPhaseIndex = currentPhase;
        previousPhaseTime = time - ECIGetStartingTimePhase( intersection );
        ECIChangeDirectPhase( intersection, busPhase, timeSta, time, acycle, 0 );
    }   
    //verificar presença do ônibus no busExitDetector
    if( AKIDetGetCounterCyclebyId( busExitDetector, busVehiclePosition ) > 0 ){     
        //voltar para a fase anterior
        if( previousPhaseIndex > 0 ){
            AKIPrintString( "voltar para o estado anterior");               
            ECIChangeDirectPhase( intersection, previousPhaseIndex, timeSta, time, acycle, previousPhaseTime);
            previousPhaseIndex = -1;
            previousPhaseTime = -1; 
        }
    }
    return 0;
}

int AAPIFinish()
{
    return 0;
}

int AAPIUnLoad()
{
    return 0;
}

Versão em Python

from AAPI import *

def AAPILoad(): 
    return 0

def AAPIInit(): 
    return 0

def AAPISimulationReady():
    return 0

def AAPIManage(time, timeSta, timeTrans, acycle):   
    return 0

def AAPIPostManage(time, timeSta, timeTrans, acycle):
    global previousPhaseIndex
    global previousPhaseTime

    busPhase = 3
    intersection = 203
    busCallDetector = 383
    busExitDetector = 378
    #obter a posição interna do ônibus
    busVehiclePosition = AKIVehGetVehTypeInternalPosition( 9 )

    currentPhase = ECIGetCurrentPhase( intersection )
    #verificar presença do ônibus no busCallDetector 
    if AKIDetGetCounterCyclebyId( busCallDetector, busVehiclePosition ) > 0 and currentPhase != busPhase and previousPhaseIndex == -1:
        print "ônibus detectado"                    
        #mudar o controle para a fase do ônibus
        previousPhaseIndex = currentPhase
        previousPhaseTime = time - ECIGetStartingTimePhase( intersection )
        ECIChangeDirectPhase( intersection, busPhase, timeSta, time, acycle, 0 )

    #verificar presença do ônibus no busExitDetector
    if AKIDetGetCounterCyclebyId( busExitDetector, busVehiclePosition ) > 0:        
        #voltar para a fase anterior
        if previousPhaseIndex > 0:
            print "voltar para o estado anterior"                   
            ECIChangeDirectPhase( intersection, previousPhaseIndex, timeSta, time, acycle, previousPhaseTime)
            previousPhaseIndex = -1
            previousPhaseTime = -1


    return 0

def AAPIFinish():   
    return 0

def AAPIUnLoad():   
    return 0

previousPhaseIndex = -1
previousPhaseTime = -1