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