Atividade #1210: Ajustar passe - Inteligência - Redmine RoboIME
Atividade #1210
Ajustar passe
Fazer receptor de passe assumir comportamento igual ao do goleiro para se posicionar ao encontro da bola.
erroWaitPass.png (123 KB) 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
Assignee set to Davi Pontes
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.
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.
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.
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.
File erroWaitPass.png added
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.
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.
#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
File WaitPassFuncionando.mp4 added
Vídeo de teste do novo waitPass:
Teste executado com alteração de (-600, 500) na direção de passe do PassKicker.
File WaitPassAntigo.mp4 added
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.
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.
Acabamos fazendo VIs diferentes pelas interseções serem com retas distintas. Mas acho que podemos unificar a VI que determina os estados da Tactic.