Infraestrutura

Tecnologias Utilizadas

Python

A linguagem Python é a tecnologia base para o desenvolvimento do projeto. A escolha foi fundamentada não apenas pela sua capacidade de integração com diversas bibliotecas, mas também pela integração com o simulador adotado para o desenvolvimento do projeto.

No contexto do simulador, o Python é utilizado como uma linguagem de \textit{script} que facilita a criação e modificação de cenários, configurações e interações no simulador, permitindo implementar e modificar técnicas de inteligência artificial de controle de veículos de maneira eficiente. A versão utilizada no projeto é a 3.8.10, por conta da integração com as diversas bibbliotecas dependentes.

Carla Simulator

O Carla Simulator é uma plataforma de simulação de código aberto projetada para pesquisa e desenvolvimento em veículos autônomos. Foi desenvolvido no Centro de Visão Computacional da Universitat Autonoma de Barcelona (UAB), permitindo a construção de cenários realistas de tráfego de veículos, bem como implementação de algoritmos de controle para VAs.

O Carla é constituído de uma arquitetura baseada em cliente-servidor. O servidor, considerado como o "mundo" da simulação, é responsável por todos os elementos que estão relacionados com a própria simulação em si, tais como computação dos modelos físicos, renderização dos sensores, atualização dos estados, entre outros. O lado do cliente consiste em um conjunto de módulos de clientes responsáveis pelo controle lógico dos atores no cenário e pela definição das condições do mundo. Essa operação é realizada por meio da utilização da API CARLA, disponível em Python ou C++. 

O simulador utiliza o motor gráfico Unreal Engine 4 para executar a simulação e usa o padrão OpenDrive 1.4 para definir a estrutura das vias e ambientes urbanos. Por conta da arquitetura, é possível criar vários clientes concomitantes, no mesmo nó, ou em nós diferentes. A comunicação é feita por meio do protocolo TCP. A Figura abaixo exemplifica a arquitetura do projeto. O Carla também permite a utilização de diversos tipos de sensores listados na Tabela abaixo.

Arquitetura do Carla

Sensores disponíveis no Carla

Abaixo são mostradas algumas Figuras retiradas do Carla Simulator

Scenic

O Scenic é uma linguagem de programação probabilística de domínio específico desenvolvida para modelar ambientes de sistemas ciberfísicos, como robôs e VAs. A lista de simuladores suportados é o Carla Simulator, GTA V (jogo de mundo aberto da RockStar Games), LGSVL (simulador de tráfego da LG - descontinuado), Webots (simulador de robótica) e X-Plane (simulador de voo). Conforme a documentação oficial \cite{scenic-doc}, um programa scenic define uma distribuição entre cenas, configurações de objetos físicos e agentes. A amostragem dessa distribuição produz cenas concretas que podem ser simuladas para produzir dados de treinamento ou teste. O Scenic também pode definir políticas para agentes dinâmicos, permitindo modelar cenários em que os agentes realizam ações ao longo do tempo em resposta ao estado da simulação. Nesse sentido, a vantagem do Scenic é a possibilidade de descrição de cenários simulados com uma gramática quase textual, acelerando o desenvolvimento de simulações.

A Implementação

Estrutura Do Projeto

O Carla funciona com uma arquitetura cliente-servidor. Assim, o funcionamento para qualquer experimento requer que pelo menos duas chamadas de função sejam executadas, nessa sequência, sendo primeiro a chamada do próprio simulador e, em seguida, algum script Python de controle do veículo. Vale notar que o simulador deve estar sempre ativo, portanto, a ordem das execuções é relevante, sendo a chamada da simulação prioritária. A chamada padrão do simulador é feita pela linha de comando.

Por conta da estrutura do Carla, todos os elementos que tem alguma interface com o Carla foram construídos em scripts Python. A orquestração de todos os passos foi realizada em bash script, devido a simplicidade de funcionamento. A sequência de passos genéricos da implementação é mostrada no diagrama da Figura ao lado.


