Planejamento de Tragetória » Histórico » Versão 1
Nicolas Oliveira, 27/02/2018 01:13 h
| 1 | 1 | Nicolas Oliveira | # Planejamento de Tragetória |
|---|---|---|---|
| 2 | |||
| 3 | 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: |
||
| 4 | |||
| 5 | * Extend(env:enviroment,current:state,target:state,Step:real):state |
||
| 6 | |||
| 7 | 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). |
||
| 8 | Pseudo código: |
||
| 9 | |||
| 10 | > r = (Target - Current)/||Targe-Current|| ; //vetor unitário na direção do target |
||
| 11 | > NewState = r*Step + Current ; |
||
| 12 | > if (Colision(NewState)) NewState = EmptyState; //confere se o novo estado vai colidir com algum obstáculo. |
||
| 13 | > return NewState; |
||
| 14 | |||
| 15 | * Distance(current:state,target:state):real |
||
| 16 | |||
| 17 | Calcula a distância do estado atual ao objetivo, utilizamos a euclidiana nessa implementação. |
||
| 18 | |||
| 19 | * RandomState():state |
||
| 20 | |||
| 21 | Retorna um novo estado uniformemente distribuído no ambiente. |
||
| 22 | |||
| 23 | > real random_x; |
||
| 24 | > real random_y; |
||
| 25 | > random_x = fiel_length*(Random-0.5); //Random gera um número aleatório uniformemente aleatório distribuído entre 0 e 1 |
||
| 26 | > random_y = fiel_length*(Random-0.5); |
||
| 27 | |||
| 28 | 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: |
||
| 29 | |||
| 30 |  |
||
| 31 | |||
| 32 | A implementação seguiu o pseudo código abaixo: |
||
| 33 | |||
| 34 |  |
||
| 35 | |||
| 36 | ***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.*** |
||
| 37 | 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. |
||
| 38 | |||
| 39 | 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. |
||
| 40 | |||
| 41 |  |
||
| 42 |  |
||
| 43 | |||
| 44 | 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. |
||
| 45 | |||
| 46 |  |
||
| 47 | |||
| 48 | |||
| 49 | ## Implementações futuras e problemas atuais |
||
| 50 | |||
| 51 | * 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. |
||
| 52 | * 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. |
||
| 53 | * 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. |