Trabalho Computacional PD1 Resgate de pessoas por robôs em terrenos acidentados Romário Espíndula Camilo Avancini Porquê robôs? Prós: • Não se machucam • Podem fazer coisas que humanos não fazem • Não colocam mais pessoas em risco Contras: • Não tomam decisões sozinhos, a não ser que a decisão esteja expressada no código. • As decisões tem que ser expressadas através de cálculos matemáticos, muitas vezes complexas. Primeira etapa – Definição do Plano Para que o robô possa andar, primeiro devemos descrever como ele se movimentará no plano onde se encontra. Os robôs podem utilizar câmeras, sensores ( sonoros, infra-vermelho,etc... ), entre outros dispositivos que lhe forneçam um “overview” do plano onde se encontra. No nosso caso limitamos o plano à formas geométricas em 2D. Primeira etapa – Definição do Plano Nosso maior problema em relação ao plano era como verificar se um ponto poderia ser utilizado pelo robô em seu movimento, ou se ele estava ocupado por algum polígono. Para definirmos o plano de forma facilitada, decidimos utilizar polígonos regulares ( triangulo, circulo e quadrado ) , e estipulamos um tipo de dado de entrada padrão a todos a ser dado, como mostrado no próximo slide. Primeira etapa – Definição do Plano Os polígonos são definidos de acordo com os desenhos acima. O plano é definido por uma lista de tuplas do tipo: (nomedopoligono,(Xi,Yi),lado) Exemplo: [(“circ”,(3,3),2)] Isso gerará um circulo de centro em x=3 e y=3, com raio=2 Primeira etapa – Verificação no plano Como fizemos a entrada de forma generalizada, possibilitou criar uma função que dado um ponto (X,Y) faz um “scan” em todo o plano e verifica se aquele ponto pertence à algum polígono, retornando um valor booleano (False) caso isso ocorra. Permitindo que pudéssemos analisar os passos do robô para que ele não executasse nenhum movimento que não era possível. Segunda etapa – Movimento do robô Como expressar através de uma lógica matemática um movimento que deve demonstrar um certo grau de inteligência? Idéias básicas: • Deve perseguir o local onde deseja estar • Deve desviar dos obstáculos no caminho • Deve buscar o melhor caminho, ou mais próximo que puder disso. Segunda etapa – Movimento do robô Após várias tentativas e lógicas diferentes, construímos um conceito de movimento que segue algumas etapas. Segunda etapa – Movimento do robô O primeiro passo da lógica é sempre tentar se aproximar o máximo que puder do ponto a ser perseguido. Neste caso são as setas que NÃO estão circuladas de vermelho. Segunda etapa – Movimento do robô O segundo é que caso esses movimentos não sejam possíveis, retornar a um ponto anterior ( movimentos circulados de vermelho ) e tentar seguir por outro ponto. Segunda etapa – Movimento do robô O problema é que como a primeira lógica manda ele se aproximar o máximo possível do ponto desejado, logo o robô executará o passo novamente para o ponto, finalizando o movimento do robô em um loop “infinito” de ida e volta para aquele mesmo ponto. Para evitar problemas desse tipo utilizamos várias funções para evitar redundâncias nos movimentos. Tornando-o de certa forma “inteligente”. Exemplos do programa – Sem OpenGL [("Resgate 1","45 metros percorridos aproximadamente","33s a uma velocidade de 2m/s, adicionado de 10s (tempo de captura)","Pontos por onde o robo passou para executar o resgate da vitima: [(12.0,-12.0),(11.0,-11.0),(10.0,-10.0),(10.0,-9.0),(9.0,-8.0),(8.0,-7.0),(7.0,6.0),(6.0,-7.0),(5.0,-8.0),(4.0,-9.0),(3.0,-9.0),(2.0,-9.0),(1.0,-9.0),(0.0,-9.0),(-1.0,-9.0),(-2.0,8.0),(-3.0,-7.0),(-4.0,-8.0),(-4.0,-9.0),(-4.0,-8.0),(-3.0,-7.0),(-2.0,-8.0),(-1.0,-9.0),(0.0,-9.0),(1.0,9.0),(2.0,-9.0),(3.0,-9.0),(4.0,-9.0),(5.0,-8.0),(6.0,-7.0),(7.0,-6.0),(8.0,-7.0),(9.0,-8.0),(10.0,9.0),(10.0,-10.0),(11.0,-11.0),(12.0,-12.0)]"),("Resgate 2","35 metros percorridos aproximadamente","28s a uma velocidade de 2m/s, adicionado de 10s (tempo de captura)","Pontos por onde o robo passou para executar o resgate da vitima: [(12.0,12.0),(11.0,-11.0),(10.0,-10.0),(10.0,-9.0),(9.0,-8.0),(8.0,-7.0),(7.0,-6.0),(6.0,-5.0),(5.0,4.0),(4.0,-3.0),(3.0,-2.0),(2.0,-1.0),(1.0,0.0),(1.0,1.0),(1.0,0.0),(2.0,-1.0),(3.0,-2.0),(4.0,3.0),(5.0,-4.0),(6.0,-5.0),(7.0,-6.0),(8.0,-7.0),(9.0,-8.0),(10.0,-9.0),(10.0,-10.0),(11.0,11.0),(12.0,-12.0)]"),("Resgate 3","67 metros percorridos aproximadamente","44s a uma velocidade de 2m/s, adicionado de 10s (tempo de captura)","Pontos por onde o robo passou para executar o resgate da vitima: [(12.0,-12.0),(11.0,-11.0),(10.0,-10.0),(10.0,-9.0),(9.0,8.0),(8.0,-7.0),(7.0,-6.0),(6.0,-5.0),(5.0,-4.0),(4.0,-3.0),(3.0,-2.0),(2.0,-1.0),(1.0,0.0),(0.0,1.0),(1.0,2.0),(-2.0,2.0),(-3.0,3.0),(-4.0,4.0),(-5.0,5.0),(-6.0,6.0),(-7.0,7.0),(-8.0,8.0),(-9.0,8.0),(10.0,9.0),(-11.0,10.0),(-11.0,11.0),(-11.0,10.0),(-10.0,9.0),(-9.0,8.0),(-8.0,8.0),(-7.0,7.0),(6.0,6.0),(-5.0,5.0),(-4.0,4.0),(-3.0,3.0),(-2.0,2.0),(-1.0,2.0),(0.0,1.0),(1.0,0.0),(2.0,-1.0),(3.0,2.0),(4.0,-3.0),(5.0,-4.0),(6.0,-5.0),(7.0,-6.0),(8.0,-7.0),(9.0,-8.0),(10.0,-9.0),(10.0,-10.0),(11.0,11.0),(12.0,-12.0)]").... Exemplos do programa – Com OpenGL Exemplos do programa – Plano esperado Outros exemplos Outros exemplos Outros exemplos