O Scenic é uma linguagem de programação probabilística, criado para especificar distribuições que caracterizam entradas diversas e complexas, para sistemas baseados em aprendizado de máquina. A sua principal aplicação se dá no contexto de simulação robótica. A linguagem se destaca por permitir que cenários sejam definidos com diversas entidades físicas e agentes autônomos de maneira clara e concisa. No contexto de tráfego de veículos, a depender do nível de configuração do simulador, podem ser definidos objetos e o comportamento dos veículos dentro de um experimento de simulação. Ademais, o principal atributo desse projeto é a legibilidade da sintaxe durante a descrição de relacionamentos espaciais e temporais dentro de cada cenário, incluindo a definição de restrições que podem ser rígidas ou flexíveis. Para o contexto do presente trabalho, a utilização do Scenic se deu pela facilidade de geração eficiente de cenários de simulação. A partir da descrição formal de um cenário, a biblioteca do Scenic gera, se viável, a simulação correspondente dentro do Carla.

Com essa biblioteca, torna-se viável criar uma descrição formal de um cenário de testes, dispensando a necessidade de uma explicação geométrica dos problemas. O foco está exclusivamente na definição das restrições de alto nível do experimento em questão.

Estudo de Caso

Cenários de Risco

Com base no relatório de estatísticas de cenários de pré-colisão de veículos leves dos dados de acidentes dos Estados Unidos entre 2011 a 2015, do National Highway Traffic Safety Administration (NHTSA) foram escolhidos os principais cenários com alto grau de incidência de acidentes. Vale notar que o NHTSA é um dos órgãos que ajuda a criar regulações de segurança de VAs nos Estados Unidos. Foram escolhidos seis cenários de cruzamento que envolvem apenas dois veículos em movimento. Na Tabela ao lado são listados os cenários do estudo.


O esboço dos cenários é mostrado na Figura abaixo.

Algoritmo Genético

A utilização de Algoritmo Genéticos (AGs) permite realizar uma forma de otimização inspirado no processo de seleção natural, tal como ocorre na evolução biológica. No contexto desse trabalho, o objetivo da implementação de um AG é para conseguir otimizar a buscas de parâmetros que são utilizados em scripts Scenic em descrições de cenários mais arriscados, envolvendo a situação de acidentes ou quase-acidentes. Os tópicos a seguir detalharão a forma como essa técnica foi implementada no projeto.


Estrutura Geral do Projeto

A Figura ao lado mostra o Fluxo de operação para a produção de cenários críticos (mais arriscados). O estudo de caso foca na comparação de técnicas de seleção de parâmetros. São utilizadas duas abrodagens - aleatória e evolutiva. A geração aleatória consiste na geração, via sorteio, de parâmetros de descrição de arquivos Scenic. Já a abordagem evolutiva utiliza o AG para a geração de parâmetros. Na Figura, cada linha representa os parâmetros de configuração de uma simulação - Geração posterior (N+1) tem origem da Geração anterior (N).



Medida de Risco

Das informações coletadas dos veículos foi gerada uma lista de hipóteses das métricas que poderiam ser utilizadas para compor a função objetivo, listados na Tabela ao lado.  Com base em testes que destacassem a relevância de cada métrica, a partir da avaliação do grau de risco gerado por um procedimento aleatório, optou-se por utilizar apenas aquelas que contribuíssem para discernir o risco associado a cada cenário simulado. Foram consideradas as mesmas métricas para todos os seis tipos de cenários de cruzamentos utilizados estudo..

Das métricas utilizadas, foram geradas gradações que estão associadas ao nível de risco do cenário como mostrado na Tabela ao lado. O grau ou nível de risco de uma simulação é o somatório do Score de risco de cada variável (Colisão [C], Distância Mínima entre os veículos [DM], Distância dos veículos no instante de Velocidade Máxima de aproximação [D\_VM] e Tempo Para Colisão no instante de Velocidade Máxima de Aproximação [TCC\_VM]. Nesse sentido, um nível de risco 12 pode indicar superficialmente algumas possibilidades:

Já para um caso de nível de risco 14, necessariamente houve alguma colisão, porque a não ocorrência de colisão alcança apenas um \textit{score} de 12. Nesse caso, além da colisão, há também alguma combinação das demais variáveis totalizando 4.

Em função da característica do Scenic, ocasionalmente, a busca por uma simulação válida a partir de um conjunto de parâmetros pode tornar-se inviável, resultando em um caso de teste não executável. Nessas situações, atribui-se ao indivíduo o valor -1 como Score de risco. É relevante observar que as fases de geração de cenários por meio de AG descarta a utilização de cenários não executados nas etapas de seleção, cruzamento e mutação, a fim otimizar o processa de busca de indivíduos válidos.

Para saber mais sobre os resultados, clique no link acima