Introdução ao SUMO

SUMO (Simulation of Urban MObility) é uma ferramenta de código aberto (open source) para simulação microscópica de trânsito. A ferramenta está disponível em http://sumo-sim.org.

Para usuários do sistemas operacional Windows, o link para download se encontra na página inicial no item “Download (for Windows)”. Para usuários Linux, pode ser acessado o item “Download” no menu superior.

Nesse tutorial é explicado como criar uma simulação básica, com a criação de um cruzamento semaforizado e a inclusão de um veículo para percorrer a via criada.

Especificando uma network (rede)

A definição de uma network inicia com a especificação de pontos (nós ou vértices) que serão ligados, conectando-se. Para isso será necessário especificar dois arquivos no formato XML esperado do SUMO, sendo esse o arquivo de nós/pontos (nodes) e o arquivo de ligação/junção (edges).

A Figura abaixo ilustra a rede que ser irá desenvolver inicialmente. Ela é constituída de 3 pontos que são interligados formando 2 ruas. Cada ponto está identificado iniciando com a letra “p” e seguida de um número.

projeto_sumo1

O arquivo de nós para formar a rede é mostrado a seguir e deve ser salvo com a extensão “.nod.xml”. A extensão do nome do arquivo não é obrigatória, mas é recomendado seguir essa convenção na nomenclatura.

<nodes>
  <node id="p1" x="0"   y="0" />
  <node id="p2" x="100" y="0" />
  <node id="p3" x="50"  y="50" />
</nodes>

Cada tag nomeada “node” possui a indicação de um ponto, sendo necessário especificar seu posicionamento no eixos “x” e “y” e um identificar único (id) que permitirá posteriormente identificar o nó para realizar sua ligação com outro nó. Opcionalmente também pode ser fornecido uma coordenada “z” representando uma altura, mostrando que os mapas podem ser especificados em 3D, embora não será abordado nesse material.

