Projeto

Geral

Perfil

Planejamento de Tragetória » Histórico » Revisão 4

Revisão 3 (Nicolas Oliveira, 05/03/2018 18:27 h) → Revisão 4/7 (Nicolas Oliveira, 26/03/2018 18:12 h)

# Planejamento de Tragetória 

 Nos utilizamos do algoritmo RRT (Rapidly-Exploring Random Tree) para calcular nossa tragetória. Ele busca uma trajetória a partir de um estado inicial até o objetivo expandindo uma árvore de busca.  
 Para isso necessitamos de 3 funções básicas: 

 * Extend(env:enviroment,current:state,target:state,Step:real):state 

 Essa função dado um estado atual extende dando um passo em direção ao objetivo, ou em uma direção aleatória. Caso uma colisão ocorra ela retorna um estado vazio (EmptyState). 
 Pseudo código: 

 ```c 
 r = (Target - Current)/||Targe-Current|| ; //vetor unitário na direção do target 
 NewState = r*Step + Current ;  
 if (Colision(NewState)) NewState = EmptyState; //confere se o novo estado vai colidir com algum obstáculo. 
 return NewState; 
 ``` 

 * Distance(current:state,target:state):real 

 Calcula a distância do estado atual ao objetivo, utilizamos a euclidiana nessa implementação. 

 * RandomState():state 

 Retorna um novo estado uniformemente distribuído no ambiente. 

 ```c 
 float random_x; 
 float random_y; 
 random_x = fiel_length*(rand()-0.5); //Random gera um número aleatório uniformemente aleatório distribuído entre 0 e 1 
 random_y = fiel_length*(rand()-0.5);  
 ``` 

 Basicamente a função estender pode utilizar como target o objetivo ou um ponto aleátório, o que garante que o algoritmo pode encontrar um caminho sem colidir com nenhum obstáculo. Como na figura abaixo: 

 ![](rrt.PNG) 

 A implementação seguiu o pseudo código abaixo: 

 ![](pseudocódigo.PNG) 

 ***A função Nearest garante que sempre extendemos a árvore do nó mais próximo do objetivo, porém ela também demanda muito processamento, já que tem q varrer a árvore toda a cada iteração. Vamos estudar um jeito para resolver isso.*** 
 Definimos uma árvore de pontos como uma matriz de 4 colunas, onde a primeira é o id do ponto, a segunda a coordenada x, a terceira a coordenada y e a quarta o id do pai. Dessa forma os nós são adicionados com o id sendo incrementado de 1 a cada nó. O id do pai é o id do nó da onde aquale novo ramo foi gerado. Assim quando encontramos um solução podemos fazer o backtracking nessa árvore para reconstruir a tragetória. 

 O próximo passo foi implentar a extenção do RRT (ERRT), com memória da última tragetória. Assim na hora de escolhermos um target podemos ir em direção ao objetivo, em uma direção aleatória ou em direção a algum ponto da última tragetória, como na imagem e código abaixo. 

 ![](errt.PNG) 
 ![](choose.PNG) 

 Por último implementamos a suavização da tragetória que segue o algoritmo abaixo descrito. Ela auxilia muito na rapidez com que o robô será capaz de seguir a trajetóra. 

 ![](suavização.png) 

 


 ## Implementações futuras e problemas atuais 

 * Atualmente caso o robô entre numa área considerada obstáculo ele não consegue gerar um tragetória para sair de lá, já que a origem da árvore já é um EmptyState. 
 * Pensamos em aumentar a área de influencia do robô inimigo (obstáculo) proporcionalmente a sua distância, o que nos daria uma garantia maior de não colidir. 
 * E conforme a bola se aproxima de um obstáculo a área de influencia dele deve ficar cada vez menor, para que possamos ser capazes de roubar a bola.