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. |