top of page

Um jogo que aprende a se jogar

COMPONENTES E MATERIAIS

Arduino Nano R3                    1 1

Servos MG-90s 2

MR105ZZ rolamento de esferas 2

​

FERRAMENTAS E MÁQUINAS NECESSÁRIAS

impressora 3d

Chave de fenda

​

SOBRE ESTE PROJETO

Por um tempo, tenho andado de um lado para o outro entre hobbies diferentes, mas de alguma forma relacionados, aprendizado de máquina, mecatrônica e desenvolvimento de jogos.

Tive a ideia de criar um jogo que aprende a se jogar usando um bom e antigo console de jogos. Eu pensei que seria um projeto divertido que combinaria três coisas que eu gosto.

E antes de começar, eu sei o quão inútil e inútil esse projeto é, e que também poderia ser resolvido de uma maneira muito mais eficiente usando sistemas de controle 'clássicos', como controladores PID, LQR ... Mas eu me estabeleci em uma rede neural como eu estava realmente interessado em ver como uma rede neural lidaria com todos os inconvenientes do hardware (peça nas peças, atraso no movimento, calibração imperfeita ...)

​

 

1.jpg

Há algo que me fascina nas IAs que podem interagir com o mundo real. E mesmo que seja apenas matemática, sempre parece mágica quando você vê o modelo aprender sozinho diante de seus olhos.

O PLANO INICIAL.

Queria que este projeto fosse bastante direto, sem grandes incógnitas, e decidi reutilizar as habilidades que já desenvolvi em outros projetos. Eu pensei que iria fazê-lo em 2 dias ... lol

Para a parte de aprendizado de jogos e de máquinas, decidi usar o Unity, mecanismo de jogo, juntamente com o kit de ferramentas ML-agents também desenvolvido pela Unity. Eu já estava familiarizado com este kit de ferramentas e, por isso, tinha uma idéia meio decente do que estava entrando, mesmo que evoluiu bastante desde a última vez que o usei.

2.jpg

The choice of the game was made early on, it needed to be a game requiring very few inputs so I could keep the mechanical parts very quick to design.

The ML-agent tool kit comes with a few pre-built examples, one of them being a ball balancing exercise, that could easily be turned into a game requiring only a single joystick.

3.jpg

Exercício de balanceamento de bola / Imagem do repositório Unity ML-agentGitHub

O ROBÔ.

​

Comecei a desenhar um braço simples que acionaria o joystick. Eu tinha alguns servos MG-90s e um Arduino Nano coletando poeira em uma prateleira, então rapidamente projetei algumas peças em torno desses componentes.

​

A única coisa que eu realmente tomei cuidado foi tentar manter o ponto de articulação do joystick alinhado com o eixo de rotação dos servos, pois isso tornaria a programação mais simples em um estágio posterior ... chame-me de preguiçoso, se quiser! ;)

4.jpg
5.jpg

O próximo passo foi escrever um programa simples para o Arduino que permitisse controlar o joystick.

​

Uma cena de unidade simples foi criada para ajudar a calibrar aproximadamente os movimentos do joystick.

5.jpg

Estava na hora de garantir que a IA pudesse assumir o controle do joystick. A cena simples do Unity foi atualizada para permitir que o joystick certo seja controlado usando o joystick esquerdo. O joystick esquerdo foi usado apenas para simular a saída da rede neural, isso me permitiu garantir que a comunicação entre o computador no Arduino estivesse funcionando bem.

6.jpg

O JOGO.

​

Neste ponto, estava na hora de criar o jogo. Como mencionado anteriormente, recriei um dos exemplos incluídos no kit de ferramentas e acrescentei algumas dificuldades extras. Uma era adicionar um alvo que a bola precisa estar o mais próximo possível enquanto estava equilibrada na plataforma; a segunda era atirar a bola em velocidade aleatória e em direção aleatória no início de cada jogo.

 