Dica: os arquivos do SUMO são escritos utilizando a linguagem XML. Sendo assim, recomendo que seja utilizado algum editor de textos que suporte a escrita de XMLs, como o Notepad++ (http://notepad-plus-plus.org)

Para a ligação dos pontos será utilizado a especificação mostrada a seguir. Cada ligação gerará uma via seguindo do ponto indicado no parâmetro “from” e indo até o ponto indicado em “to”. O parâmetro para essas propriedades é o identificador do nó indicado anteriormente no arquivo de nós (nome dos pontos indicados na propriedade “id” do arquivo anterior).

<edges>
  <edge from="p1" to="p2" id="1to2" />
  <edge from="p2" to="p3" id="2to3" />
</edges>

Criando efetivamente a network (rede)

Tendo especificado os dois arquivos anteriores (arquivo de nós/nodes e de ligações/edges) é possível criar a network, que a junção dos nós e ligação gerando as rede viária. Essa tarefa é feita a partir do executável netconvert, presente na parta “bin” do SUMO. O que será mostrado a seguir é minha recomendação de como fazer o processo de criar a rede. Considero esse o jeito mais simples e que dispensa detalhamentos técnicos. A forma “padrão” encontrada em outros materiais, como a própria documentação, é mais trabalhosa.

Inicialmente, copie os arquivos “netconvert.exe” (dependendo da versão do SUMO que foi baixada, o arquivo se chamará netconvert64.exe) e as DLLs “xerces-c_3_1.dll”, “proj.dll” e “gdal18.dll” para a pasta onde estão sendo salvos os arquivos do projeto. Crie um arquivo com extensão “.netc.cfg” e insira o código a seguir nesse arquivo. Esse arquivo é um arquivo de configuração para o Netconvert e informa qual o nome do arquivo de nós/nodes (está sendo considerado que o nome do arquivo de nós foi salvo como meu.nod.xml), qual o nome do arquivo de ligação/edges (está sendo considerado o nome do arquivo salvo como meu.edg.xml) e também é especificado um nome para o arquivo da rede que será gerada pelo Netconvert (que no caso do arquivo de configuração foi especificado o nome meu.net.xml).

<configuration>
   <input>
       <edge-files value="meu.edg.xml"/>
       <node-files value="meu.nod.xml"/>
   </input>
   <output>
       <output-file value="meu.net.xml"/>
   </output> 
</configuration>

Tendo o arquivo de configuração especificado, basta arrastar o arquivo para cima do Netconvert. Uma janela de fundo preto será rapidamente aberta e um arquivo chamado “meu.net.xml” será criado.

Para testar se a rede foi especificada conforme foi planejado, é possível abrir a network no SUMO e visualizá-la. Faça isso abrindo o sumo a partir do arquivo SUMO-GUI, clique em “file” e depois na opção “open network”, abrindo o arquivo recém criado. O resultado esperado é o apresentado na figura abaixo.

sumo1

Se o arquivo network não for gerado é que algum erro aconteceu nas especificações. A tela de fundo preto que abriu deve ter mostrado o erro, mas ela se fecha muito rápido. Nesse caso é preciso utilizar o “prompt de comando” (no caso do Windows) ou o terminal (para usuários do Linux). Chamarei ambos de terminal.

No terminal é preciso entrar no diretório onde estão sendo salvos os arquivos do projeto e para onde foi copiado o Netconvert e DLLs necessárias. No terminal digite o comando (sem as aspas) “netconvert –node-files=meu.nod.xml –edge-files=meu.edg.xml –output-file=meu.net.xml”. Preste atenção que o último parâmetro (output-file) está na singular, diferente dos dois anteriores que estão no plural. Repare também que os parâmetros informados são os nomes dos arquivos de nós, ligações e o arquivo da rede que deve ser gerado.

Importante: de um usuário do Linux já é esperado que ele saiba utilizar o terminal. Usuários do Windows podem conferir meu vídeo em https://www.youtube.com/watch?v=PahY1W5_lCc a partir do instante 4:33min, onde demonstro melhor esse processo.

Adicionando mais detalhes a network (rede)

A rede gerada é ainda muito simples, composta de duas ruas de mão única. Para fazer uma rua de mão dupla, é necessário especificar duas ligações, invertendo os valores “from” e “to”. O resultado é mostrado na figura a seguir. A rua na diagonal possui mão dupla com a ligação dos pontos “p2” e “p3” e depois dos pontos “p3” e “p2”. A via na horizontal possui apenas um sentido, indo do ponto “p1” para o “p2”.

projeto_sumo2_
<edges>
  <edge from="p1" id="1to2" to="p2" />
  <edge from="p2" id="2to3" to="p3" />
  <edge from="p3" id="3to2" to="p2" />
</edges>

Um detalhe importante é que qualquer modificação feita no arquivo de nós e edges precisa com que seja executado o Netconvert novamente, afinal é o arquivo de rede (network) que é aberto no SUMO. Sendo assim, siga os passos já vistos do uso do Netconvert e só depois abra a rede no SUMO.

Criando um cruzamento

Inicialmente a tentativa de criar um cruzamento seria criar um novo ponto (p4, na coordenada 50,-40) e um novo edge ligando o ponto “p3” com o novo ponto. As especificações abaixo para os nós e edges correspondem a figura a seguir. O cruzamento que se pretendia criar está demarcado pelo círculo pontilhado.

projeto_sumo4

Código dos nós (adição da linha 5 com relação a especificação anterior):

<nodes>
  <node id="p1" x="0"   y="0" />
  <node id="p2" x="100" y="0" />
  <node id="p3" x="50"  y="50" />
  <node id="p4" x="50"  y="-40" />
</nodes>

Código dos edges (adição da linha 5 com relação a especificação anterior):

<edges>
  <edge from="p1" id="1to2" to="p2" />
  <edge from="p2" id="2to3" to="p3" />
  <edge from="p3" id="3to2" to="p2" />
  <edge from="p3" id="3to4" to="p4" />
</edges>

A forma especificada não cria efetivamente o cruzamento, sendo essa uma maneira incorreta. A seguir mostro como criar corretamente o cruzamento, mas se você gerar a rede, ao abrir no SUMO você verá o resultado mostrado abaixo. Você pode estranhar ver as partes marcadas com o círculo pontilhado, mas isso não é problema e a rede está correta. A aparência estranha é apenas um defeito visual e não pode ser corrigido.

sumo4

Para criar corretamente o cruzamento é preciso que o cruzamento possua mais um nó, como é mostrado na figura abaixo e especificado a seguir.

projeto_sumo5

Código dos nós:

<nodes>
  <node id="p1" x="0"   y="0" />
  <node id="p2" x="100" y="0" />
  <node id="p3" x="50"  y="50" />
  <node id="p4" x="50"  y="0" />
  <node id="p5" x="50"  y="-40" />
</nodes>

Código dos edges:

<edges>
  <edge from="p1" id="1to4" to="p4" />
  <edge from="p4" id="4to2" to="p2" />
  <edge from="p2" id="2to3" to="p3" />
  <edge from="p3" id="3to4" to="p4" />
  <edge from="p4" id="4to5" to="p5" />
</edges>

Observe que o arquivo de nós apenas precisou adicionar mais um nó, mas que o arquivo de edges precisou de mais especificações, sendo necessário ligar o primeiro ponto ao cruzamento e o cruzamento ao final daquela via. Sendo assim a especificação do que seria uma rua precisa ser especificado por suas partes (no caso, duas partes: antes do cruzamento e depois do cruzamento).

Ao gerar a nova rede o resultado é o mostrado a seguir. O resultado pode parecer um pouco estranho, mas é que o cruzamento é de duas vias de mão única. No tópico a seguir, sobre semáforo, será mostrado a adição de duas mãos e o cruzamento parecerá mais “normal”. Observe pela setas que o SUMO já determina as direções possíveis de se seguir através das setas.

sumo5

Lembre-se de a cada vez que alterar os nós ou edges, é preciso gerar novamente a rede.

Implantando um semáforo

Semáforos podem ser colocados em qualquer nó e o SUMO irá gerar automaticamente sua programação semafórica e os veículos sempre a irão respeitar. Os nós que precisam ter um semáforo deve ser alterados adicionando o parâmetro type=”traffic_light”, conforme exemplificação no código a seguir.

<nodes>
  <node id="p1" x="0"   y="0" />
  <node id="p2" x="100" y="0" />
  <node id="p3" x="50"  y="50" />
  <node id="p4" x="50"  y="0" type="traffic_light" />
  <node id="p5" x="50"  y="-40" />
</nodes>

Segundo a especificação, o ponto “p4” passou a conter um semáforo. A parte a esquerda da figura abaixo ilustra o resultado obtido no cruzamento. Em posterior funcionamento da simulação, será possível observar os sinais se alterarem e os veículos obedecerem o semáforo. A parte a direita da figura mostra o cruzamento obtido com a adição de mais uma mão na via horizontal especificada.

sumo6

Com relação a adição da nova mão na via que possui um cruzamento, esse deve ser cuidado pois, assim como foi ligado o ponto “p1” com o ponto “p4” do cruzamento, será necessário fazer as ligação contrárias, no caso, ligando o “p4” com o “p1” e a ligação entre “p4” e “p2” precisa ser complementada com uma ligação entre “p2” e “p4”, conforme código de edges a seguir.

<edges>
  <edge from="p1" id="1to4" to="p4" />
  <edge from="p4" id="4to1" to="p1" />
  <edge from="p4" id="4to2" to="p2" />
  <edge from="p2" id="2to4" to="p4" />
  <edge from="p2" id="2to3" to="p3" />
  <edge from="p3" id="3to4" to="p4" />
  <edge from="p4" id="4to5" to="p5" />
</edges>

Adicionando veículos

Até o momento o que se obteve nas especificações é a elaboração da malha viária, sem qualquer veículo fazendo uso dessa. Os passos seguintes consistem em adicionar veículos fazendo certo percurso nas vias especificadas. Sendo assim, a adição de veículos depende da elaboração de rotas e de que veículos atuarão na rota definida. A especificação a seguir deve ser salva com a extensão “.rou.xml”.

O primeiro passo para criar a rota é especificar um tipo de veículo. A segunda linha da especificação abaixo realiza isso utilizando a tag “vType”. Nela são especificadas as aceleração (accel), desaceleração (decel) e velocidade máxima que o veículo irá alcançar, utilizando a unidade de metros por segundo (m/s). O parâmetro “id”, assim como visto na especificação de nós e edges, servirá para identificar esse tipo de veículo. Também está sendo definido um tamanho (length) que o veículo deverá ter largura, definido em metros. Todos os tipos de veículos que irão transitar nas vias deveria estar especificado através dessa tag.

Definido um tipo de veículo, o próximo passo é especificar as rotas (caminhos) que os veículos irão fazer. Na especificação a seguir apenas uma rota foi definida, mas na prática deverão ser especificadas diversas rotas especificando os caminhos que os veículos irão fazer na simulação. A rota é definida pela tag “route” e é composta por um identificador (id) único e o parâmetro edges, que é o nome especificados para os edges e separados por espaço.

Para finalizar é especificado realmente o veículo, que deverá ser de um tipo e trafegar em uma rota. A linha 4 da especificação das rotas é responsável por essa especificação. O primeiro parâmetro (type) define de qual tipo é o veículo (que no caso da especificação é identificado por “Car”) e a rota (route) do veículo (definida como “rotaO”). Também é especificado um identificador para o veículo especificado através da tag “id” e finalizando com a especificação apresentada na tag “depart”, onde é especificado em que tempo da simulação o veículo será gerado, que no caso significa logo ao início da simulação.

<routes>
  <vType accel="2" decel="4" maxSpeed="20" id="Car" length="5" />
  <route id="rota0" edges="1to2 2to3" />
  <vehicle type="Car" route="rota0" id="carro1" depart="1" />
</routes>

Ao simular, observe que na rota especificada, o veículo não percorre toda a via, desaparecendo no nó final que compõe a via. Para fazer um trajeto que percorra toda a via seria preciso especificar outra rota e fazer o veículo trafegar por ela. Mais adiante é mostrado como realizar tal ação.

Criando um arquivo de configuração

Temos agora o último arquivo que precisa ser especificado para conseguir executar a simulação. Ele é um arquivo que configura que arquivos serão utilizados para a simulação, sendo o arquivo de configuração o responsável por associar os arquivo da network e da rota especificados. A especificação abaixo gera a configuração e deve ser salva com a extensão .sumocfg.

<configuration>
  <input>
    <net-file value="meu.net.xml"/>
    <route-files value="meu.rou.xml"/>
  </input>
</configuration>

Basicamente precisamos fornecer no parâmetro “value”, o nome dos arquivos de especificação gerados da network e da rota. Eles são obrigatórios. Uma forma simplificada de escrever o arquivo de configuração é mostrada a seguir, mas faz exatamente a  mesma coisa.

<configuration>
  <n v="meu.net.xml"/>
  <r v="meu.rou.xml"/>
</configuration>

Vale lembrar que os arquivos de nós e edges não são necessários na especificação pois eles foram utilizados na geração do arquivo de rede (meu.net.xml).

Agora sim é possível executar a simulação e acompanhar todo o esforço na especificação dos arquivos realizados.

Executando uma simulação

Tendo finalizado o arquivo de configuração é possível abrir a interface do SUMO executando o arquivo sumo-gui.exe (icon_gui), que fica dentro da pasta “bin” de onde o SUMO foi descompactado, e indo na opção “file”, e em seguida “open”, localizando o arquivo de configuração recém gerado.

A interface do SUMO é bastante simples, sendo composta basicamente dos controles da simulação. De importante destacam-se os ícones que serão relacionados a seguir e o display do “Time” que mostra o avanço dos instantes da simulação.

Para executar a simulação é utilizando o botão play (icon_play) e é interessante também alterar o tempo de delay (icon_delay). A simulação acontece em ciclos não baseados em tempo, sendo a configuração de delay uma forma conseguir acompanhar a simulação. Se o delay for configurado para 1000, entre cada ciclo será dado 1 segundo, gerando uma simulação próxima do tempo real.

gui-sumo

Para uma primeira visualização, configure o delay para 1000 e clique em play, acompanhando o carro gerado e seu trajeto. Quando o último carro presente na pista finalizar sua rota e nenhum outro carro estiver especificado para iniciar, a simulação será dada por encerrada. Para reexecutá-la clique no botão de reload (icon_reload) e de novamente play.

Isso encerra o básico da utilização do SUMO. Para simulação é possível aumentar a complexidade da rede viária, inclusão de diferentes tipos de veículo e rotas, configuração dos tempos semafóricos, entre outras opções avançadas que serão exploradas posteriormente.

Artigos complementares

Veja mais informações sobre criação de simulação  utilizando o SUMO acessando os materiais adicionais disponíveis no blog, que seguem:

Share

15 opiniões sobre “Introdução ao SUMO

  1. Diogo Dias

    Boa tarde professor Benjamin, sou estudante de mestrado, e estou usando o C4R para gerar os traces de mobilidade, o C4R é uma interface mais amigável para o SUMO para gerar estes arquivos.

    Estou com dificuldades para encontrar dentro dos arquivos as interseções da rede de estradas, você poderia me informar aonde encontro esta informação nos arquivos .xml gerados pelo SUMO?

    Abraço!

    Atenciosamente.

     
    Reply
    1. Nivali

      Se você importou o mapa utilizando o OpenStreetMap é realmente difícil se localizar depois no arquivo. Minha dica é abrir o mapa no SUMO e clicar com o botão direito do mouse nas interseções que você tem interesse. Isso mostrará o identificador do elemento. Tendo isso é só buscá-lo no xml.

       
      Reply
      1. Diogo Dias

        Boa noite professor,

        Importei o mapa do OSM sim, me parece que o C4R ignora muitas informações, diferente de usar o SUMO direto, do qual eu mesmo entro com os comandos que desejar.

        Tentei fazer o sugerido, mas a informação que o SUMO mostra aop clicar com o botão direito, é apenas uma referência do tipo “junction: #um_numero”, até procurei pelo número no arquivo xml de saída mas não encontrei.

        Uma outra informação que me parece bem útil é que quando uma interseção tem um semáforo, ele mostra as fases deste.

        Estou elaborando uma proposta para detecção de congestionamento e alteração de rotas redes veiculares, se tiver alguma dica, fico bastante agradecido.

        Abraço.

         
        Reply
        1. Benjamin Grando Moreira

          Realmente se você procurar pelo número direto fica difícil de encontrar. Facilita se ao invés de procurar somente o número, por exemplo, o número 405, você procurar por: id=”405″

          Ou ainda melhor, se você procura por uma junção, procure por:

           
          Reply
  2. Aly

    Error: The edge ‘1to2’ within the route ‘rota0’ is not known.
    The route can not be build.
    Quitting (on error).

    O meu não funcionou…

     
    Reply
    1. Aly

      Já descobri o problema…Parabéns pelo material!

       
      Reply
  3. EDIVAN LIRA

    ONDE ENCONTRAR O ARQUIVO : “netconvert.exe”? ( versão 0.31.0 do SUMO que foi baixada).
    windows 8.1 de 64bits.

     
    Reply
    1. Benjamin Grando Moreira

      Na pasta onde o SUMO foi descompactado você encontra uma pasta chamada “bin”. Dentro dessa pasta você encontra o netconvert

       
      Reply
      1. EDIVAN LIRA

        Já procurei na pasta “Bin” que foi descompactada e o arquivo nao estava, tentei ver se estava oculto e não esta, tem uma outra forma de encontrar esse arquivo?

         
        Reply
        1. EDIVAN LIRA

          BOM DIA PROFESSOR!
          O SENHOR PODERIA ME AJUDAR, JÁ DESCOMPACTEI TODAS AS PASTAS E NÃO FOI POSSÍVEL VISUALIZAR O ARQUIVO “NETCONVERT” EM NENHUMA PASTA OU SUBPASTA, O SOFTWARE FOI INSTALADO CORRETAMENTE, PORÉM ESTOU COM ESSE PROBLEMA.
          AGRADEÇO SUA ATENÇÃO DESDE JA´.

           
          Reply
          1. EDIVAN LIRA

            JÁ CONSEGUI RESOLVER O PROBLEMA.
            OBRIGADO!

             
  4. Pingback: Gerar diversas rotas, tipos de veículo e veículos no SUMO – Professor Benjamin

  5. Pingback: Simulando o transporte público no SUMO – Professor Benjamin

  6. Pingback: Programação de semáforo no SUMO – Professor Benjamin

Deixe um comentário para Benjamin Grando Moreira Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.