Projeto

Geral

Perfil

Ações

Atividade #695

Fechada

Objetivo #623: Criar software para análise estatística dos jogos

Criar histograma de erro do chute

Adicionado por Lucas Germano aproximadamente 6 anos atrás. Atualizado aproximadamente 6 anos atrás.

Situação:
Fechada
Prioridade:
Normal
Atribuído para:
Início:
26/04/2018
Data prevista:

Descrição

Fazer uma VI que plote um gráfico do (erro do chute previsto em relação ao que ele executou)x(número de chutes)


Arquivos

picture299-1.png (1,18 KB) picture299-1.png Lucas Germano, 26/04/2018 04:30 h
teste_ball_out.mp4 (7,94 MB) teste_ball_out.mp4 Lucas Germano, 27/04/2018 06:27 h
picture404-1.png (3,42 KB) picture404-1.png Lucas Germano, 27/04/2018 06:28 h
picture463-1.png (31,7 KB) picture463-1.png Lucas Germano, 30/04/2018 04:07 h
Ações #1

Atualizado por Lucas Germanoaproximadamente 6 anos

A VI do histograma de erro do chute foi criada e ela já está gerando o histograma com o número de chutes em função do erro. Funciona dessa maneira: o máximo erro permitido para o chute é 700mm, caso contrário irá ser considerado que algum fator externo desviou a bola, não propriamente que o robô errou o chute. Esse valor será divido em 14 intervalos, gerando intervalos de 50mm que representarão as células de um vetor. A 1ª célula representa quantas vezes o robô errou até uma distância de 50mm de onde ele queria chutar, a 2ª célula representa quantas vezes o robô errou em uma distância de 50mm-100mm de onde ele queria chutar e assim por diante.
Para uns poucos casos de teste o vetor ficou assim:

![](picture299-1.png)

O que mostra que o robô no grSim, está errando os chutes por aproximadamente 90mm (para esse caso de teste rápido).

A VI "Y Goal Marker", que é a VI que diz quanto o robô erra do chute esperado em relação ao chute feito precisa ser ajeitada, pois nem sempre ela está detectando que a bola entrou no gol, que é o que caracteriza somar uma unidade à alguma célula no vetor.

Ações #2

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

Detalhar melhor esse erro na VI de kickerror. Esse histograma já está sendo plotado em um gráfico pra facilitar a visualização? O número de intervalos pode ser controlado, certo?

Ações #3

Atualizado por Lucas Germanoaproximadamente 6 anos

Atualmente, para definir se foi gol ou não, verifica se ball_x > field_length/2 e se ball_x_anterior < field_length/2. As vezes, por algum motivo estranho, quando o robô chuta a bola e ela entra no gol, essa verificação não é validada e não é contado como um gol.
Ainda não está sendo plotado em um gráfico pq quero consertar os erros antes, mas isto é o de menos, dá para fazer rapidamente.
Sim, o número de intervalos está em um control.

Ações #4

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

Provavelmente deve ter um feedback node pra pegar o último x, se vc for nas propriedades tem como colocar um delay nele. Faz isso e vê se melhora.

Ações #5

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

  • Tarefa mãe ajustado para #623

Atualizado por Lucas Germanoaproximadamente 6 anos

Acho que descobri o problema de a VI não estar detectando que a bola passou da linha do gol. Preste atenção aos probes 35 e 36, vamos olhar para o evento ball out enquanto um atacante chuta continuamente a bola para dentro do gol.

![](picture404-1.png)

