Inicio     |     Sobre     |     GitHub     |     Games     |     Contato                        

segunda-feira, 28 de dezembro de 2020

Projeto Simulador de Navegação Autônoma com Algoritmos Evolutivos


    Hoje gostaria de compartilhar esse projeto antigo que achei perdido, feito durante minha graduação. O inicio de um longo caminho no qual ainda caminho. O projeto tem como objetivo a criação de um simulador de navegação autônoma de robôs que utiliza algoritmos evolutivos.

Downloads

Download Projeto: 2Shared     4Shared    MediaFire

(Contém o projeto no formato do Unity, os códigos, a documentação e os diagramas)

Download Software: 2Shared     4Shared    MediaFire

(Contém uma versão executável do software funcional)

Download dos Códigos: 2Shared     4Shared    MediaFire

(Contém os códigos usados no projeto .cs)

Objetivos do software

    O objetivo desse trabalho é o desenvolvimento de um ambiente de simulação para testes de algoritmos evolutivos aplicados a navegação autônoma de robôs.

    O foco do trabalho é testar a funcionalidade do algoritmo evolutivo, como um meio de aprendizado para que as populações de robôs sejam capazes de se adaptar e aprender a navegar por um ambiente, e cumprir suas tarefas da melhor forma possível sem uma intervenção humana direta, e sem a necessidade de possuir ou testar diretamente em um robô físico, sendo assim é esperado que esse trabalho contribua com pesquisas realizadas na área de simulação de navegação autônoma e de algoritmos evolutivos. Com isso será construído um simulador computacional com gráficos 3D para uma melhor visualização do funcionamento, e um modo sem gráficos para que o algoritmo possa ser testado de forma mais rápida e eficiente.

Como foi desenvolvido

    Para o desenvolvimento da simulação proposta foi utilizado o motor gráfico Unity 3D. O Unity é um motor desenvolvido para o desenvolvimento de jogos, sua principal finalidade é facilitar e agilizar o desenvolvimento, o mesmo possui toda física que uma simulação 3D precisa já implementada, trabalha com objetos de uma forma direta e possibilita programar nas linguagens C#, Javascript e Lua. O código do software foi escrito na linguagem de programação C# que é aceita pelo Unity.

    Para o aprendizado e adaptação dos robôs no ambiente está sendo utilizado um Algoritmo Evolutivo (AE), os AE são baseados na teoria da evolução de Charles Darwin, onde em uma geração são simulados ou “treinados” uma quantidade de robôs, aqueles que marcarem a maior quantidade de pontos executando de melhor forma seus objetivos, serão considerados os indivíduos “pai”, ou seja quando a simulação de sua geração terminar, seu cromossomo será cruzado com o de todos os outros indivíduos de sua especie ou tipo naquela geração, o que irá gerar novos cromossomos de novos indivíduos, que poderão sofrer mutações ou não e assim gerar os robôs da nova geração, que novamente serão simulados e assim segue até atingirem um resultado especifico ou por quanto tempo for determinado.

   Primeiramente foi implementado o mapa, onde toda vez que uma simulação é iniciada, um novo mapa em modo de código é gerado. A geração do mapa é de modo completamente aleatório, onde em uma matriz são armazenados os dados dos objetos presentes no mapa em cada posição, por exemplo, as posições com o valor 0, estão vazias, as posições com valor 10 possuem uma parede, os valores 50 e 100 representam dois tipos de pedras distintas e os valores 1000 e 50000 representam os robôs coletores e os robôs perseguidores respectivamente.

    Esse método foi adotado para facilitar a distinção de quais objetos estão em um mesmo espaço caso isso ocorra, já que os robôs são capazes de se movimentar pelo ambiente. As principais regras de navegação dos robôs pelo mapa são:

  • Ambos os robôs não podem atravessar paredes ou ficar no mesmo espaço que a parede.

  • Se um robô coletor estiver na mesma posição que uma pedra do tipo 2, a pedra é coletada e o robô recebe um ponto de fitness.

  • Se um robô coletor e um robô perseguidor estiverem na mesma posição, o robô coletor perde um ponto, e o robô perseguidor ganha um ponto de fitness.

    Os primeiros robôs, ou seja os presentes na primeira geração da simulação, são criados completamente aleatoriamente, primeiramente é definido seu tipo, coletor (1000) ou perseguidor (50000), são criados a mesma quantia de ambos os robôs, em seguida são gerados os dados presentes no cromossomo de cada robô. Os cromossomos são representados por um vetor de 10 posições, cada posição equivale a uma situação, ou a um ambiente em que o robô se encontra.

    Cada posição do cromossomo pode receber valores de 0 a 4, onde cada valor representa uma ação a ser tomada pelo robô. O cromossomo é chamado dependendo da visão do robô, o valor da visão é o que definirá qual posição do cromossomo será lido, o e valor do cromossomo é o que definirá qual ação será realizada pelo robô, e logo após a ação ser concluída, o código verifica o valor total da posição e causa uma reação.

     Após a simulação ser iniciada os robôs iniciais ficarão percorrendo o ambiente com seus valores aleatórios por um determinado tempo, esse tempo é definido pelo numero de ações executadas pelos robôs, sendo o padrão 100 ações, com o termino desse tempo, a simulação é parada e são realizadas as etapas de contagem de fitness (seleção do pai), crossover (cruzamento), mutação e os novos cromossomos gerados são inseridos robôs que serão novamente simulados e testados no ambiente na próxima geração, e assim segue sucessivamente.

    O fitness de cada robô é implementado e decrementado durante a simulação, conforme suas ações, ao final os fitness de todos os robôs serão comparados e o melhor de cada tipo de robô se tornará o “pai”, ou seja parte de seu cromossomo irá para todos os robôs do seu tipo, junto com parte de seus cromossomos anteriores, essa distribuição se dá com 50% de chance do novo cromossomo herdar o pai ou o o próprio valor, valendo para todas as posições do cromossomo. Após o crossover acontece a mutação, onde seguindo a ideia anterior, existe 3% de chance de ocorrer uma mutação aleatória em uma posição do cromossomo.

    O sistema salva os dados referentes aos fitness de cada geração em arquivo .txt para comparação, estudo e uma melhor observação da evolução e adaptação dos robôs ao ambiente e a suas tarefas.

    Outra função muito importante do software é o modo visual da simulação, ou seja, a possibilidade de ativar o modo gráfico, com imagens 3D, onde é possível observar como os robôs estão agindo dentro do mapa utilizando os cromossomos da geração atual.

    Para ativar o mogo gráfico da simulação basta pressionar o botão “Lig/Des Gráficos” na tela o sistema, assim que o comando é dado, a simulação com enfase em treinar e evoluir os robôs é pausada, o mapa 3D é gerado e os modelos dos robôs também são gerados em cada posição, e seus cromossomos são inseridos em seus objetos 3D, e assim eles passam a funcionar de um modo que é possível observar suas ações no mapa, e quando os gráficos são desligados, a simulação anterior volta a funcionar de onde parou.