Também criei algumas texturas para uma beleza extra (muito ...).

7.jpg

TREINAMENTO.

​

Estava na hora de iniciar o processo de treinamento.

​

Aqui está uma explicação extremamente simplificada das etapas que ocorrem durante o treinamento.

​

1 - o AI, vamos chamá-lo de agente, olha o estado do jogo (observação), aqui ele coleta as informações diretamente no jogo. Ele procura a velocidade e a localização da bola e também o ângulo da plataforma.

​

2 - após suas observações, a ação será executada (mova o joystick).

​

3 - dependendo do resultado dessa ação, ela receberá uma punição se a bola cair (pontuação negativa) ou uma recompensa (pontuação positiva) se a bola permanecer na plataforma, quanto mais perto a bola estiver do alvo, maior será recompensa é.

8.jpg

O ciclo se repete até que a IA aprenda a tomar as decisões necessárias para obter uma pontuação máxima.

 

Nesse momento, pensei que teria que iniciar o treinamento e ir embora por algumas horas e depois voltar para um robô totalmente funcional.

9.jpg

Bem, não foi o caso ... Na primeira sessão de treinamento, a IA aprendeu a jogar o jogo, mas foi extremamente instável.

 

Decidi, então, treinar novamente o modelo e introduzir uma recompensa extra por ser suave. Funcionou um pouco melhor, mas longe de ser ótimo. Eu tinha certeza de que poderia tirar mais proveito disso.

 

Um dos grandes problemas de incluir qualquer hardware durante o treinamento é que você está limitado a treinar apenas um agente por vez em velocidade real.

 

Por isso, optei por uma nova estratégia. Tomei a decisão de dividir o treinamento pela metade. A primeira metade aconteceria sem hardware. Isso significa que eu posso treinar várias IA de uma só vez e acelerar o tempo em 20 dobras. Em seguida, introduza o hardware na segunda parte do treinamento para garantir que a IA se adapte ao hardware. Isso ajudaria a economizar horas.

10.jpg

O treinamento com vários agentes totalmente digitais correu muito bem e me permitiu testar diferentes sistemas de recompensa / punição, bem como diferentes parâmetros de rede neural (número de camadas, número de neurônios ...) Infelizmente, quando reintroduzi o hardware na segunda parte do treinamento, eu esperava que a IA lidasse com controle razoavelmente decente ... Não era o caso. Não tenho muita certeza se foi devido a um erro no meu código ou se o joystick 'virtual' não estava simulando o real de verdade o suficiente, mas estava claro que seria necessário muito treinamento para chegar a um nível que eu faria. seja feliz com.

Agora eu sabia que tinha bons parâmetros de rede e um sistema decente de recompensa / punição. Decidi morder a bala uma última vez e treinar novamente do zero. Após mais 10 horas de treinamento, fiquei bastante satisfeito com o resultado, ainda é um pouco mais instável do que o modelo totalmente digitalmente treinado, mas acho que isso deve-se à compensação da rede pela imperfeição do hardware.

CONCLUSÃO.

Acho que não fiz nenhuma descoberta inovadora trabalhando neste projeto, mas certamente foi um bom lembrete de que a IA não é a solução para todos os problemas e certamente não é uma ferramenta mágica que pode fazer tudo sozinha. Também achei muito interessante que é realmente muito fácil introduzir viés humano em seu comportamento. Talvez ser suave não seja a melhor técnica? mas ainda assim decidiu recompensá-lo e forçou-o a desenvolver esse comportamento.

E a última coisa a ser retirada deste projeto é que a quantidade de treinamento necessária não deve ser ignorada, pois acabou sendo a parte mais demorada dessa aventura.

Ainda me diverti muito com este projeto curto e tenho certeza de que tentarei fazer algo assim novamente no futuro.

O que outras pessoas estão dizendo

O que outras pessoas estão dizendo

bottom of page