Project

General

Profile

Atividade #1210

Ajustar passe

Added by Gabriel Borges da Conceição over 1 year ago. Updated about 1 year ago.

Status:
Fechada
Priority:
Normal
Assignee:
Target version:
-
Start date:
10/29/2019
Due date:
02/21/2020

Description

Fazer receptor de passe assumir comportamento igual ao do goleiro para se posicionar ao encontro da bola.

erroWaitPass.png (123 KB) Preview Gabriel Borges da Conceição, 03/02/2020 02:30 PM

WaitPassFuncionando.mp4 (21.8 MB) Davi Pontes, 03/26/2020 01:11 AM

WaitPassAntigo.mp4 (22.2 MB) Gabriel Borges da Conceição, 03/26/2020 09:55 PM

Errowaitpass

History

#1 Updated by Gabriel Borges da Conceição over 1 year ago

  • Description updated (diff)

#2 Updated by Gabriel Borges da Conceição about 1 year ago

  • Description updated (diff)

#3 Updated by Gabriel Borges da Conceição about 1 year ago

  • Assignee set to Davi Pontes

#4 Updated by Gabriel Borges da Conceição about 1 year ago

  • Due date set to 02/21/2020

#5 Updated by Gabriel Borges da Conceição about 1 year ago

Você deve criar uma branch pra essa tarefa a paritr da dev.

A VI que você tem que mexer é a WaitPassTactic (refazer a máquina de estados dessa VI) e o caminho até chegar na VI é: Na Phoenix, vá no while Offensive e entre na ExecuteOffPlay, colocar o case na Play PassToStriker ou PassTo2ndStriker e entrar na VI PassReceiverRole. Colocar o case na tactic 0 e entrar na VI WaitPassTactic.

Para tomar como exemplo o funcionamento e máquina de estados do goleiro, você deve olhar a VI DefendGoalTactic, cujo caminho é: Na VI principal (Phoenix), vá no while Keeper e entre na ExecuteKeeperPlay. Daí coloque o case na play default e entre na VI KeeperRole.

#6 Updated by Gabriel Borges da Conceição about 1 year ago

Você vai ter que criar alguns métodos para a WaitPassSkill, como o de calcular o estado e os de calcular reta e fazer interseção.

Pra criar um método de uma classe, veja: http://redmine.roboime.com.br/projects/inteligencia/wiki/Adicionando_m%C3%A9todos_a_uma_classe

Mas, de forma geral, você deve abrir o projeto Phoenix (o arquivo do tipo Labview project), clicar com o botão direito na classe a qual quer criar um método, ir en "new" e escolher a opção VI from Static Dispatch Template, que é o que melhor se encaixa nesse caso.

Lembrando que depois de criar o método, você deve ainda no projeto clicar com o botão direito na classe que vc criou o método e save->save.

Mas recomendo que veja o link da wiki que coloquei.

Lembrando que você tem que abrir o Projeto antes de qualquer VI, porque se não, dá problema.

#7 Updated by Gabriel Borges da Conceição about 1 year ago

Poste seus resultados aqui após cada dia de trabalho, mostrando o que fez, com prints e explicando a lógica, além de deixar claro em qual branch você está mexendo.

#8 Updated by Davi Pontes about 1 year ago

A atividade foi realizada na branch fixPass

Para ajustar o recebimento do passe foi idealizado um funcionamento similar ao do goleiro. Para atingir o objetivo da tarefa a máquina de estados da tactic WaitPassTactic foi modificada, o novo parâmetro para verificar o estado é a distância (d) entre o PassKicker e a bola, para controlar essa máquina de estado foi criado um novo método chamado WaitPassTacticCheckStateChange, nele é possível verificar a distância mencionada, além desse método os seguintes novos estados (Para cada estado foi criada uma nova skill que encontram-se no skillbook) foram inseridos:

State 0: WaitBallTrajSkill
É acionado quando d>500mm
Nesse estado o posicionamento do robô se dá a partir do cálculo da trajetória da bola, esse cálculo é feito a partir dos parâmetros de posição e velocidade da bola. A partir da posição e da velocidade da bola é possível predizer com um nível razoável de precisão onde a bola estará ao longo do tempo, a partir dos dados supracitados uma reta é traçada e o robô responsável por receber a bola é posicionado sobre tal reta, sua posição é calculada de tal forma que haja o menor desvio na posição do robô que receberá o passe.

State 1: WaitBallKickerSkill
É acionado quando 400mm<d<=500mm
Nesse estado o posicionamento do robô se dá nos mesmos moldes do estado anterior porém no lugar da velocidade da bola é utilizado o vetor formado entre o PassKicker e a bola.

State 2: WaitBallOrientSkill
É acionado quando d<=400mm
Nesse estado o posicionamento do robô se dá nos mesmos moldes dos estados anteriores porém o vetor utilizado é montado a partir da direção que o PassKicker possui no momento.

#9 Updated by Gabriel Borges da Conceição about 1 year ago

Muito bem explicado!

