segunda-feira, 4 de fevereiro de 2019

Usando Voronoi para a trajetória do "sucesso" do seu robô.

Se locomover com o seu robô sobre uma pista com uma série de obstáculos exige uma organização de pensamento para otimizar o trajeto e não haver colisões. Provavelmente você já conseguiu isso mas se lhe perguntassem sobre um método mágico matemático para fazer isso em qualquer situação, você saberia dizer algum? No vídeo (https://www.youtube.com/watch?v=Y5X1TvN9TpM) é apresentado o conceito de Voronoi, onde podemos representar os pontos como os obstáculos da mesa e as mediatrizes como o “meio” do corredor onde seu robô vai passar e correr o menor risco de bater em algo.
Que tal utilizarmos a técnica do conceito de Voronoi em um tapete do FLL? Veja como ficou o tapete abaixo da temporada Animal Allies com a aplicação de alguns pontos de Voronoi (em vermelho):


Agora com o uso do software Inkscape, usaremos a opção Voronoi para construir a malha sobre o tapete, ficando assim:


Após retirar o tapete, ficamos com o seguinte aspecto:


Pensando que o nosso robô precisa atravessar o tapete da esquerda para a direita temos três possibilidades de caminhos que foram destacadas com as linhas azuis:


Note que o “melhor” caminho, pode não significar em sua totalidade o melhor caminho para seu robô, devido a presença de muitos movimentos abruptos, o que é péssimo, pois a cada frenagem e arrancada temos a possibilidade de perder o exato ponto onde o robô estava (atrito). A partir desse mapa criado com o uso do Voronoi você deve ir suavizando os movimentos para que seu robô possa ficar o maior tempo em movimento. No fim o Voronoi funciona como uma estratégia para você pensar em caminhos ideais e até mesmo no tamanho que o seu robô deve ter. Até a próxima!

Encontrando o valor X de giro do robô.

Programar um robô para girar um determinado ângulo sem você conhecer nada sobre o robô, pode ser um desafio. Muitas vezes somos levados a testar valores até achar um padrão que nos satisfaça, mas é possível encontrar um valor coerente para tal desafio. Por isso hoje iremos desenvolver um valor inicial padrão baseado em uma rotação de 360 graus do robô para você fazer seus testes com ele, pois mesmo usando cálculos matemáticos, ainda existem forças como o atrito que modificam o valor padrão encontrado. Vamos começar com um robô educador que possua a roda básica do EV3 (5,6 x 2,8 cm) e que possua um eixo total de 15 cm, conforme descrito na imagem abaixo:


A primeira coisa que precisamos entender é o que o robô faz quando usa-se o bloco Pilotagem e o valor de Direção:100, onde temos um dos motores girando para um lado e o outro motor para o outro, conforme a imagem abaixo:


Com isso temos duas coisas a serem calculadas em separado: o valor do comprimento da circunferência descrita pelo movimento de 360º do robô e o valor de quantos graus corresponde 1 centímetro do comprimento da roda e que devem ser multiplicados ao final. 


Vamos começar por encontrar o valor em graus que correspondem a um centímetro do comprimento da roda. Use o valor obtido anteriormente (https://matematicanarobotica.blogspot.com/2019/02/em-busca-da-precisao-para-programar-seu.html) que nos diz que 360 graus equivale a distância percorrida de 17,6 cm e obtemos a partir da divisão de 360 por 17,6 o valor de 20,45 graus. Guarde esse valor pois usaremos ele ao final.
O próximo passo é calcular o comprimento da circunferência descrita pelo robô nesse giro de 360 graus. Já fizemos isso anteriormente no post indicado acima, e vamos refazer o mesmo processo, só que usando o valor de raio de 6,1 cm. Mas você deve estar se perguntando o porque desse valor, já a metade do diâmetro 15 cm é 7,5 cm. A resposta para isso advém de que não podemos considerar toda a largura da roda de 2,8 cm já que durante o processo de giro do robô, essa roda larga sofre um processo de arrasto (atrito) e convencionamos tomar o valor central de cada uma das rodas como o limite máximo da circunferência descrita pelo robô. Descontando 1,4 cm de cada lado obtemos o raio de 6,1 cm. Em seguida, calculando o comprimento da circunferência de raio 6,1 cm obtemos o valor de 38,33 cm.
Conforme falamos acima, multiplicando os valores de 20,45 (graus correspondentes a cada cm de roda) com 38,33 (comprimento da circunferência descrita pelo robô) obtemos o valor de 783,85 (use apenas 784) que será o primeiro valor a ser jogado como fator do seu MyBlocks de giro de robô. Agora é fazer uma bateria de testes, porque o resultado matemático não corresponde 100% a realidade que tem outros atributos envolvidos como o atrito (diferentes pesos de robô, roda e tipos de superfície vai nos gerar diferentes coeficientes de atrito). Nos nossos testes conseguimos um valor bem abaixo do esperado, de 705 para deixar claro. O método matemático serve para dar uma noção de um valor a iniciar a bateria de testes e economizar tempo para outras tarefas mais complexas. Até a próxima!

O uso da probabilidade no game estoura balão.

Que tal uma competição entre robôs? No vídeo El Matador (https://www.youtube.com/watch?v=am0sM9i3fVQ) temos a competição do estoura balão, aonde dois robôs são programados para estourar o balão adversário, vencendo quem fizer isso primeiro. Mas a pergunta que fica é: Qual é a melhor estratégia de vencer esse jogo? Qual a probabilidade do balão estourar e de não estourar? Você deve estar se perguntando, e essa tal de probabilidade? O que ela seria? Ela pode me ajudar com robôs ou com outras situações também? Probabilidade é definida como as chances de obter um resultado em um experimento aleatório (leia mais em: https://www.infoescola.com/matematica/probabilidade/). O exemplo mais simples é o da moeda, ela tem dois lados, por isso a probabilidade (chance) de cair um dos lados (cara ou coroa) é 50% ou ½. 
Agora que tal pensar nos mais diferentes cenários com relação ao seu robô. Qual a probabilidade de um robô pequeno ter mais sucesso que um grande (pense em diferentes contextos)? Qual a probabilidade de uma programação com uso de sensor de luz ser mais eficaz do que uma que utiliza blocos de movimento? Você deve estar pensando o por que de tantas perguntas? Simples, para delimitar melhor o contexto do nosso problema. 


Como podemos ver no desenho acima, se o balão está dentro do círculo dos robôs, ele tem a probabilidade de estourar. O único local que não permite que o balão estoure é fora da área do círculo, ou seja a região externa e isso decorre da programação que diz para o robô não ultrapassar essa linha (é a regra do jogo). Com isso em mente, é só ajustar a programação do robô para “deixar” o balão o maior tempo possível permitido fora da arena. Com base nesse panorama, você vai escolher se vale a pena fazer um robô grande ou pequeno, no que o sensor de luz tem de vantagem para um robô que segue uma programação de movimentos pré-definida, se movimentos extremamente rápidos ou lentos pode ajudar. Faça os experimentos e deixe nos comentários suas impressões e realizações. Até a próxima!

A arte de programar usando a estatística a seu favor.

No post de construção de poligonais (https://matematicanarobotica.blogspot.com/2019/02/movendo-o-seu-robo-e-produzindo.html) você aprendeu a locomover o seu robô e construir diversos formatos de poligonais. Agora faça um teste usando o lápis no robô educador: construa uma poligonal fechada qualquer (que tenha vários segmentos e ângulos) e peça para repetir sua construção partindo do mesmo ponto inicial pelo menos umas 5 vezes. O que você nota? Veja a foto abaixo onde o robô tem um lápis consigo (ele está preso em uma das pontas do robô) e que ao programar ande 10 cm e gire 60 graus, nos entrega a seguinte figura:


Ao analisar a poligonal desenhada pelo robô acima, notamos que apesar da repetição de movimentos ter sido programada com todos os cálculos corretos (advém da soma de ângulos externos de um hexágono regular) as linhas desenhadas se alternam e isso pode revelar duas situações cruciais:
  • Caso essa alternância nas poligonais seja contínua apenas para um lado, entende-se que o problema reside no Myblocks do ângulo e o valor 17,3 cm que foi utilizado (https://matematicanarobotica.blogspot.com/2019/02/em-busca-da-precisao-para-programar-seu.html). Esse valor é um valor calculado matematicamente de acordo com a situação proposta, mas que conforme uma série de fatores (atrito, por exemplo) pode precisar ser refinado para melhor atender a sua situação. Faça testes modificando ele.
  • Caso essa alternância nas poligonais esteja dentro de um limite com idas e vindas e principalmente se você nota um agrupamento de poligonais em uma região, devemos considerar aplicar o conceito estatístico de média e da moda, que nada mais é do que o entendimento da margem de erro e como selecionar o melhor conjunto de poligonais.

Vamos analisar em profundidade o segundo caso e com uma situação mais simples: um robô educador que sempre parte do mesmo ponto A e que tem de se deslocar 90 cm. Se repetirmos o experimento até no máximo 10 vezes vamos nos surpreender com os pontos finais que o robô para (anote-os sobre a mesa), conforme vemos em uma diagrama abaixo:

Esse conjunto de pontos podem estar dentro uma margem de erro e que pode ter seus limites máximos e mínimos vistos por uma construção abaixo:

Estatisticamente falando todos esses pontos estão dentro de uma margem de erro “aceitável”, só que claro, se você procura uma maior precisão para seu robô vai precisar encontrar uma média entre o ponto máximo (E) e o ponto mínimo (B), como podemos ver a seguir:


Se você observar bem, escolher a média entre esses pontos não torna a melhor escolha (nesse caso), pois justamente do lado do ponto B temos uma grande concentração de pontos em contraste ao lado do ponto E. É aí que entra em cena o conceito de moda, que leva em consideração o maior agrupamento de pontos e a partir deles podemos traçar uma média mais confiável, como podemos ver abaixo:

Porque é importante entender o contexto acima? Simplesmente pelo fato de não ficar fazendo testes e ao final de cada um mudar a programação de qualquer maneira sem uma metodologia. Muitas vezes como acontece no segundo caso, não é questão de mudar a programação e sim de entender que o robô pode não ser 100% exato e que temos de trabalhar dentro dessa margem de erro para alcançar os resultados esperados. Por isso, sempre teste sua programação por pelo menos 10 vezes, aplique o conceito estatístico e com base nos resultados, faça as modificações necessárias. Até a próxima!

Em busca da precisão para programar seu robô.

Você saberia me dizer como programar o robô para ele andar exatamente 50 cm? Parece uma pergunta boba, mas que no fundo se você não utilizar a ferramenta certa pode acarretar em erros de imprecisão. O que vamos propor aqui não é uma bateria de testes até achar o valor correto e sim, o uso do comprimento de circunferência aliado a regra de três para lhe dar o valor exato em qualquer situação.
Como bem sabemos, uma possibilidade de programar no EV3 é dar o valor em graus e o robô irá executar o valor em centímetros (estamos escolhendo esse padrão). Logo de cara, temos de ficar atentos que o tipo de roda utilizado irá interferir diretamente no valor percorrido pelo robô. No nosso exemplo proposto, iremos utilizar a roda ZR com a medida de diâmetro de 5,6 centímetros (diâmetro é a maior corda da circunferência ou a maior distância dos pontos equidistantes da mesma):
         

O raio consiste na metade do valor do diâmetro e será ele que iremos usar na fórmula do cálculo do comprimento da circunferência, que é dada por 2πr, onde o valor de π(pi) pode ser usado o 3,1415 (se quiser saber mais sobre o pi, acesse: https://mundoeducacao.bol.uol.com.br/matematica/valor-pi.htm). Com isso conseguimos o valor de 17,6 cm (já está arredondado) e que agora iremos usar a regra de três: 

Logo você vai inserir o valor do ângulo de giro de 1022,7 graus que irá percorrer exatamente 50 cm. Fácil, não é mesmo. O mesmo se aplica, para diversos outros valores de comprimento, lembrando que podem aparecer valores de erro por conta de frenagens e diferentes valores de velocidade, que iremos estudar em outra ocasião. Até a próxima!

Movendo o seu robô e produzindo poligonais.

Os primeiros passos na programação de um robô consistem em fazer ele andar em linha reta e girar um determinado valor em graus (para entender melhor como usar o MyBlocks de giro sugiro acessar o post https://matematicanarobotica.blogspot.com/2019/02/em-busca-da-precisao-para-programar-seu.html). Esses são conceitos matemáticos fundamentais que formam as linhas poligonais. Essas linhas poligonais são definidas por segmentos de reta e ângulos (giros) e podem ser abertas ou fechadas (quando o início coincide com o fim):


Com o tempo você se sente confiante para desenhar (coloque um lápis no robô educador e veja o rastro que ele produz, lembrando que se o lápis não estiver no centro de giro ele irá produzir algo um pouco diferente do esperado) polígonos regulares como os abaixo:


Note que uma das coisas fundamentais na construção de um polígono regular é que o ângulo de giro corresponde ao ângulo externo e não ao interno dos polígonos regulares, portanto se você quer construir um hexágono regular, na sua programação deve ter o loop de repetição com valor 6, e ter um valor a sua escolha de andar (segmento de reta que formará os lados) e de giro com o valor 60 graus (ângulo de 60º). Note que para formar quaisquer polígono regular, basta apenas dividir 360 graus pela quantidade de lados, que é a fórmula do ângulo externo dos polígonos regulares.


Que outros formatos geométricos podem ser construídos? Que tal testar uma sequência de repetições? Coloque seu robô para ser um artista e até a próxima!

A Congruência de triângulos em uma ponte de treliça.

Já parou para pensar do porque as treliças são construídas com unidades triangulares e não num formato de paralelogramo (quadrados, losangos, retângulos, paralelogramos)?
Que tal fazermos um teste? Pegue três barras quaisquer Lego com três conectores e forme diferentes tipos de triângulos. Você consegue deformar esse triângulo?


Agora pegue quatro barras quaisquer de Lego com quatro conectores e forme os mais diferentes tipos de paralelogramos. Você consegue deformar esses paralelogramos?


Porque isso acontece? Você saberia dizer porque um paralelogramo deforma e um triângulo não? A explicação é muito simples, vamos lá? Podemos afirmar que dois triângulos são congruentes (mesmo lado e mesmo ângulo) quando temos 3 lados iguais, ou seja, isso garante que todo triângulo com 3 lados definidos terá sempre os mesmos 3 ângulos internos e, portanto não temos essa deformação que é encontrada nos paralelogramos:

Agora quando pegamos a família dos paralelogramos, exemplificando com o quadrado e o losango, ambos podem ter os mesmos quatro lados (medidas), mas isso não vai garantir que possuam os mesmos ângulos, ou seja, essa não garantia de 4 lados formarem sempre o mesmo paralelogramo, vai gerar variação nos ângulos e nos permite deformar todos os paralelogramos, sendo assim não temos uma estrutura confiável para as treliças. No fim, o mais lógico é usar triângulos garantidos pelo caso de congruência LLL (lado-lado-lado). Achou interessante essa aplicação de conceito matemático na robótica? Continue estudando mais sobre congruências e formatos de figuras planas que você poderá descobrir muitas outras coisas interessante. Até a próxima!