Projeto

Geral

Perfil

Ações

Atividade #636

Fechada

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

Criar VI para desenhar um heatmap no campo

Adicionado por Lucas Germano quase 7 anos atrás. Atualizado mais de 6 anos atrás.

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

Descrição

A VI tem o intuito de fazer um heatmap com base nas probabilidades obtidas no programa que o Ricardo irá fazer. A ideia será receber um grid do campo, onde cada quadradinho terá um número associado à probabilidade de o robô estar naquele grid (ou quanto tempo o robô passou por ele durante o jogo). Quanto maior a probabilidade, maior será a cor vermelha naquele ponto. O heatmap é muito comum, por exemplo o heatmap do jogo Brasil x Alemanha:

![](picture12-3.png)


Arquivos

picture12-3.png (316 KB) picture12-3.png Lucas Germano, 23/03/2018 03:52 h
picture565-1.png (144 KB) picture565-1.png Lucas Germano, 23/03/2018 04:03 h
picture648-1.png (101 KB) picture648-1.png Lucas Germano, 23/03/2018 12:55 h
picture41-1.png (12,2 KB) picture41-1.png Lucas Germano, 25/03/2018 02:38 h
picture317-1.png (33,9 KB) picture317-1.png Lucas Germano, 27/03/2018 05:51 h
picture317-2.png (59,3 KB) picture317-2.png Lucas Germano, 27/03/2018 05:51 h
picture848-1.png (24,9 KB) picture848-1.png Lucas Germano, 27/03/2018 12:25 h
heatmap.csv (137 KB) heatmap.csv Nicolas Oliveira, 27/03/2018 12:51 h
heatmap.PNG (85,7 KB) heatmap.PNG Nicolas Oliveira, 27/03/2018 12:59 h
picture906-1.png (44,8 KB) picture906-1.png Lucas Germano, 27/03/2018 14:20 h
picture164-1.png (73,9 KB) picture164-1.png Lucas Germano, 27/03/2018 20:31 h
picture352-1.png (40,2 KB) picture352-1.png Lucas Germano, 13/04/2018 22:00 h
picture352-2.png (40,8 KB) picture352-2.png Lucas Germano, 13/04/2018 22:00 h
heatmaplog.PNG (7,48 KB) heatmaplog.PNG Nicolas Oliveira, 16/04/2018 02:27 h
escala.png (14,2 KB) escala.png Nicolas Oliveira, 16/04/2018 02:29 h
goleiro.png (12,2 KB) goleiro.png Lucas Germano, 17/04/2018 02:24 h
atacante.png (16,6 KB) atacante.png Lucas Germano, 17/04/2018 02:24 h
zagueiro.png (12,3 KB) zagueiro.png Lucas Germano, 17/04/2018 02:25 h
Ações #1

Atualizado por Lucas Germanoquase 7 anos

  • Atribuído para ajustado para Lucas Germano
  • Tarefa mãe ajustado para #623
Ações #2

Atualizado por Lucas Germanoquase 7 anos

Outra ideia de heatmap, mas que pode ser de mais fácil implementação é essa:

![](picture565-1.png)

Atualmente estou tendo dificuldades para gerar o heatmap do jogo Brasil x Alemanha, é necessário analisar os pixels do estado atual do campo e fazer uma média ponderada entre eles e a cor que se quer colorir, como uma espécie de transparência, não sei ao certo como fazer isso. Andei pesquisando sobre como fazer isso em LabView, mas acho que essa ideia não é muito utilizada. Pretendo focar na ideia de colorir quadrado por quadrado, como na imagem mostrada acima.
Estou utilizando as VI's que o Luciano fez na tarefa [623](http://redmine.roboime.com.br/issues/623) que são example-gradient.VI e PercentageToRGB.vi

Ações #3

Atualizado por Lucas Germanoquase 7 anos

