Projeto

Geral

Perfil

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