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