Para essa ideia, é bom dar uma lida nesse link: [Multivarate kernel density estimation](https://en.wikipedia.org/wiki/Multivariate_kernel_density_estimation).

De onde tirei esse mapa, que é parecido com a ideia que quero implementar:

![](picture648-1.png)

Uma ideia complementar seria utilizar esse pseudo-código que fala de uma ideia para células adjacentes influenciarem uma nas outras, como parece ser de fácil implementação, fica para um teste futuro:

```
*for each coord
cell = coord projected to grid
increment cell value
end

for 0 to # of passes
for each row
for each col
if grid[row,col] > 0 then
grid[row,col] += 1
increment_adjacent_cells(row, col)
end
end
end
end*
```

Ações #4

Atualizado por Luciano Barreiraquase 7 anos

Não seria suficiente usar a probabilidade de um grid do histograma, normalizada pela maior de todas do grid, e usar a VI de porcentagem pra RGB da demo ?

Ações #5

Atualizado por Lucas Germanoquase 7 anos

Luciano Barreira escreveu:

Não seria suficiente usar a probabilidade de um grid do histograma, normalizada pela maior de todas do grid, e usar a VI de porcentagem pra RGB da demo ?

É suficente pro primeiro protótipo mesmo, e isso vai ser a primeira coisa que vou fazer. Mas estou pesquisando para um projeto mais a longo prazo e também porque gostei do assunto haha

Ações #6

Atualizado por Lucas Germanoquase 7 anos

Com base na VI fornecida pelo Luciano, criei uma VI para colorir um retângulo no campo com uma cor desejada. A VI funcionará transformando o campo em um grid e pintando-se o retângulo desejado, para isso, temos que ter como entrada:

  • Número de linhas do grid
  • Número de colunas do grid
  • Linha do retângulo a ser pintado
  • Coluna do retângulo a ser pintado
  • Cor que se deseja pintar

Aqui está um exemplo de:

  • Número de linhas do grid = 20
  • Número de colunas do grid = 25
  • Linha do retângulo a ser pintado = 5
  • Coluna do retângulo a ser pintado = 8
  • Cor que se deseja pintar = 0,99

![](picture41-1.png)

Com isso, é só pegar as informações obtidas pela distribuição de probabilidades e pintar o campo com as cores desejadas, de acordo com cada probabilidade.

Ações #7

Atualizado por Nicolas Oliveiraquase 7 anos

  • Data prevista ajustado para 28/03/2018

Acho que assim já está perfeito para o primeiro protótipo, bom trabalho. Sugiro focar na geração dos dados agora.

Ações #8

Atualizado por Luciano Barreiraquase 7 anos

Lucas Germano escreveu:

Com base na VI fornecida pelo Luciano, criei uma VI para colorir um retângulo no campo com uma cor desejada. A VI funcionará transformando o campo em um grid e pintando-se o retângulo desejado, para isso, temos que ter como entrada:

  • Número de linhas do grid
  • Número de colunas do grid
  • Linha do retângulo a ser pintado
  • Coluna do retângulo a ser pintado
  • Cor que se deseja pintar

Aqui está um exemplo de:

  • Número de linhas do grid = 20
  • Número de colunas do grid = 25
  • Linha do retângulo a ser pintado = 5
  • Coluna do retângulo a ser pintado = 8
  • Cor que se deseja pintar = 0,99

![](picture41-1.png)

Com isso, é só pegar as informações obtidas pela distribuição de probabilidades e pintar o campo com as cores desejadas, de acordo com cada probabilidade.

Massa. É preciso tomar cuidado com o mapeamento dos elementos da matriz de probabilidades que será utilizada para colorir esse mapa. Supondo, por exemplo, que esta tenha 9 colunas e 6 linhas, sendo cada elemento i,j da matriz correspondente a um metro quadrado dentro do campo, é preciso que estes quadrados sejam pintados a partir do canto branco do campo, e cada quadrado de nxn pixels mantém uma relação com um metro quadrado do campo. Este n você encontra pelas dimensões da foto. Isso pode ser feito na mão, olhando num editor de imagem onde que o pixel do canto superior esquerdo está e onde o inferior direito está, daí fazer uma razão com as dimensões m,n da matrix e py,px das diferenças em y e x desses pixels. Ou vc pode guardar os primeiro e último pixels brancos na primeira vez que abre a imagem. Só garante que a imagem ta bem dimensionada, eu fiz isso no paint, n deve estar perfeita, mas isso é galho fraco.

Outra coisa que se precisa tomar cuidado é, na hora de rodar o loop da VI estatística, garantir que a imagem está sendo carregada uma vez apenas, antes de entrar no loop principal, em vez de recarregada da memória secundária. Não tenho certeza se o LV já cuida disso, mas é bom garantir. Quando fiz a demo, uma execução da VI demorava para ser processada, acredito que por isso.

Atualizado por Lucas Germanoquase 7 anos

Primeiramente o campo será dividido em um grid n x m. Cada célula desse grid terá um valor de probabilidade que pode variar de 0 a 1 e cada valor real de probabilidade terá sua cor correspondente no heatmap. A VI que cria o heatmap com base em uma matriz de probabilidades está feita. Aqui está uma matriz de probabilidades genérica:

![](picture317-2.png)

E aqui está o campo pintado de acordo com a matriz acima:

![](picture317-1.png)

Ações #10

Atualizado por Lucas Germanoquase 7 anos

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

Atualizado por Nicolas Oliveiramais de 6 anos

Ficou legal. Poderia postar uma foto com um grid menor pf?

Ações #12

Atualizado por Lucas Germanomais de 6 anos

Grid 12x18 e valores aleatórios de probabilidade:

![](picture848-1.png)

Agora que vi que tem um pequeno errinho quando o número de linhas ou colunas do grid não divide o número de pixels, vou ajeitar isto.

Atualizado por Nicolas Oliveiramais de 6 anos

Criei aqui no matlab uma matriz de probabilidade que se parece mais com um jogo real. No eixo x é gaussiana e no y exponencial. Segue arquivo .csv e referência de como deve ficar o heatmap:

![](heatmap.PNG)

Ações #14

Atualizado por Lucas Germanomais de 6 anos

A função de normalização usada nos dados que o Nicolas mandou foi: (a - v_min)(v_max - v_min) Onde v_min é o mínimo valor da tabela, v_max o máximo valor e "a" é o valor da célula que se quer normalizar.
Com isso, o campo ficará:

![](picture906-1.png)

Ações #15

Atualizado por Luciano Barreiramais de 6 anos

Lucas Germano escreveu:

A função de normalização usada nos dados que o Nicolas mandou foi: (a - v_min)(v_max - v_min) Onde v_min é o mínimo valor da tabela, v_max o máximo valor e "a" é o valor da célula que se quer normalizar.
Com isso, o campo ficará:

![](picture906-1.png)

Quanto tempo demora para executar a VI ?

Ações #16

Atualizado por Lucas Germanomais de 6 anos

Para medir o tempo de execução da VI foi usada a seguinte estrutura que utiliza a VI Tick Count e a Flat Sequence:

![](picture164-1.png)

O tempo de execução da VI foi em média 300ms, para um grid 181x121, o que gera aproximadamente 33 FPS. Porém este valor pode ser melhorado se a parte que abre o arquivo .png só for executada 1 vez.

Atualizado por Lucas Germanomais de 6 anos

Eu e o Nicolas fomos para a IMBEL na quinta e resolvemos um problema quando tentava pintar um certo ponto (x,y) do campo, ele estava pintando outro ponto aleatório por causa de um erro no código.
O intuito agora é procurar uma escala que se encaixe nos propósitos aqui determinados, pois precisamos que não só o ponto que o robô está fique vermelho, mas também os pontos nos quais ele passou.

Supondo que o robô está no ponto (0,0):
![](picture352-1.png)

Ele irá para o ponto (500,0) e após 5 segundos:

![](picture352-2.png)

Ou seja, rapidamente ele perde as informações sobre os pontos nos quais ele esteve. Tenho que achar uma escala agora que se adeque às nossas necessidades. Tal escala deve valorizar mais os pontos pelo qual o robô passou rapidamente, pois os pontos que ele geralmente fica parado, como a zona de defesa para um zagueiro, já irá ser contabilizada muitas vezes e ter uma grande probabilidade.

Ações #18

Atualizado por Luiz Renault Leite Rodriguesmais de 6 anos

Podem usar escala logarítmica.

Atualizado por Nicolas Oliveiramais de 6 anos

Ajustei a VI para um escala logarítmica. Germano, coloque para a cor começar em um valor mais quente agora, como já havíamos conversado. Coloque para começar mais ou menos aonde está marcado na foto abaixo.

![](escala.png)

Segue heatmap gerado por um atacante chutando repetidamente para gol.

![](heatmaplog.PNG)

Ações #20

Atualizado por Nicolas Oliveiramais de 6 anos

  • Data prevista alterado de 28/03/2018 para 17/04/2018

Gerar protótipo funcional, permitindo a visualização do heatmap de todos os robôs, sendo o map a ser mostrado na tela escolhido pelo id do robô.

Ações #21

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo picture10-1.png adicionado
  • Arquivo picture10-2.png adicionado
  • Arquivo picture10-3.png adicionado

Aqui está os heatmaps dos robôs para uma simulação feita no grSim (aproximadamente 1 minuto). Agora podemos mudar o ID dos robôs durante a execução do código:

Ações #22

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo picture114-1.png adicionado
  • Arquivo picture114-2.png adicionado
  • Arquivo picture114-3.png adicionado
Ações #23

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo zagueiro.png adicionado
  • Arquivo atacante.png adicionado
  • Arquivo goleiro.png adicionado
Ações #24

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (goleiro.png)
Ações #25

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (atacante.png)
Ações #26

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (zagueiro.png)
Ações #27

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture114-3.png)
Ações #28

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture114-2.png)
Ações #29

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture114-1.png)
Ações #30

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture10-3.png)
Ações #31

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture10-2.png)
Ações #32

Atualizado por Lucas Germanomais de 6 anos

  • Arquivo excluído (picture10-1.png)

Atualizado por Lucas Germanomais de 6 anos

Goleiro:
![](goleiro.png)

Atacante:
![](atacante.png)

Zagueiro:
![](zagueiro.png)

Ações #34

Atualizado por Lucas Germanomais de 6 anos

Falta testar com um log de um jogo inteiro, para ver como o software se comporta.

Ações #35

Atualizado por Luciano Barreiramais de 6 anos

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

Atualizado por Lucas Germanomais de 6 anos

  • Situação alterado de Em andamento para Feedback

Algo mais a ser feito por enquanto?

Ações #37

Atualizado por Nicolas Oliveiramais de 6 anos

  • Situação alterado de Feedback para Resolvida

Por mim ta ok.

Ações #38

Atualizado por Lucas Germanomais de 6 anos

  • Situação alterado de Resolvida para Fechada

O heatmap se mostrou bastante demonstrativo em alguns exemplos rápidos de partida que fizemos. Pensaremos em algum jeito de implementar isso na inteligência futuramente.

Ações

Exportar para Atom PDF