Mas fiquei com uma dúvida: As retas que você traça para predizer a direção do passe fazem interseção com qual reta para gerar a posição do robô ao receber a bola?

Teste no grsim o funcionamento da lógica feita e corrija os possíveis erros e poste os resultados aqui. Depois disso, vamos testar no campo e realizar ajustes se necessários.

#10 Updated by Gabriel Borges da Conceição about 1 year ago

Atenção, abri seu código e percebi que tinha diversos erros de arquivos. Mas fui na dev e percebi que o erro vinha de lá e foi carregado na sua branch porque foi criada a partir da dev. Já voltei o push e a dev tá certa. Daí criei a branch NewWaitPass e coloquei seu trabalho lá.

Mas agora restaram erros no que você fez, de fios não informados e etc.

A seta quebrada no canto superior esquerdo indica erro. Ao clicar nela, abre essa caixa de Error List, daí vai clicando em Show Error que o labview vai te encaminhando pra onde tem o erro.

Avise aqui quando terminar de fazer essas correções.

#11 Updated by Nicolas Oliveira about 1 year ago

?

#12 Updated by Gabriel Borges da Conceição about 1 year ago

O Davi terminou o código mas ainda restaram algumas contas erradas e etc, ele vai consertar. Ele acabou ficando um pouco enrolado com estágio e outras coisas e por isso a tarefa não está avançando tão rápido, mas ele tem falado comigo.

#13 Updated by Gabriel Borges da Conceição about 1 year ago

  • Status changed from Em andamento to Feedback

#14 Updated by Davi Pontes about 1 year ago

Os erros de arquivo foram corrigidos apenas ligando alguns fios que estavam desconectados.
A lógica nas skills estava errada no cálculo da nova posição do robô que esta esperando o passe, essa lógica foi corrigida em todas as skills e agora o robô esta se posicionando corretamente.
Foi observado que havia um problema quanto ao local que o passkicker estava mirando, ele estava seguindo o robô que ia receber o passe, esse comportamento não era o desejável, visto que nessa tactic devemos posicionar o waitpass corretamente e isso ia fazer com que a mira fosse alterada. Para corrigir esse problema, foi colocada uma condição para pegar apenas a primeira posição do robô que irá receber o passe. Dessa forma, a mira agora fica fixa em uma posição.
Foi observado também que algumas posições muito absurdas estavam sendo enviadas para para o waitpass por conta de não se tratar a posição do passkicker em relação à bola. Para resolver esse problema, foi adicionada uma condição em todas as skills que só enviam uma nova posição para o waitpass quando o ângulo entre os vetores PassKicker-Ball e Ball-WaitPass for menor do que 0,5 em radianos (outros tratamentos de posições absurdas já haviam sido implementados de forma que esse é apenas um complemento), enquanto tal condição não for atendida, o waitpass recebe como posição a sua última posição.
Para efetuar os testes, a mira do passkicker foi adicionada de um vetor (400,200) visando simular um possível erro de precisão no passe. Várias posições da bola no campo foram testadas usando os comandos stop e indirect free blue consecutivamente. Nos últimos testes, o robô recebeu todos os passes a pesar de eles estarem configurados para uma posição diferente da padrão.
Acredito que podemos testar essa tactic no campo para verificar o real funcionamento dela.

#15 Updated by Davi Pontes about 1 year ago

Vídeo de teste do novo waitPass:

Loading the player ...

Teste executado com alteração de (-600, 500) na direção de passe do PassKicker.

#16 Updated by Gabriel Borges da Conceição about 1 year ago

Por efeito de comparação, tentei simular a mesma situação desse vídeo que o Davi colocou, mas com o WaitPass antigo pra medir a melhora produzida pela tarefa.

Também coloquei deslocamento de (-600, 500) na mira do PassKicker.

Loading the player ...

Lembrando que o WaitPass antigo tinha a lógica de fazer o PassReceiver se alinhar com a trajetória da bola e, por isso, apenas quando a bola começava a se mexer. E o novo, assim como o goleiro, já se alinha antes mesmo de a bola ser chutada, levando em consideração a posição e orientação do PassKicker, dependendo de sua distância à bola nos momentos anteriores ao passe. E dps que o passe é efeito, aí sim utiliza a trajetória da bola, mas o PassReceiver já vai estar muito próximo de pra onde a bola foi chutada.

#17 Updated by Nicolas Oliveira about 1 year ago

ok. Bom trabalho. É a mesma VI do goleiro? O ideal era tornar essa VIs mais próximas, como tendo subVIs comuns entre elas etc. Pra que a melhora n comportamento de uma se reflita na outra.

#18 Updated by Gabriel Borges da Conceição about 1 year ago

Acabamos fazendo VIs diferentes pelas interseções serem com retas distintas. Mas acho que podemos unificar a VI que determina os estados da Tactic.

#19 Updated by Gabriel Borges da Conceição about 1 year ago

  • Status changed from Feedback to Fechada

Also available in: Atom PDF

Go to top
Add picture from clipboard (Maximum size: 500 MB)