Atividade #1210
FechadaAjustar passe
Descrição
Fazer receptor de passe assumir comportamento igual ao do goleiro para se posicionar ao encontro da bola.
Arquivos
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Descrição atualizado(a) (diff)
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Descrição atualizado(a) (diff)
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Atribuído para ajustado para Davi Pontes
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Data prevista ajustado para 21/02/2020
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Davi Pontes há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Arquivo erroWaitPass.png erroWaitPass.png adicionado
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.
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Situação alterado de Em andamento para Feedback
Atualizado por Davi Pontes há quase 5 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.
Atualizado por Davi Pontes há quase 5 anos
- Arquivo WaitPassFuncionando.mp4 WaitPassFuncionando.mp4 adicionado
Vídeo de teste do novo waitPass:
Teste executado com alteração de (-600, 500) na direção de passe do PassKicker.
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Arquivo WaitPassAntigo.mp4 WaitPassAntigo.mp4 adicionado
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.
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.
Atualizado por Nicolas Oliveira há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 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.
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Situação alterado de Feedback para Fechada