Projeto

Geral

Perfil

Ações

Atividade #1210

Fechada

Ajustar passe

Adicionado por Gabriel Borges da Conceição mais de 4 anos atrás. Atualizado mais de 4 anos atrás.

Situação:
Fechada
Prioridade:
Normal
Atribuído para:
Início:
29/10/2019
Data prevista:
21/02/2020

Descrição

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


Arquivos

erroWaitPass.png (123 KB) erroWaitPass.png Gabriel Borges da Conceição, 02/03/2020 14:30 h
WaitPassFuncionando.mp4 (21,8 MB) WaitPassFuncionando.mp4 Davi Pontes, 26/03/2020 01:11 h
WaitPassAntigo.mp4 (22,2 MB) WaitPassAntigo.mp4 Gabriel Borges da Conceição, 26/03/2020 21:55 h
Ações #1

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Descrição atualizado(a) (diff)
Ações #2

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Descrição atualizado(a) (diff)
Ações #3

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Atribuído para ajustado para Davi Pontes
Ações #4

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Data prevista ajustado para 21/02/2020
Ações #5

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Ações #6

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Ações #7

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Ações #8

Atualizado por Davi Pontesmais de 4 anos

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.

Ações #9

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Ações #10

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

![](erroWaitPass.png)

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.

Ações #11

Atualizado por Nicolas Oliveiramais de 4 anos

?

Ações #12

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Ações #13

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Situação alterado de Em andamento para Feedback
Ações #14

Atualizado por Davi Pontesmais de 4 anos

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.

Ações #15

Atualizado por Davi Pontesmais de 4 anos

Vídeo de teste do novo waitPass:

Error executing the video macro (undefined method `find_by_filename' for [#<Attachment id: 5205, container_id: 1210, container_type: "Issue", filename: "WaitPassFuncionando.mp4", disk_filename: "200326011136_WaitPassFuncionando.mp4", filesize: 22910598, content_type: "video/mp4", digest: "c406a1a72550c558425b00330ad1fb3c", downloads: 0, author_id: 208, created_on: "2020-03-26 01:11:36.000000000 +0000", description: "", disk_directory: "2020/03">]:Array Did you mean? find_index)

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

Ações #16

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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.

Error executing the video macro (undefined method `find_by_filename' for [#<Attachment id: 5206, container_id: 1210, container_type: "Issue", filename: "WaitPassAntigo.mp4", disk_filename: "200326215511_WaitPassAntigo.mp4", filesize: 23233815, content_type: "video/mp4", digest: "faa08339aced3e5f3878bb1d0d4df16e", downloads: 0, author_id: 93, created_on: "2020-03-26 21:55:11.000000000 +0000", description: "", disk_directory: "2020/03">]:Array Did you mean? find_index)

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.

Ações #17

Atualizado por Nicolas Oliveiramais de 4 anos

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.

Ações #18

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

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

Ações #19

Atualizado por Gabriel Borges da Conceiçãomais de 4 anos

  • Situação alterado de Feedback para Fechada
Ações

Exportar para Atom PDF