Projeto

Geral

Perfil

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
![](rrt.PNG)
31
32
A implementação seguiu o pseudo código abaixo:
33
34
![](pseudocódigo.PNG)
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
![](errt.PNG)
42
![](choose.PNG)
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
![](suavização.png)
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.