Error executing the video macro (undefined method `find_by_filename' for [#<Attachment id: 1605, container_id: 695, container_type: "Issue", filename: "teste_ball_out.mp4", disk_filename: "180427062724_teste_ball_out.mp4", filesize: 8327026, content_type: "video/mp4", digest: "ed6f13ba01934e8a0537db62f9a4abdd", downloads: 0, author_id: 36, created_on: "2018-04-27 06:27:24.000000000 +0000", description: "", disk_directory: "2018/04">, #<Attachment id: 1606, container_id: 695, container_type: "Issue", filename: "picture404-1.png", disk_filename: "180427062812_picture404-1.png", filesize: 3505, content_type: "image/png", digest: "787055e39c6fe3348ad24175ec38e036", downloads: 0, author_id: 36, created_on: "2018-04-27 06:28:12.000000000 +0000", description: "", disk_directory: "2018/04">]:Array Did you mean? find_index)

Dá pra perceber claramente que no probe 35 (antes do channel) aparecem bem mais ball out do que no probe 36. Isso se deve á quantidade de pacotes enviadas através do channel. Como a quantidade é muito alta, alguns pacotes serão perdidos, sendo que as vezes o pacote perdido é aquele que contém o evento ball out verdadeiro.
Existe alguma forma de não perder nenhum pacote ou driblar essa situação?

Ações #7

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

Tenta criar, como eu tinha dito pra fazer, um loop separado pra cada tipo de dado q desejamos gerar, principalmente separada do que gera o heatmap. A taxa que o channel manda é igual ao fps do loop que está recebendo. Naturalmente a VI do heatmap roda mais lentamente do que o resto do código, como é o desenho do campo na IA por exemplo.

Se vc colocar em loops separadas a taxa dessa VI deve ficar bem próxima da que recebe pacotes, ai assim, vc n vai perder tantos dados.
Mas bom trabalho descobrindo qual era o problema. Recomendo q vc coloque a VI de fps counter nesse loop pra ver q a taxa está mais lenta que 60fps.

Ações #8

Atualizado por Luciano Barreiraaproximadamente 6 anos

Antes de tudo:

A thread de cima é realmente necessária ? Precisa paralelizar esse cálculo ? Ou seja, dá pra fazer o que você está fazendo dentro do mesmo "loop infinito" sem perda de performance e continuando a fazer sentido ? Se sim, eu sugiro que não abuse dos caninhos. Eles são necessários quando temos tarefas que podem ( e devem ) ser feitas de maneira paralela e que a perda de informações é tolerável ( por isso o nome do caninho é "Lossy Stream" ), como por exemplo o desenho do campo. Se perdermos um pacote de configuração do campo e só for desenhado o próximo pacote, praticamente não vai fazer diferença pra visualização.

Ações #9

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

Por isso acho q a VI de heatmap deve ser uma tarefa paralela, a perda de pacote nela é tolerável. E as outras VIs (q demandam menos processamento, mas n toleram perda de pacote) seriam outra thread.

Ações #10

Atualizado por Luciano Barreiraaproximadamente 6 anos

Lucas Germano escreveu: não, verifica se ball_x > field_length/2 e se ball_x_anterior < field_length/2. As vezes, por algum motivo estranho, quando o >robô chuta a bola e ela entra no gol, essa verificação não é validada e não é contado como um gol.
Ainda não está sendo plotado em um gráfico pq quero consertar os erros antes, mas isto é o de menos, dá para fazer rapidamente.
Sim, o número de intervalos está em um control.

Outra coisa (isso independe de estar perdendo pacote ou não!!), não basta verificar a primeira condição ? Sugiro que se divida em dois eventos :

- Ricochete, quando a diferença bola_atual.x - bola_anterior.x troca de sinal
- Bola dentro do gol, quando bola_atual.x > field_length/2 e y entre -(tamanho_do_gol-espessura_do_gol)/2 e (tamanho_do_gol-espessura_do_gol)/2

O Ricochete serve pra definir se ouve interceptação da bola ou se ela bateu em alguma parede do campo
O segundo serve para definir se a bola está ou não dentro do gol.

Quando o primeiro ocorrer, verifica-se o segundo.

Um detalhe importante é que há a possibilidade do primeiro evento ser impreciso com ruído na bola.

Ações #11

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

Verdade, fica bem melhor assim.

Ações #12

Atualizado por Lucas Germanoaproximadamente 6 anos

Ele também estava perdendo a informação que ball_x > field_length/2 pq a bola ficava pouco tempo nessa situação, também verifiquei essa ideia.

Ações #13

Atualizado por Lucas Germanoaproximadamente 6 anos

Luciano Barreira escreveu:

Antes de tudo:

A thread de cima é realmente necessária ? Precisa paralelizar esse cálculo ? Ou seja, dá pra fazer o que você está fazendo dentro do mesmo "loop infinito" sem perda de performance e continuando a fazer sentido ? Se sim, eu sugiro que não abuse dos caninhos. Eles são necessários quando temos tarefas que podem ( e devem ) ser feitas de maneira paralela e que a perda de informações é tolerável ( por isso o nome do caninho é "Lossy Stream" ), como por exemplo o desenho do campo. Se perdermos um pacote de configuração do campo e só for desenhado o próximo pacote, praticamente não vai fazer diferença pra visualização.

Não entendi, oq vc está falando é pra trazer a VI do erro do chute pro while onde estava o probe 35?

Ações #14

Atualizado por Luciano Barreiraaproximadamente 6 anos

Lucas Germano escreveu:

Luciano Barreira escreveu:

Antes de tudo:

A thread de cima é realmente necessária ? Precisa paralelizar esse cálculo ? Ou seja, dá pra fazer o que você está fazendo dentro do mesmo "loop infinito" sem perda de performance e continuando a fazer sentido ? Se sim, eu sugiro que não abuse dos caninhos. Eles são necessários quando temos tarefas que podem ( e devem ) ser feitas de maneira paralela e que a perda de informações é tolerável ( por isso o nome do caninho é "Lossy Stream" ), como por exemplo o desenho do campo. Se perdermos um pacote de configuração do campo e só for desenhado o próximo pacote, praticamente não vai fazer diferença pra visualização.

Não entendi, oq vc está falando é pra trazer a VI do erro do chute pro while onde estava o probe 35?

Sim, caso faça sentido.

Ações #15

Atualizado por Luciano Barreiraaproximadamente 6 anos

  • Versão ajustado para RoboCup 2018
Ações #16

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

  • Versão excluído (RoboCup 2018)

Não seria melhor n ter nenhuma VI estatística dentro do loop de recepção do pacote? Pra que agt possa sempre ver o contfps da recepção limpo?

Ações #17

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

  • Versão ajustado para RoboCup 2018
Ações #18

Atualizado por Lucas Germanoaproximadamente 6 anos

O problema da perda de pacotes foi resolvida fazendo um while a parte pro histograma, separando-o do heatmap.

Foi feito um teste com 100 chutes aleatórios em um campo sem goleiro, de acordo com as VI's de ball replacement e robot replacement feitas recentemente, o resultado foi plotado em um gráfico e ficou desta maneira:

![](picture463-1.png)

Como já era esperado em um teste sem goleiro, a maior parte dos chutes ficou perto do erro mínimo, que é o que deve ser maximizado em qualquer situação.

OBS: Cada pico no gráfico representa um intervalo onde o erro de chute caiu. O gol, que possui 700mm, foi dividido em 20 intervalos, sendo que o primeiro pico representa os chutes que cairam no intervalo de erro de 0mm a 35mm, o segundo pico representa os chutes que cairam no intervalo de erro de 36mm a 70mm e assim por diante..

Ações #19

Atualizado por Nicolas Oliveiraaproximadamente 6 anos

  • Situação alterado de Feedback para Resolvida

Por mim ta ok. Vamos gerar um teste comparativo entre o nosso atacante na larc e o atual usando RRT.

Ações #20

Atualizado por Lucas Germanoaproximadamente 6 anos

  • Situação alterado de Resolvida para Fechada

O teste foi criado e está funcionando, falta testar o comparativo entre o atacante atual e o utilizado na LARC.

Ações

Exportar para Atom PDF