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