Aimsun Next microSDK¶
Descrição do Aimsun Next microSDK¶
A Plataforma Aimsun Next faz uso extensivo do conceito de plug-in, permitindo que componentes externos sejam carregados para estender as funcionalidades da aplicação. O microSDK do Aimsun Next permite a codificação de duas classes C++, para o veículo e os modelos de simulação usados para substituir o comportamento do veículo, e inclui as funções necessárias para registrar o novo modelo de comportamento para substituir o atual modelo de Microsimulação do Aimsun Next. Durante a simulação, o modelo de microsimulação atualiza cada veículo usando o modelo especificado. Cada veículo é uma instância da classe A2SimVehicle ou uma classe que deriva dela. Um modelo é uma instância da A2BehavioralModel ou uma classe que deriva dela.
Um desenvolvedor de Microsimulação Aimsun Next precisará subclassear tanto as classes A2SimVehicle quanto A2BehavioralModel. O plug-in gerado pelo projeto microSDK é então registrado usando um arquivo XML (veja abaixo) copiado para a pasta "plugins" encontrada dentro do diretório de instalação do Aimsun Next.
A Classe A2SimVehicle¶
Esta classe contém todos os dados relevantes do veículo, métodos para acessá-los, e métodos para atualizar o veículo a cada etapa da simulação. Estes estão organizados em cinco categorias, descritas abaixo.
Construtor¶
simVehicleParticular ( void * handlerVehicle, unsigned short idhandler, bool isFictitiousVeh, unsigned int vehTypeId = 0 );
O construtor do veículo, que normalmente é chamado a partir da função do modelo comportamental chamada "arrivalNewVehicle". Os dados internos do veículo estão sendo processados pelo Aimsun e não estão prontos para serem usados, então não tente usar outras funções dentro do construtor para acessar dados (funções get). Se você precisar acessar colunas do GKVehicle para recuperar atributos personalizados, use o vehTypeId fornecido, conforme mostrado no exemplo de código.
Funções relacionadas aos atributos do veículo¶
bool **isFictitious**() const;
Retorna se o veículo é real ou fictício (sombra de mudança de faixa, incidentes, dê preferência, parada, semáforos).
bool **isTrafficLight**() const;
Retorna se o veículo é um semáforo (Os semáforos são simulados com veículos parados fictícios para garantir que os veículos simulados parem da mesma forma que fariam ao entrar em uma fila).
int **getId**() const;
Retorna o ID do veículo, 0 se Fictício e > 0 caso contrário.
unsigned int **getVehType**() const;
Retorna o ID do tipo do veículo.
double **getAcceleration**( ) const;
Aceleração máxima do veículo conforme especificado no tipo do veículo considerando variações locais.
double **getDeceleration**( ) const;
Desaceleração normal do veículo conforme definido no tipo do veículo considerando variações locais.
double **getDecelerationMax**( ) const;
Desaceleração máxima do veículo conforme definida no tipo do veículo.
double **getEstimationOfLeadersDeceleration**(A2SimVehicle *leader, double LeaderSpeed) const;
Estimativa da desaceleração do líder usada no Modelo Gipps.
double **getDecelerationVariationFactor**(const bool ImprudentCase)const;
Retorna o fator de desaceleração aceito pelo veículo em caso de mudança de faixa imprudente.
unsigned int **getReactionSteps**() const;
Tempo de reação expresso em número de etapas de simulação considerando variações locais.
double **getReactionTime**() const;
Tempo de reação em segundos considerando variações locais.
double **getReactionTimeAtStop**() const;
Tempo de reação na parada considerando variações locais.
double **getReactionTimeAtTrafficLight**() const;
Tempo de reação no Semáforo considerando variações locais.
double **getLength**() const;
Comprimento do veículo conforme definido no tipo do veículo.
double **getMinimumDistanceInterVeh**() const;
Distância mínima à frente do veículo conforme definido no tipo do veículo.
double **getMinimumDistanceInterVeh**(A2SimVehicle *leader) const;
Distância mínima à frente do veículo, corrigida para o tipo do veículo do líder (0 se semáforo ou incidente).
double **getFreeFlowSpeed**() const;
Velocidade máxima desejada do veículo para a faixa atual.
double **getSensitivityFactor**() const;
Fator de Sensibilidade à desaceleração do Líder conforme definido no tipo do veículo.
double **getMinimumHeadway**() const;
Intervalo mínimo à frente do veículo conforme definido no tipo do veículo.
bool **isUpdated**() const;
Retorna verdadeiro se o veículo já foi atualizado, falso caso contrário.
double **getPosition**( const unsigned int state) const;
Retorna a posição do veículo no tempo (t – state * simulationStep) (unidades: m) a partir do início da seção A2K atual.
As A2KSections são as seções usadas pelo micro simulador. Todas as posições usadas no micro modelo referem-se às A2KSections.
double **getPositionInGKSection**( const unsigned int state) const;
Retorna a posição do veículo no tempo (t – state * simulationStep) (unidades: m) a partir do início da seção GK atual.
As GKSections são as seções fornecidas pela GUI. Se contiverem pontos de segmento, podem ser cortadas em diferentes A2KSections nesses pontos de segmento pelo modelo.
double **getPositionInTargetlane**( double X,int targetLane) const;
Retorna a posição na faixa alvo, equivalente a X na faixa atual;
double **getSpeed**( const unsigned int state) const;
Retorna a velocidade do veículo no tempo (t – state * simulationStep) (unidades: m/s).
void **getCoordinates**( double &xfront, double &yfront, double &xback, double &yback) const;
Retorna as coordenadas do mundo do ponto médio do para-choque frontal de um veículo (xfront, yfront) e as coordenadas do mundo do ponto médio do para-choque traseiro de um veículo (xback, yback).
double **getGap**(A2SimVehicle *vehUp, double ShiftUp, A2SimVehicle * vehDown,double ShiftDw,double &Xup, double &Vup, double &Xdw, double &Vdw,int time=1)const;
Retorna o espaço entre vehUp e vehDown, suas posições e velocidades no tempo t=t-RTup, t se time=0 ou t+dt se time=-1.
double **getPositionReferenceVeh**( const unsigned int state, A2SimVehicle *vehReference, const unsigned stateVehRef) const;
Esta função só funciona para veículos não fictícios. Ela será descontinuada e a função getGap deve ser usada em seu lugar.
Obtém a posição do veículo no tempo (t - state * simulationStep), levando em conta o veículo de referência vehReference (unidades: m). O veículo e o veículo de referência não precisam estar na mesma seção, ou na mesma faixa, embora a saída não considere a diferença de comprimento entre as seções, mas apenas ao longo delas. Se não localizado na mesma seção, a função retorna a menor distância entre as duas frentes dos veículos.
Funções relacionadas a Caminhos de Veículos¶
unsigned int **getIdCurrentLane**() const;
Retorna o índice da faixa atual do veículo, 1 sendo a faixa mais à direita da seção.
unsigned int **getIdCurrentSection**() const;
Retorna o índice da seção atual do veículo, ou próxima seção se o veículo estiver em um nó.
unsigned int **getIdNextSection**() const;
Retorna o índice da próxima seção do veículo.
unsigned int **getIdNextJunction**() const;
Retorna o índice da próxima interseção do veículo, ou interseção atual se o veículo estiver em um nó. Se a próxima interseção for uma junção (nó muito curto que não contém nenhuma entidade), a função retorna -1.
unsigned int **getIdNextTurning**() const;
Retorna o índice da próxima curva do veículo, ou curva atual se o veículo estiver em um nó. Se o próximo nó for uma junção (nó muito curto que não contém nenhuma entidade), a função retorna -1.
bool **isInAReservedLane**() const;
Retorna se o veículo está em uma faixa reservada ou não.
int **getNumberOfMainLanesInCurrentSection**() const;
Retorna o número de faixas da seção atual do veículo, não levando em conta faixas laterais.
int **getNumberOfLanesInCurrentSection**() const;
Retorna o número total de faixas da seção atual do veículo.
int **getNumberOfMainLanesInNextSection**() const;
Retorna o número de faixas da próxima seção do veículo, não levando em conta faixas laterais.
int **getNumberOfLanesInNextSection**() const;
Retorna o número total de faixas da próxima seção do veículo.
bool **IsLaneOnRamp**(int targetlane) const;
Retorna verdadeiro se targetLane (-1 é esquerda, 0 atual e 1 é direita) for uma faixa lateral de entrada.
bool **isCurrentLaneInNode**() const;
Retorna verdadeiro se a faixa atual estiver dentro de um nó.
double **getDensity**(const int targetLane) const;
Retorna a densidade dentro da faixa alvo (-1 é esquerda, 0 é atual, 1 é direita) em veículos/m.
double **getLaneDensity**(const int lane) const;
Retorna a densidade dentro da faixa (1 é a faixa mais à direita da seção) em veículos/m.
int **getNumberOfVehiclesStoppedInLane**(const int lane) const;
Retorna o número de veículos com velocidade=0 dentro da faixa (1 é a faixa mais à direita da seção) em veículos/m.
double **getAverageSpeedAHead**(const int targetLane, const double maximumDist, const int maximumNbVehs) const;
Retorna a velocidade média dos primeiros maximumNbVehs veículos localizados dentro da maximumDist (metros) dentro da faixa alvo (-1 é esquerda, 0 é atual, 1 é direita) em m/s.
double **getAverageLaneSpeedAHead**(const int ordenCarril, double maximumDist, int maximumNbVehs) const;
Retorna a velocidade média dos primeiros maximumNbVehs veículos localizados dentro da maximumDist (metros) dentro da faixa (1 é a faixa mais à direita da seção) em m/s.
void **setNextSection**(int idNextSection) const;
Define a próxima seção do veículo (deve ser chamada antes de entrar no nó).
void **setTargetLaneInDownStreamSection**(int idNextSection, int nextTargetLane) const;
Define a próxima faixa e próxima seção do veículo (precisa ser chamada antes de entrar no nó).
enum Type {eNone, eReservedLane, eTurning, eNotAllowedInfluence,eNotAllowed, ePTStopInfluence, eOnRamp, eLaneClosureInfluence,eIncidentInfluence, eLaneClosure, eIncident, ePTStop};
int **getObstacleType**() const;
Obtém o tipo de obstáculo presente na faixa atual. Usa o tipo enumerado para retornar o tipo de obstáculo.
int **getObstacleTypeInLane**(const int lane) const;
Obtém o tipo de obstáculo presente na faixa (1 é a faixa mais à direita).
double **getDistance2Obstacle**() const;
Obtém a distância até o próximo obstáculo presente na faixa atual.
double **getDistance2ObstacleInLane**(const int lane) const;
Obtém a distância até o próximo obstáculo presente na faixa (1 é a faixa mais à direita).
double **getDistanceOfInfluenceOfObstacleInLane**(const int ordenCarril) const;
Obtém a distância de influência até o próximo obstáculo presente na faixa (1 é a faixa mais à direita).
int **getNbLaneChanges2ReachNextValidLane**() const;
Obtém o número de mudanças de faixa a serem feitas para alcançar uma faixa válida (> 0 significa direita).
Funções relacionadas à Localização de Veículos Circundantes¶
A2SimVehicle * **getLeader**(double &Shift) const;
Retorna o líder atual (pode ser fictício) e seu deslocamento. Shift é o deslocamento entre o início da seção do veículo e o início da seção do líder. O líder estando a jusante, é ≥ 0.
A2SimVehicle * getReflectedVehicle() const;
Retorna o veículo refletido por um Nexo ou um Conflito. maxDist serve como uma ferramenta para definir uma distância de visibilidade personalizada para a busca. Não usar a maxDist (valor negativo) fará com que o algoritmo use o padrão para o Gipps.
A2SimVehicle * **getRealLeader**(double &Shift, double maxDist = -1) const;
Retorna o líder atual (não fictício) e seu deslocamento.
A2SimVehicle * getCooperationLeader(double &Shift) const;
Retorna o líder de cooperação e seu deslocamento.
A2SimVehicle * getTargetGapLeader (double &Shift) const;
Retorna o líder de cooperação e seu deslocamento.
bool hasSimpleLeader() const;
Retorna se a condição de liderança mais restritiva do veículo é outro veículo normal (simples) ou se é qualquer outra condição de via (complexa) como linhas de parada, conflitos, obstáculos e semelhantes. A condição de infinito (não ter líder) é considerada simples e retornaria verdadeiro.
A2SimVehicle * **getFollower**(double &Shift) const;
Retorna o seguidor atual (pode ser fictício) e seu deslocamento. Shift é o deslocamento entre o início da seção do veículo e o início da seção do seguidor. O seguidor estando a montante, é ≤ 0.
A2SimVehicle * **getRealFollower**(double &Shift) const;
Retorna o seguidor atual (não fictício) e seu deslocamento.
void **getUpDown**(int targetlane, double shiftPos, A2SimVehicle *&vehUp, double &shiftUp, A2SimVehicle *&vehDown, double &shiftDown ) const;
Retorna os veículos atuais acima e abaixo (podem ser fictícios) e seus deslocamentos na faixa alvo (-1 é esquerda, 0 atual e 1 é direita).
void **getRealUpDown**(int targetlane, double shiftPos, A2SimVehicle *&vehUpReal, double &shiftUp, A2SimVehicle *&vehDownReal, double &shiftDown) const;
Retorna os veículos atuais acima e abaixo (podem ser fictícios) e seus deslocamentos (não fictícios) na faixa alvo (-1 é esquerda, 0 atual e 1 é direita).
bool isCooperating() const;
Retorna se o veículo está cooperando com outro veículo para criar um espaço para realizar uma mudança de faixa.
bool isTargetingGap() const;
Retorna se o veículo está visando um espaço em outra faixa, significando que outro veículo está cooperando com ele para permitir uma mudança de faixa.
Funções relacionadas ao uso de outras APIs¶
bool **hasMandatorySpeed**() const;
Retorna se o veículo foi definido pela API para ter uma velocidade definidamandatória.
bool **hasModifiedSpeed**() const;
Retorna se o veículo foi definido pela API para considerar usar uma velocidade definida caso as condições permitam.
double **getAPISpeed**() const;
Retorna a velocidade dada ao veículo pela API, seja obrigatória ou modificada, retorna valor negativo se nenhuma velocidade for definida.
Funções relacionadas ao Seguimento de Veículos¶
bool **applyAimsunCarFollowingModel**()const;
Aplica o modelo de seguimento de veículos padrão para este veículo.
double **getAimsunCarFollowingSpeed**() const;
Calcula a velocidade padrão de seguimento de veículos para este veículo.
double **getAccelerationComponentGippsModelSpeed**() const;
Calcula o componente de velocidade de aceleração padrão para este veículo com suas características atuais.
double **getAccelerationComponentGippsModelSpeed**(double CurrentSpeed ,double TargetSpeed,double deltaRT) const;
Calcula o componente de velocidade de aceleração para este veículo e valores de entrada especificados.
double **getDecelerationComponentGippsModelSpeed**(double Distance2Obstacle) const;
Calcula o componente de velocidade de desaceleração padrão para este veículo imposto por um obstáculo parado localizado a uma Distância2Obstacle do veículo.
double **getDecelerationComponentGippsModelSpeed**(const A2SimVehicle *Leader,double ShiftPre,bool controlDecelMax,bool aside,int time) const;
Calcula o componente de velocidade de desaceleração padrão para este veículo imposto pelo veículo Líder com deslocamento ShiftPre, onde:
- controlDecelMax limita o resultado para ser compatível com as capacidades de frenagem.
- aside usa uma implementação especial que permite uma adaptação mais suave em caso de lacunas negativas se o líder estiver em uma faixa diferente.
- time (normalmente definido como 1), pode ser definido como 0 se previsões forem necessárias para o tempo t+RT.
Funções relacionadas à Mudança de Faixa¶
bool **applyAimsunLaneChangingModel**()const;
Aplica o modelo de mudança de faixa padrão para este veículo.
bool **isLaneChangingPossible**(int targetLane) const;
Retorna se a mudança de faixa é possível em direção à faixa alvo (-1 é esquerda, 0 atual e 1 é direita). Verifica: falta de faixas contínuas e que o veículo não está atualmente mudando de faixa.
bool **isGapAcceptable**(int targetlane,double XposInpEntObj,const A2SimVehicle *pVehUp,double ShiftUp,const A2SimVehicle *pVehDw,double ShiftDw)const;
Retorna se o espaço entre pVehUp e pVehDw é aceitável de acordo com os valores de CarFollowingDecelerationComponentSpeed().
void **assignAcceptedGap**(int targetlane,double XPosInpEntObj,const A2SimVehicle *vehUp,double ShiftUp,const A2SimVehicle *vehDown,double ShiftDw,int threadId) const;
Coloca o veículo na lista de veículos para mudar de faixa, permitindo que os algoritmos Aimsun decidam se é possível em termos de prioridade com relação a outros veículos dispostos a mudar de faixa.
void **targetNewGap**(int targetlane, double XPosInpEntObj, const A2SimVehicle *vehUpReal, double ShiftUp, const A2SimVehicle *vehDownReal, double ShiftDw, int threadId)const;
Busca um novo espaço alvo para cooperação em torno do espaço entre vehUp e vehDown.
void **assignNewTargetGap** (double XPosInpEntObj,const A2SimVehicle *vehUpReal,double ShiftUp,const A2SimVehicle *vehDownReal,double ShiftDw,int threadId) const;
Coloca o veículo na lista de veículos para mirar o espaço entre vehUp e vehDown (vehUp cooperará dependendo dos parâmetros de cooperação), permitindo que os algoritmos padrão do Aimsun decidam se é possível em termos de prioridade com relação a outros veículos dispostos a visarem o mesmo espaço.
void **applyLaneChanging**(const int targetlane, int threadId)const;
Realiza a Mudança de Faixa em direção à faixa alvo. Esta função inclui a aceitação de espaço.
void **setAsCourtesyVehicle**(const A2SimVehicle *veh2Yield, double ShiftVeh2Yield, int threadId);
Força o veículo atual a cooperar com veh2Yield. ShiftVeh2Yield é o deslocamento entre o início da seção do veículo e o início da seção do líder. O veh2Yield sendo a jusante, é ≥ 0.
A Classe A2BehaviouralModel¶
O objetivo desta classe é atualizar todos os veículos a cada etapa da simulação. Alguns de seus métodos virtuais podem ser reescritos para atender aos seguintes requisitos:
arrivalNewVehicle¶
Esta função cria um novo veículo. Normalmente, este método retornará não uma instância de A2SimVehicle, mas uma instância de uma subclasse desta classe. Este método é chamado cada vez que um novo veículo é gerado; seja quando um veículo real é gerado antes de entrar na rede ou na fila virtual; ou quando um veículo fictício é criado durante a simulação, como um veículo de conflito ou nexo.
removedVehicle¶
Esta função deleta um veículo. Este método é chamado cada vez que um veículo é removido do modelo; seja quando um veículo real sai da rede; ou quando um veículo fictício é removido durante a simulação, como um veículo de conflito ou nexo.
evaluateLaneChanging¶
Este método permite a reimplementação de uma nova lógica de Mudança de Faixa completa e deve retornar um bool definido como verdadeiro se o veículo estiver usando-a e falso se o veículo estiver usando o método de mudança de faixa padrão. As funções do veículo que podem ser usadas neste método incluem:
- isLaneChangingPossible
- isGapAcceptable
- setAsCourtesyVehicle
- applyLaneChanging
- assignAcceptedGap
- applyAimsunLaneChangingModel
Este método é chamado uma vez por etapa de simulação para cada veículo. É chamado depois que cada veículo identificou seu líder; antes que qualquer veículo mude de faixa e antes do método de seguimento de veículos.
evaluateCarFollowing¶
Este método permite a reimplementação de uma nova lógica de Seguimento de Veículos completa e deve retornar um bool definido como verdadeiro se o veículo estiver usando-a e falso se o veículo estiver usando o método padrão de seguimento de veículos do Aimsun. As saídas dessa função são a nova velocidade e nova posição do veículo. As funções do veículo que podem ser usadas neste método incluem:
- getAimsunCarFollowingSpeed
- getAccelerationComponentGippsModelSpeed
- getDecelerationComponentGippsModelSpeed
- applyAimsunCarFollowingModel
Este método é chamado após todos os veículos mudarem de faixa e identificarem seu (novo) líder; antes que qualquer veículo tenha atualizado sua velocidade e posição.
Uma alternativa à implementação de métodos completos de seguimento de veículos e/ou mudança de faixa consiste em modificar as expressões-chave usadas nos métodos de seguimento e mudança de faixa do Aimsun Next, especificamente os componentes de velocidade de aceleração e desaceleração e a lacuna mínima usada na aceitação de espaço. A implementação padrão é mostrada como um exemplo.
computeCarFollowingAccelerationComponentSpeed¶
Este método e o correspondente computeCarFollowingDecelerationComponentSpeed sobreescrevem as expressões do modelo Gipps ao longo de toda a simulação (afetando o seguimento de veículos, mas também a motivação para mudança de faixa e aceitação de lacuna).
O computeCarFollowingAccelerationComponentSpeed pode ser chamado muitas vezes por etapa de simulação para cada veículo, com diferentes valores de entrada quando:
- O veículo escolhe a próxima conexão que vai tomar.
- O veículo está envolvido em um cálculo de dê preferência, sendo o veículo prioritário ou o veículo que dá passagem.
- O veículo estima se pode acelerar em um espaço à frente para realizar uma mudança de faixa.
- O veículo está avaliando sua nova velocidade com restrições de sua seção atual.
- O veículo está avaliando sua nova velocidade com restrições da próxima curva.
O computeCarFollowingDecelerationComponentSpeed pode ser chamado muitas vezes por etapas de simulação para cada veículo com diferentes valores de entrada quando:
- Quando o veículo está prestes a entrar, para verificar se pode entrar atrás do último veículo presente na faixa.
- O veículo seleciona a próxima conexão que vai usar.
- Para verificar qual potencial líder é o mais restritivo durante a avaliação do líder na faixa atual ou na faixa alvo.
- O veículo está avaliando sua nova velocidade levando em conta diferentes tipos de líderes, como líder atual, ponto de ônibus, obstáculos, veículo prioritário, líder de cooperação, líder de rampa de saída…
computeMinimumGap¶
Este método sobreescreve os critérios de minimumGap para Aceitação de Espaço ao longo de toda a simulação. É chamado quando o veículo está tentando mudar de faixa e avalia as lacunas mínimas necessárias em relação aos veículos a montante e a jusante localizados na faixa alvo. Também é chamado quando o veículo avalia se pode se adaptar a um veículo que solicita cooperação e para calcular a velocidade atrás de um líder localizado em uma faixa adjacente.
isVehicleGivingWay¶
Este método sobreescreve o modelo de aceitação de espaço nos dê preferências. É chamado para cada par de veículo dando preferência e veículo potencial prioritário envolvidos em um dê preferência. O modelo de dê preferência é executado antes dos modelos de mudança de faixa e seguimento de veículos.
avoidCollision¶
Este método é chamado uma vez por veículo e por etapa de simulação, após todos os veículos terem sido atualizados. A ação padrão (obtida ao retornar falso) é mover para trás aqueles veículos que se sobreporem ao veículo precedente.
Métodos de Simulação¶
virtual double **getSimStep**();
Retorna a etapa de simulação.
virtual A2SimVehicle * **arrivalNewVehicle**( void *handlerVehicle, unsigned short idHandler, bool isFictitiousVeh, unsigned int vehTypeId) = 0;
Entra um novo veículo no modelo externo.
virtual void removedVehicle( void *handlerVehicle, unsigned short idHandler, A2SimVehicle * a2simVeh ) = 0;
Remove um veículo do modelo externo.
virtual bool **evaluateLaneChanging**( A2SimVehicle *vehicle ) = 0;
Avalia a nova faixa e ordem do veículo.
virtual bool **evaluateCarFollowing**(A2SimVehicle *vehicle, double &newpos, double &newspeed) = 0;
Avalia a nova velocidade e posição do veículo.
virtual double **computeCarFollowingAccelerationComponentSpeed**(A2SimVehicle *vehicle, double VelActual, double VelDeseada, double RestoCiclo)=0;
Calcula o componente de aceleração da velocidade a ser usada ao longo de todo o modelo.
virtual double **computeCarFollowingDecelerationComponentSpeed**(A2SimVehicle *vehicle, double Shift, A2SimVehicle *vehicleLeader, double ShiftLeader,bool controlDecelMax=false, bool aside=false,int time=1)=0;
Calcula o componente de desaceleração da velocidade a ser usada ao longo de todo o modelo. Inclui seguimento de veículos em faixa adjacente (aside).
virtual double **computeCarFollowingDecelerationComponentSpeedCore**(A2SimVehicle *vehicle, double speedVehicle, A2SimVehicle *vehicleLeader, double speedLeader, double gap, double leaderDecelerationEstimated)=0;
Calcula o componente de desaceleração da velocidade a ser usada ao longo de todo o modelo.
virtual double **computeMinimumGap** (A2SimVehicle *vehicleUp, A2SimVehicle *vehicleDown,double Xup,double Vup,double Xdw,double Vdw,double Gap,bool ImprudentCase=false, bool VehicleIspVehDw=false)=0;
Calcula a lacuna mínima necessária entre o veículo a montante e o a jusante para garantir a continuidade.
virtual bool **isVehicleGivingWay**(A2SimVehicle *vehicleGiveWay, A2SimVehicle *vehiclePrioritary, yieldInfo *givewayInfo, int &Yield)=0;
Avalia se o veículo vehicleYield deve parar para evitar colisão com vehiclePrio ou se pode seguir.
virtual bool **avoidCollision**(A2SimVehicle *vehicle,A2SimVehicle *vehiclePre,double ShiftPre)=0;
Utiliza as informações sobre o veículo e seu líder e corrige a posição do veículo se necessário.
virtual int **evaluateLaneSelectionDiscretionary**(A2SimVehicle *vehicle,bool LeftLanePossible,bool RightLanePossible)=0;
Substitui o modelo de seleção de faixa entre faixas válidas se o veículo já estiver na Zona 1.
virtual int **evaluateHasTime2CrossYellowState**(A2SimVehicle *vehicle, double distance2StopLine) = 0;
Chamada quando o comportamento do sinal vermelho foi adicionado (como um veículo parado). Valor de retorno: -1: não avaliado (e o Aimsun Next avaliará o veículo seguindo seu modelo interno), 0: o veículo não tem tempo para atravessar, 1: o veículo tem tempo para atravessar.
A Classe A2BehavioralModelCreator¶
Esta classe criará uma classe de modelo comportamental. O desenvolvedor deve subclasseá-la para retornar um novo modelo.
class A2BehavioralModelCreator{
public:
A2BehavioralModelCreator();
~ A2BehavioralModelCreator();
virtual A2BehavioralModel * newModel() = 0;
};
Registrando um Novo Modelo¶
Aimsun Next carrega todos os plug-ins encontrados na pasta de plug-ins, /ProgramFiles/Aimsun/Aimsun Next X.X/plugins/.
Cada plug-in é declarado usando um arquivo XML. O nome não é importante, exceto que o Aimsun Next carrega plug-ins em ordem alfabética. Por essa razão, é recomendável numerar cada plug-in para fixar a ordem de carregamento.
O XML contém as seguintes tags:
<plugin>
<name>MyModel</name>
<lib>mymodel</lib>
</plugin>
Onde o nome é o nome único do plug-in usando caracteres ASCII e lib é a biblioteca (sem qualquer extensão de arquivo) que contém o código.
Aimsun Next carregará o plug-in e procurará uma função C que criará uma instância do A2BehavioralModelCreator. A função C será chamada como o nome do plug-in encontrado no arquivo XML com o sufixo Factory. No exemplo anterior, o plug-in foi chamado MyModel, então a função será chamada MyModelFactory.
Ao especificar um Experimento em um Cenário Dinâmico, o comportamento externo pode ser habilitado ou desabilitado na aba Comportamento. Isso significa que um Cenário pode ser executado com dois Experimentos, um com e outro sem o comportamento modificado e a diferença no comportamento da rede comparada.
Notas do Windows¶
No Windows, símbolos devem ser exportados explicitamente. Para fazer isso, o seguinte código: __declspec(dllexport) deve ser incluído. Isso é verdade tanto para classes quanto para funções C. É comum usar as seguintes declarações de definição para tratar deste problema (o arquivo A2BehavioralModelUtil.h contém essas declarações):
#ifdef _WIN32
#ifdef _A2BehavioralModelUtil_DLL
#define A2BehavioralModelUtil_EXPORT __declspec(dllexport)
#else
#define A2BehavioralModelUtil_EXPORT __declspec(dllimport)
#endif
#else
#define A2BehavioralModelUtil_EXPORT
#endif
O Makefile (ou as Configurações do Visual) definirá _A2BehavioralModelUtil_DLL ao compilar o plug-in. E cada classe e função será decorada como:
class A2BehavioralModelUtil_EXPORT behavioralModelParticularCreator:
public A2BehavioralModelCreator
{
…
};
extern "C" A2BehavioralModelUtil_EXPORT A2BehavioralModelCreator *
MyModelFactory();