Como usar

     O simulador de algoritmos evolutivos aplicados a robótica móvel foi criado como um projeto final, da matéria de Projeto de Sistemas do curso superior em análise e desenvolvimento de sistemas do IFSP.
Esse é um software de simulação, criado para auxiliar e nos testes de aplicações de AE em robôs, ao final o projeto deve possuir uma versão executa do programa, um artigo sobre o desenvolvimento do sistema e seus resultados, e uma página criada para divulgação do sistema, como uma forma de auxiliar outros pesquisadores da área ou interessados.

     Crie uma pasta com o nome “resultados” no diretório “C:”, seus dados serão salvos neste diretório (C:/resultados/).

    O arquivo “doc1.txt” salva apenas o fitness pai de todas as gerações dos robôs coletores.
O arquivo “doc2.txt” salva apenas o fitness pai de todas as gerações dos robôs perseguidores.

    O arquivo “docf1.txt” salva os dados idRobô, fitness, e cromossomo de todos os coletores.
O arquivo “docf2.txt” salva os dados idRobô, fitness, e cromossomo de todos os perseguidores.

O simulador foi criado na versão 5.0 do Unity na linguagem C#.
A versão 1.0 do simulador foi compilada na data 24-04-2016.

Configuração Criada/Recomendada
SO: Windows 10
Processador: Core i3
Placa de Video: HD Graphics 3000
HD:1 GB (espaço livre)
RAM: 8GB

Imagens

Resultados

     O software possui quatro diferentes telas, a primeira tela a ser executada ao abrir a aplicação é o menu inicial. O menu possui quatro botões, o primeiro é “Iniciar simulação”, que ao ser clicado leva o usuário a tela de simulação, o segundo é o botão “Como Usar” que leva o usuário a uma tela com explicações simples do funcionamento do software, o terceiro é “Sobre”, que explica o software ser um projeto de faculdade e outras coisas, e o ultimo botão é o “Sair”, que ao ser clicado fecha a aplicação.

    Para a realização dos testes de comprovação do funcionamento do software e do algoritmo evolutivo, foram criados 2 versões diferentes para o programa, na primeira a evolução acontece mais rápido (a cada 100 interações) enquanto na segunda a evolução é um pouco mais lenta (a cada 1000 interações), cada simulação foi testada mais de uma vez e deixadas funcionando por um tempo. Após isso os dados de cada simulação foram recolhidos e alguns gráficos foram gerados com os valores dos fitness dos robôs, para facilitar a visualização da evolução.

    Com a análise dos gráficos foi possível perceber uma certa dificuldade de evolução dos robôs coletores, diferente dos perseguidores, que evoluíram muito bem, e tiveram um aumento muito grande em seu fitness em um dado momento em que o coletor tem uma queda. A dificuldade de evolução dos coletores e facilidade dos perseguidores se deu devido ao fato dos robôs perseguidores apenas ganharem pontos de fitness, o fato de não possuírem um “predador”, ou algo que fizesse com que perdessem os pontos ganhados, fez com que evoluíssem com facilidade, enquanto os coletores, que ganhavam ponto coletando as pedras, perdiam ponto quando eram pegos por robôs perseguidores, que ao aprenderem a perseguir aquele robô, faziam com que o mesmo perdesse pontos continuamente.

    Mesmo com essa disputa de pontos onde os perseguidores tiveram certa vantagem evolutiva, é possível observar a evolução de ambos os robôs, comprovando assim o funcionamento do software e do algoritmo, conforme foi proposto.


Nenhum comentário:

Postar um comentário