Atividade #1091
FechadaMeta #1230: Ter bons filtro de posição e estimatidor de velocidades
Modificar o filtro de Kalman
Adicionado por Lucas Germano mais de 5 anos atrás. Atualizado mais de 4 anos atrás.
Descrição
Um grande problema que temos é tratar as informações quando algum objeto sai da visão sem efetivamente ter saído de campo.
Temos implementado Lifetime do robô e da bola.
Porém o Lifetime da bola por enquanto apenas a mantém na última posição, sem propagar sua trajetória.
Já o dos robôs tenta propagar sua trajetória mas está bastante incorreto, aumentando muito a velocidade dos robôs. Quando o robô está parado, o lifetime apenas o mantém em sua última posição.
O foco do trabalho é melhorar o Kalman colocando como input a velocidade medida do robô e como consequência, espera-se que o Lifetime funcione bem naturalmente.
Arquivos
BallLifeTime.png (72,5 KB) BallLifeTime.png | Gabriel Borges da Conceição, 19/08/2019 18:59 h | ||
LifeTimeRobotExec.png (8,77 KB) LifeTimeRobotExec.png | Gabriel Borges da Conceição, 23/08/2019 19:03 h | ||
LifeTimeBall.png (96,3 KB) LifeTimeBall.png | Gabriel Borges da Conceição, 23/08/2019 19:03 h | ||
LifeTimeRobot.png (37,7 KB) LifeTimeRobot.png | Gabriel Borges da Conceição, 23/08/2019 19:03 h | ||
Video_LifeTimeRobot.wmv (1,06 MB) Video_LifeTimeRobot.wmv | Gabriel Borges da Conceição, 23/08/2019 19:14 h | ||
TesteLifeTimeBall.png (36,2 KB) TesteLifeTimeBall.png | Gabriel Borges da Conceição, 23/08/2019 19:28 h | ||
Video_TesteLifeTimeBall.wmv (451 KB) Video_TesteLifeTimeBall.wmv | Gabriel Borges da Conceição, 23/08/2019 19:29 h | ||
DeleteBall.png (38,7 KB) DeleteBall.png | Gabriel Borges da Conceição, 23/08/2019 19:37 h | ||
Apagabola.png (39,1 KB) Apagabola.png | Gabriel Borges da Conceição, 23/08/2019 19:37 h | ||
BallOutAntes.png (72,5 KB) BallOutAntes.png | Gabriel Borges da Conceição, 23/08/2019 19:51 h | ||
Video_BallOutNoDecode.wmv (685 KB) Video_BallOutNoDecode.wmv | Gabriel Borges da Conceição, 23/08/2019 19:51 h | ||
Video_LTBallRolando.wmv (990 KB) Video_LTBallRolando.wmv | Gabriel Borges da Conceição, 23/08/2019 20:00 h | ||
ConfereSeUsaControle.png (98,6 KB) ConfereSeUsaControle.png | Gabriel Borges da Conceição, 27/08/2019 14:37 h | ||
SemEntradaDeControle.png (49,8 KB) SemEntradaDeControle.png | Gabriel Borges da Conceição, 27/08/2019 14:40 h | ||
Medição.png (19,1 KB) Medição.png | Gabriel Borges da Conceição, 27/08/2019 14:51 h | ||
zk.png (10,6 KB) zk.png | Gabriel Borges da Conceição, 27/08/2019 14:52 h | ||
AtualizaXkk.png (51,6 KB) AtualizaXkk.png | Gabriel Borges da Conceição, 27/08/2019 14:56 h | ||
TransformarH.png (15,9 KB) TransformarH.png | Gabriel Borges da Conceição, 27/08/2019 14:57 h | ||
TransformarReZk.png (51 KB) TransformarReZk.png | Gabriel Borges da Conceição, 27/08/2019 15:00 h | ||
FValuesKalman.png (101 KB) FValuesKalman.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
HValuesKalman2.png (163 KB) HValuesKalman2.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
MatrizeseEquações.png (148 KB) MatrizeseEquações.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
HValuesKalman.png (162 KB) HValuesKalman.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
PValuesKalman.png (134 KB) PValuesKalman.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
PValuesKalman2.png (178 KB) PValuesKalman2.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
RKalman.png (152 KB) RKalman.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
RvaluesKalman.png (150 KB) RvaluesKalman.png | Gabriel Borges da Conceição, 04/09/2019 12:37 h | ||
MexendoNoP.mp4 (7,05 MB) MexendoNoP.mp4 | Gabriel Borges da Conceição, 06/09/2019 16:02 h | ||
SemMexerNoP.mp4 (5 MB) SemMexerNoP.mp4 | Gabriel Borges da Conceição, 06/09/2019 16:02 h | ||
R001P1000Somando.mp4 (6,28 MB) R001P1000Somando.mp4 | Gabriel Borges da Conceição, 07/09/2019 23:47 h | ||
R01P100Somando.mp4 (5,58 MB) R01P100Somando.mp4 | Gabriel Borges da Conceição, 07/09/2019 23:47 h | ||
PSum.png (30,2 KB) PSum.png | Gabriel Borges da Conceição, 07/09/2019 23:47 h | ||
R01P1000SemSomar.mp4 (5,34 MB) R01P1000SemSomar.mp4 | Gabriel Borges da Conceição, 07/09/2019 23:48 h | ||
TesteKalmanSomandoP.png (4,19 KB) TesteKalmanSomandoP.png | Gabriel Borges da Conceição, 07/09/2019 23:50 h | ||
TesteOldKalmam.png (6,04 KB) TesteOldKalmam.png | Gabriel Borges da Conceição, 07/09/2019 23:50 h | ||
TesteKalman.png (6,52 KB) TesteKalman.png | Gabriel Borges da Conceição, 07/09/2019 23:50 h | ||
VInZP100.png (5,68 KB) VInZP100.png | Gabriel Borges da Conceição, 09/09/2019 18:15 h | ||
VInZ.png (5,88 KB) VInZ.png | Gabriel Borges da Conceição, 09/09/2019 18:15 h | ||
AnalisandoReacaoAVariacao.png (7,91 KB) AnalisandoReacaoAVariacao.png | Gabriel Borges da Conceição, 09/09/2019 18:40 h | ||
LifeTimeDoRobôFuncionando.mp4 (642 KB) LifeTimeDoRobôFuncionando.mp4 | Gabriel Borges da Conceição, 09/09/2019 19:37 h | ||
calcdt_principal.png (170 KB) calcdt_principal.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
infinito.png (160 KB) infinito.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
kalman B.png (195 KB) kalman B.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
mudancas no dt.png (150 KB) mudancas no dt.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
limitacaofps.png (162 KB) limitacaofps.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
ballfps.png (157 KB) ballfps.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
ballsfps.png (173 KB) ballsfps.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
ballZ.png (71,5 KB) ballZ.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
calcdt.png (183 KB) calcdt.png | Antonio de Souza Gomes Pereira, 29/09/2019 04:00 h | ||
WhatsApp Video 2019-09-29 at 00.58.27.mp4 (5,63 MB) WhatsApp Video 2019-09-29 at 00.58.27.mp4 | Antonio de Souza Gomes Pereira, 29/09/2019 04:18 h |
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Título alterado de Analisar e corrigir a bola estar sumindo quando está em alta velocidade para Analisar e tratar casos de bola fora da visão
- Atribuído para alterado de Lucas Germano para Intel
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Início alterado de 30/04/2019 para 16/08/2019
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo BallLifeTime.png BallLifeTime.png adicionado
- Atribuído para alterado de Intel para Gabriel Borges da Conceição
O primeiro passo foi implementar o lifetime da bola no código novo. O lifetime foi feito no código antigo durante a RoboCup, utilizando uma ideia que a RoboFEI compartilhou com a gente.
![](BallLifeTime.png)
Basicamente, se está ocorrendo a primeira iteração em que não recebemos a bola da visão (empty array), então o vetor de bolas da última iteração é passado ao resto do código até que passe T segundos ou que chegue novas informações.
Esse tempo T é setado no ElapsedTime (basta clicar duas vezes em cima dele) e foi deixado como 10s por enquanto a fim de podermos testar no PIRF e realmente perceber isso acontecendo. Vamos analisar e chegar a um consenso de tempo "ideal".
A RoboFEI deixa tempo infinito, o que faz sentido já que, se a bola efetivamente estiver fora do campo, o comando do juiz mudará para Halt.
O próximo passo é fazer com que, ao invés da posição, a trajetória da bola seja mantida durante certo tempo caso ela saia da visão. Precisamos analisar se isso deve ser feito no Kalman ou "manualmente".
A VI da foto é SSL Detection Frame. Pra chegar até ela no códido: No while da visão, receiveDecodeAndDoKalman -> decodeCameras -> Decode SSL Wrapper Package -> SSL Detection Frame.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Data prevista ajustado para 31/08/2019
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
Além do lifetime, foi refeito, na robocup, a parte de ignorar lados na visão. Isso também foi copiado para o código novo e se encontra na mesma VI.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
O Nicolas informou que existe o lifetime dentro do Kalman e que já está implementado para os robôs. Durante a robocup, ele viu que tinha um erro na implementação pra bola e decidiu fazer na parte de decodificação de pacotes mesmo, como mostrado acima.
Devemos então retirar de onde atualmente está sendo feito e corrigir o que tem no Kalman.
Além disso, não sabemos se o lifetime dos robôs mantém a posição ou se mantem a trajetória. Devem ser realizados testes afim de averiguar isso.
Outro fato relacionado a isso é que as estimativas de velocidade estão sendo feitas pós Kalman e não sabemos como está o input e tratamento de velocidades no kalman. A ideia é fazermos essa estimativa com a derivada do labview (que usa método de tustin) antes do Kalman (logo, com as posições não filtradas) e passar isso como input.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
Foi criada a branch LifeTime, a partir da dev, para trabalhar nesta tarefa.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo LifeTimeBall.png LifeTimeBall.png adicionado
- Arquivo LifeTimeRobotExec.png LifeTimeRobotExec.png adicionado
- Arquivo LifeTimeRobot.png LifeTimeRobot.png adicionado
- Arquivo Video_LifeTimeRobot.wmv Video_LifeTimeRobot.wmv adicionado
Foram encontrados os lifetime dos robôs e bola no Kalman.
LifeTime do robô:
Phoenix -> receiveDecodeAndDoKalman -> KalmanAndMakeFrame -> SSL Detection Frame Simple Estimamtor Cameras VelCmd -> SSL Detection Frame Simple Estimamtor Kalman VelCmd -> SSL Detection Robot Estimamtor Kalman VelCmd -> SSL Detection Robots Delete Invalids
![](LifeTimeRobot.png)
![](LifeTimeRobotExec.png)
Também há para a bola (mesma conta do robô):
Phoenix -> receiveDecodeAndDoKalman -> KalmanAndMakeFrame -> SSL Detection Frame Simple Estimamtor Cameras VelCmd -> SSL Detection Frame Simple Estimamtor Kalman VelCmd -> SSL Detection Ball Estimamtor Kalman VelCmd:
![](LifeTimeBall.png)
Em testes no grSim, percebi que o lifetime do robô tenta manter a trajetória, mas ela não fica boa, como segue no vídeo abaixo:
Acredito que isso tenha acontecido pelo fato de as velocidades input no Kalman serem as que a gente mandou na intel na última iteração. Vou colocar o estimador de velocidades feito pelo Nicolas nessa parte e analisar o resultado.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo TesteLifeTimeBall.png TesteLifeTimeBall.png adicionado
Para testar o lifetime da bola fiz o seguinte:
![](TesteLifeTimeBall.png).
Segue o resultado:
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo Video_TesteLifeTimeBall.wmv Video_TesteLifeTimeBall.wmv adicionado
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo DeleteBall.png DeleteBall.png adicionado
- Arquivo Apagabola.png Apagabola.png adicionado
Coloquei 10s no tempo dos LifeTimes da bola e robô para fazer os testes.
Percebi que o erro do lifetime da bola se dá pelo seguinte:
Como é feito o LifeTime: Se determinado robô tiver Valid Falso, ele é mantido no vetor até que dê o tempo. Esse vetor vai dentro de um cluster (Detection Frame) e é passado por feedback node e por isso o robô continua nele.
Porém, no passo a passo de recebimento de dados e tratamento desse cluster do feedback node no caso da bola tem uma diferença em relação ao robô, que é a VI CorrelateBalls:
![](Apagabola.png)
![](DeleteBall.png)
Essa parte do código elimina a bola que estava no cluster do feedback node, então quando chega na parte do lifetime no Kalman, não tem mais bola.
Confesso que não entendi direito o que essa VI CorrelateBalls faz.
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo Video_BallOutNoDecode.wmv Video_BallOutNoDecode.wmv adicionado
- Arquivo BallOutAntes.png BallOutAntes.png adicionado
Agora, se fizermos o mesmo teste na VI SSL Detection Frame (que fica na parte de decodificação da câmera) dá certo já que o código que elimina a bola acima continua recebendo ela.
Teste:
![](BallOutAntes.png)
Execução (coloquei 5s):
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Arquivo Video_LTBallRolando.wmv Video_LTBallRolando.wmv adicionado
O LifeTime da bola apenas a mantém na mesma posição, como segue:
Atualizado por Gabriel Borges da Conceição há mais de 5 anos
- Data prevista alterado de 31/08/2019 para 30/08/2019
- Início alterado de 16/08/2019 para 23/08/2019
Atualizado por Nicolas Oliveira há mais de 5 anos
Nesse teste do lifetime do robô, vc desligou a inserção do comando enviado pra ele no filtro? Pq se n isso pode ter influenciado e muito esse teste.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo ConfereSeUsaControle.png ConfereSeUsaControle.png adicionado
- Arquivo SemEntradaDeControle.png SemEntradaDeControle.png adicionado
Nicolas Oliveira escreveu:
Nesse teste do lifetime do robô, vc desligou a inserção do comando enviado pra ele no filtro? Pq se n isso pode ter influenciado e muito esse teste.
Não fiz isso, mas percebi que isso não fez diferença pois não estão sendo usadas as velocidades de controle no filtro:
![](ConfereSeUsaControle.png)
A parte do Kalman que usa as velocidades de controle está na foto acima, u_k representa isso. Repare que se our_robots for falso, o cálculo feito com isso não é utilizado e é passado uma matriz nula. Isso faz sentido pois não temos as velocidades de controle dos inimigos.
Mas, está sendo passado False para esse control tanto para o Kalman dos inimigos quanto dos nossos robôs:
![](SemEntradaDeControle.png)
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo Medição.png Medição.png adicionado
- Arquivo zk.png zk.png adicionado
- Arquivo AtualizaXkk.png AtualizaXkk.png adicionado
- Arquivo TransformarH.png TransformarH.png adicionado
- Arquivo TransformarReZk.png TransformarReZk.png adicionado
Como estamos discutindo, a ideia era parar de usar as velocidades de controle como input no Kalman (uso esse que é opcional e não é recomendado em nosso caso) e passar a usar a velocidade "medida", que seria calculada usando a derivada do LabVIEW (método de Tustin) a partir da posição ainda sem tratamento do Kalman.
Como disse acima, já percebi que o input de controle não está de fato sendo utilizado.
Em relação a entrar com as velocidades medidas, entendi o seguinte:
Contribuição da Medição:
![](Medição.png)
Cálculo de zk:
![](zk.png)
Sendo que xk é o vetor com x, vx, y, vy, orinet, vang.
Olhando o nosso código, percebi que zk tem apenas 3 coodenadas, ou seja, apenas posição e sem as velocidades.
Então """basta"""" introduzirmos vx, vy e vang em zk, fazendo uma matriz 6x1 ao invés de 3x1.
Mas isso tem outras implicações. A conta de fato é feita na seguinte VI:
![](AtualizaXkk.png)
Transformar zk em 6x1 implica em:
1. Transformar H (e consequentemente H') de 3x6 em 6x6. H e H' são as matrizes que saem da subVI da foto acima.
Isso deve ser feito em:
![](TransformarH.png)
2. Transformar R de 3x3 em 6x6. Isso deve ser feito em:
![](TransformarReZk.png)
É também na VI da última foto acima que devemos inserir em zk as coordenadas relativas às velocidades.
Então agora preciso entender o significado dos valores dos elementos dessas matrizes para poder aumentá-las e depois pensar em como testar essas mudanças.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Título alterado de Analisar e tratar casos de bola fora da visão para Modificar o filtro de Kalman
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Descrição atualizado(a) (diff)
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Em relação ao robô ganhar muita velocidade e ir para o infinito quando ele sai da visão, ainda não consegui identificar o que faz isso.
Consegui eliminar a hipótese de ser o controle, pois nada de controle está sendo usado no Kalman.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo nãoécontrole.mp4 adicionado
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo excluído (
nãoécontrole.mp4)
Atualizado por Nicolas Oliveira há aproximadamente 5 anos
A ideia de inserir a velocidade é esse caminho mesmo!
Agora sobre o teste, refaça ele colocando probe nas variáveis de interesse.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Nicolas Oliveira escreveu:
A ideia de inserir a velocidade é esse caminho mesmo!
Agora sobre o teste, refaça ele colocando probe nas variáveis de interesse.
O problema de usar probe é que abrir uma dessas VIs faz o código ficar muito lento e as informações deixam de ser atualizadas.
Depois pensei em comparar as velocidades que vão sair do "novo Kalman" com as estimativas geradas no Team And Side, as quais já sabemos que apresentam resultado condizente com a realidade.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo FValuesKalman.png FValuesKalman.png adicionado
- Arquivo HValuesKalman.png HValuesKalman.png adicionado
- Arquivo HValuesKalman2.png HValuesKalman2.png adicionado
- Arquivo MatrizeseEquações.png MatrizeseEquações.png adicionado
- Arquivo PValuesKalman.png PValuesKalman.png adicionado
- Arquivo PValuesKalman2.png PValuesKalman2.png adicionado
- Arquivo RKalman.png RKalman.png adicionado
- Arquivo RvaluesKalman.png RvaluesKalman.png adicionado
Tenho estudado como funcionam as matrizes e o significado de seus valores. Coletei os seguintes dados baseados no curso: https://www.udemy.com/autonomous-robots-kalman-filter/
Matrizes e equações:
![](MatrizeseEquações.png)
Matriz P:
![](PValuesKalman.png)
E
![](PValuesKalman2.png)
Matriz F:
![](FValuesKalman.png)
Matriz H:
![](HValuesKalman.png)
E
![](HValuesKalman2.png)
Matriz R:
![](RKalman.png)
E
![](RvaluesKalman.png)
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Meu foco não está sendo entender como funcionam ou são geradas as equações, já temos tudo pronto no nosso código. Estou focado apenas em entender o significado de cada matriz para poder aumenta-las e entrar com as velocidades medidas e ajustar seus valores de forma a melhorar o filtro.
O instrutor do vídeo mencionou que a parte mais importante é o ajuste dos valores das matrizes!
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Trabalhei com o Antonio ontem e mudamos algumas coisas conceituais em relação a como queremos informar as velocidades.
A princípio queríamos pegar a posição direto das câmeras, usar a derivada de tustin do labview e colocar na matriz z a posição e a velocidade.
Porém, não achamos em lugar nenhum um exemplo em que há input de velocidades no Z. O curso que fizemos só colocava posição no Z. Então ficamos em dúvida se pode colocar ou se isso seria um erro conceitual. Vamos procurar o Major Renault para tirar essas dúvidas.
Só encontramos input de velocidades na matriz u. Então decidimos colocar nela. Essa parte da matriz u já estava implementada em nosso código, mas estava disabled. Bom, tivemos que mudar um pouco as contas com o u. Reescrevemos essa equação de acordo com o um material que achamos na internet.
Aqui temos também uma dúvida conceitual. Teoricamente, u é a matriz das velocidades de controle e não de medidas. Mas no curso que fizemos, por exemplo, o simulador executava exatamente a velocidade de controle. Então acaba sendo a velocidade que o robô está executando, que difere da medida pelo fato de haver imprecisão nas medições, como ruído e etc.
Escolhemos, para a programar de fato, pegar as velocidades saídas do bloco de derivada do labview e colocar na matriz u e analisar os resultados.
Para começar a testar e ter uma noção mínima do efeito das nossas modificações, fizemos o seguinte:
Na parte da comunicação, sobrescrevemos as velocidades do controle por todas nulas exceto v_tang cte = 0,5m/s.
A ideia é colocar o robô com orientação 0 no grsim, daí o robô terá somente vx.
Porém, mandar 0,5 m/s para o grsim não significa que isso será de fato executado, pois depende do computador e etc. Então apenas medir o erro entre a medida do kalman e 0,5 não significa muita coisa, pois não sabemos qual velocidade de fato o robô está executando.
O que fizemos foi comparar esse erro da estimativa do kalman com a estimativa feita pelo Nicolas (pega a posição na saída do kalman e deriva). Essa estimativa feita pelo Nicolas foi testada na RoboCup para a bola comparando com o gráfico do programa do juiz e mostrou ser bastante razoável. Além disso, na competição de gol a gol do nosso processo seletivo 2019.2, uma das equipes montou seu goleiro com a estratégia de apenas se posicionar de acordo com a trajetória da bola e teve desempenho muito bom.
Ou seja, não é perfeito, mas mostrou ser uma estimativa consideravelmente boa.
Então, se nosso Kalman tiver valores parecidos com essa estimativa, já podemos concluir que ele melhorou em comparação ao que é hoje.
Como eu disse, esse simples teste é apenas para conseguirmos mensurar minimamente o efeito das nossas alterações. Posteriormente vamos elaborar uma rotina de testes que possa nos dar confiabilidade para refinarmos melhor o filtro.
Mas, depois percebemos que o efeito da matriz u tem relação com aceleração e desaceleração, não tem influência quando se trata de velocidade constante.
Ou seja, fazendo apenas essa alteração no código, não devíamos ter melhora significativa no Kalman. De fato, não tivemos.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
O nosso Kalman trabalha muito mal com variações de velocidade (o que acontece a todo instante com o robô em campo). Quando o robô atinge velocidade constante, passa um tempo e nosso filtro estima razoavelmente bem.
Bom, para isso temos que mexer nos valores das matrizes P e R. Essas matrizes têm elementos nulos exceto na diagonal principal.
A matriz P tem relação com a incerteza no seu atual estado. A matriz R tem relação com a incerteza medida que você está recebendo. Em ambas, se tiver total certeza, deve colocar valor 0 no elemento relativa ao que está analisando (x ou vx ou y...). Quanto maior a incerteza, maior deve ser o valor.
A matriz P tem efeito direto com a demora para reação quanto a mudança de velocidade.
A matriz R tem efeito direto na estimativa com velocidade constante.
Essas matrizes se correlacionam, mexer em uma causa influencia no efeito causado pela outra.
Só para ter noção da relação entre as ordens de grandeza dessas matrizes, nos exemplos do curso, ele usava 0,1 nos elementos de R e 1000 nos elementos de P.
No nosso código, os elementos de R estavam em torno de 0,1 e os de P, 1.
Então, fizemos o teste citado acima com os valores que estavam nessas matrizes e colocando 1000 na matriz P, a diferença na reação com a mudança de velocidade foi BRUTAL.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo MexendoNoP.mp4 MexendoNoP.mp4 adicionado
- Arquivo SemMexerNoP.mp4 SemMexerNoP.mp4 adicionado
Só para ter uma noção, filmamos a tela do computador com o celular mesmo (usar o aTube Catcher estava sugando muito o computador).
O primeiro vídeo é o kalman com o novo u mas sem mexer no P.
O segundo vídeo é quando colocamos 1000 nos elementos de P ao invés de 1.
Vê-se na tela o erro do kalman e o erro da estimativa do Nicolas (erro em relação ao 0,5m/s que mandamos e não ao que o robô de fato executa). A luz acende quando o erro do kalman é menor que o erro do outro método.
No primeiro vídeo vemos que o erro do kalman começa 0,5m/s e demora um bom tempo até abaixar. Quando abaixa, fica muito parecido com o erro do outro método (quando a luz começa a piscar).
No segundo vídeo vemos que a luz começa a piscar desde o início. O kalman demora bem menos para ir para a velocidade do robô. E isso foi apenas trocando os elementos de P de 1 pra 1000.
Primeiro Vídeo(P = I):
Segundo vídeo(P = 1000I):
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo R001P1000Somando.mp4 R001P1000Somando.mp4 adicionado
- Arquivo R01P100Somando.mp4 R01P100Somando.mp4 adicionado
- Arquivo R01P1000SemSomar.mp4 R01P1000SemSomar.mp4 adicionado
- Arquivo PSum.png PSum.png adicionado
Outra parte importante, além de escolher os valores iniciais da matriz P, é seu incremento a cada iteração.
![](PSum.png)
Nesse código, P estava com valor inicial de 1000 em sua diagonal principal. Esse incremento de 0.1 a cada iteração provoca uma diferença enorme.
Vou postar uns vídeos para mostrar essa diferença. Os seguintes vídeos são do simulador disponibilizados pelo curso:
1) RValues = 0.1, PVAlues = 1000, sem incremento em P:
2)RValues = 0.1, PValues = 1000, com incremento do P:
3) RValues = 0.01, PValues = 1000, com incremento de P:
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Pudemos perceber nesses vídeos que o incremento de P fez diferença brutal quanto à variação de velocidade. Depois, aumentar a confiança na medição (mudar R de 0.1 para 0.01, lembrando que menor é o número quanto maior for a confiança) também melhorou a reação à variação, porém a diferença foi mais suave e isso fez com que a imprecisão ficasse maior quando a velocidade era constante, provocando maior erro na medição de x também.
A implementação do filtro passa por esse tipo de análise, que é muito importante; e temos que chegar a valores que melhor nos sirvam. Nosso robô varia muito de velocidade em campo, então creio que o último caso seria melhor, mas para isso temos que montar uma rotina de testes e analisar.
No nosso código ainda não testei com esse incremento de P. Vou testar e postar o resultado.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo TesteKalmanSomandoP.png TesteKalmanSomandoP.png adicionado
- Arquivo TesteOldKalmam.png TesteOldKalmam.png adicionado
- Arquivo TesteKalman.png TesteKalman.png adicionado
Fiz o seguinte teste no nosso código:
Com um control, deixei a velocidade constante em 0,1m/s por um tempo, depois mudei abruptamente para 0,5m/s, deixei por um tempo e depois mudei abruptamente para 0,3m/s e deixei por um tempo, tudo isso sem controle. Plotei isso num gráfico, com a velocidade que estou mandando pra comunicação(branco), a velocidade medida pelo Kalman(verde) e a velocidade medida pela derivada da posição(vermelho):
![](TesteKalman.png)
A matriz estavam: R = 0,1, P = 100.
Podemos concluir que o robô muito provavelmente não estava executando a velocidade que mandamos e a estimativa gerada pelo Kalman varia consideravelmente.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Fiz o mesmo teste no Kalman antigo:
![](TesteOldKalmam.png)
Podemos ver que demora muito mais para reagir à mudança de velocidade (o que acontece muito com o robô em campo), mas quando se trata de velocidade constante, não varia muito.
Lembrando que o "Kalman novo" por enquanto só foi acrescido de u (não faz muita diferença no nosso teste) e P com valores de 100 ao invés de 1.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Mesmo Teste no "novo kalman" somando 0.1 em P.
![](TesteKalmanSomandoP.png)
Não fez a diferença que eu esperava, até porque mesmo sem esse incremento a reação à mudança de velocidade já estava boa.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Nosso próximo passo é colocar velocidades na matriz z e consequentemente mexer em outras matrizes e analisar o resultado.
Queremos ter isso pronto até terça e já testar no pirf.
As alterações que fizemos no kalman e o teste montado estão na branch kalman-upgrade.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo VInZP100.png VInZP100.png adicionado
- Arquivo VInZ.png VInZ.png adicionado
Coloquei as velocidades na matriz z e fiz as alterações necessárias nas matrizes H e R e fiz o mesmo teste, o resultado ficou muito melhor, a variação do kalman em velocidade constante ficou muito pequena agora:
Com P = 10:
![](VInZ.png)
Com P = 100:
![](VInZP100.png)
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Estamos usando o bloquinho de derivada do labview. Eu percebi que a entrada dt dele só pega o valor informado na primeira iteração. Estávamos informando o tempo entre uma iteração e outra, mas apenas o primeiro valor estava sendo utilizado. Ele dá uma opção de initialize que atualiza o dt, mas faz a derivada com um x e seu anterior (e não com dois intervalos de diferença), então não podemos inicializar toda hora pois o método de tustin não estaria mais sendo utilizado.
Minha ideia é colocar 1/fps e inicializar apenas se o fps variar mais de 5 ou 10 unidades.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Lembrando que a diferença entre colocar 1/fps e a diferença de tempo entre uma iteração e outra é que pra calcular o fps, fazemos uma média das 100 últimas iterações.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo AnalisandoReacaoAVariacao.png AnalisandoReacaoAVariacao.png adicionado
Coloquei escala no eixo x (tirei auto-scale) para conseguir analisar melhor a reação à variação de velocidade:
![](AnalisandoReacaoAVariacao.png)
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
- Arquivo LifeTimeDoRobôFuncionando.mp4 LifeTimeDoRobôFuncionando.mp4 adicionado
Consegui perceber qual era o erro no lifetime do Robô. Quando o robô fica não valid, não era feito todo o kalman pra ele, apenas xk = Fxk-1. Alguns do elementos da matriz F (essa matriz multiplica xk) eram dt (nós fazemos dt como sendo timestamp - previoustimestamp). Quando um robô fica não valid, seu previoustimestamp deixa de ser atualizado, daí esse dt crescia muito e na multiplicação das matrizes aumentava muito a posição do robô.
O que eu fiz pra testar foi que quando o valid for falso, utiliza 1/40 para o intervalo ao invés da diferença de timestamp. Depois vou colocar pra ser 1/fps.
Resultado (MANTÉM TRAJETÓRIA):
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Causei algum erro que faz com que quando eu desligue um robô da visão, o xk dele fique Nan quando eu ligo novamente.
Tenho que investigar
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Em resumo, as melhorias feitas até agora foram:
1. Colocamos Vx, Vy e Vang na matriz da medição z. Antes, essa matriz tinha apenas x, y, orientação
2. Matriz P com valor 100.
3. Adição de 0,1 nos elementos da diagonal principal de P a cada iteração.
O resultado está representado pelo último gráfico postado aqui na tarefa. Daqui pra frente, o que nos resta fazer é testar valores para as matrizes P e R que cheguem ao melhor filtro.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Percebi um erro conceitual em nossas mudanças. O que fizemos foi basicamente inserir na matriz Z as 3 velocidades e mexer no tamanho das outras matrizes de acordo com isso.
Conceitualmente, temos que gerar essas velocidades derivando a posição de input (chamado de sample no nosso código). Mas, por distração, acabamos gerando essa velocidade a partir da posição contida na matriz xk. Na parte do código que fizemos isso, estamos derivando a posição tratada pelo kalman com uma iteração de atraso ao invés de derivar a posição que a câmera está nos mandando.
O que fizemos acabou sendo quase a mesma coisa que usar para velocidade de input a última velocidade contida em xk.
Temos que trocar isso para colocar no Z as velocidades derivadas a partir de pose do Z e analisar o efeito da mudança.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Em relação aos checklists resolvidos:
1.Corrigir robô não voltar à visão:
O problema é que quando o robô saía da visão e ficava sendo mantido pelo lifetime, sua matriz P começava a crescer até que chegava a +inf. Lembrando que quando o robô está fora da visão, o Kalman faz apenas x_k+1 = F . x_k e nada faz com a matriz P, apenas mantém o valor.
Não consegui identificar o que faz o P crescer assim, mas nessa situação (case do Use Observation False), passo a matriz identidade para o P, daí quando o robô volta à visão, sua matriz P está igual à da primeira iteração do código, I6x6.
2.Fazer o input de velocidades em Z derivando a partir de pose da sample e não de xk:
Feito e não houve mudança significativa visível.
3.Consertar o fato de o time amarelo estar influenciando no kalman do time azul (provavelmente deve ser apenas clonar alguma VI que desclonamos sem querer):
Realmente bastava clonar alguma VIs.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Em relação ao checklist "Consertar lifetime da bola", já descobrimos todos os problemas e resolvemos, mas isso foi feito na branch NewBallVision, a qual está sendo usada pra tratar os casos de aparecerem outras bolas em campo e etc.
Lembrando que tudo desta tarefa tem sido feito na branch KalmanZ e está tudo atualizado no git.
Atualizado por Gabriel Borges da Conceição há aproximadamente 5 anos
Gabriel Borges da Conceição escreveu:
Coloquei escala no eixo x (tirei auto-scale) para conseguir analisar melhor a reação à variação de velocidade:
![](AnalisandoReacaoAVariacao.png)
Ao montarmos este gráfico e colocar aqui na tarefa, mencionei que o que faltava para ter uma noção melhor da precisão do kalman era conseguir saber qual velocidade o robô estava de fato executando, pois o que mandamos para o grsim não é executado na risca devido a processamento e etc.
Uma coisa simples que fiz foi mandar o robô andar a 0,5m/s e contar em quanto tempo ele percorreu metade do campo pra saber a velocidade que ele executou, ficou em torno de 0,3m/s, o kalman retornou valores em torno de 0,29m/s.
Atualizado por Antonio de Souza Gomes Pereira há aproximadamente 5 anos
- Arquivo calcdt_principal.png calcdt_principal.png adicionado
- Arquivo infinito.png infinito.png adicionado
- Arquivo kalman B.png kalman B.png adicionado
- Arquivo limitacaofps.png limitacaofps.png adicionado
- Arquivo mudancas no dt.png mudancas no dt.png adicionado
- Arquivo ballfps.png ballfps.png adicionado
- Arquivo ballsfps.png ballsfps.png adicionado
- Arquivo ballZ.png ballZ.png adicionado
- Arquivo calcdt.png calcdt.png adicionado
- Arquivo WhatsApp Video 2019-09-29 at 00.58.27.mp4 WhatsApp Video 2019-09-29 at 00.58.27.mp4 adicionado
- Velocidades no Z da bola
![](ballZ.png)
Foram colocadas as velocidades no Z da bola, calculados a partir do sample
![](kalman B.png)
Além disso, coloquei a parte que calculava a velocidade de controle em uma vi separada(tanto para a bola quanto para o robô). NÃO TEM UM TETO DE ACELERAÇÃO PARA A BOLA AINDA COMO TEM PARA O ROBÔ.
- 1/FPS na derivada do robô
![](calcdt_principal.png)
Além disso, coloquei uma nova vi (já ta clonada) para calcular o dt que entra nas derivadas.
![](calcdt.png)
Basicamente o que ela faz é passar 1/fps ao invés de 1/40 como estava antes. Há uma tolerância de 5fps para mudar esse valor que é passado e o bool é para o initializer da derivada. No caso do robô, não ficou muito diferente da forma que estava, o que aconteceu foi apenas um deslocamento no gráfico para cima, o que já era previsto se o fps for maior que 40(no meu pc estava mais ou menos 50fps), além disso, a estimativa ficou muito sensível a efeitos externos.
![](mudancas no dt.png)
O dt que entra é calculado na vi e o bool entra na initializer da derivada
![](limitacaofps.png)
Eu apenas minimizei uma aba aberta no meu pc para ocorrer essa variação (pode ser que a tolerância esteja muito baixa)
![](infinito.png)
O problema de explodir para o infinito quando o robô é desligado está ocorrendo devido a velocidade de controle, assim q o valid fica falso.
- Resultados na bola
![](ballfps.png)
Para o caso do cálculo de dt usando o fps, a estimativa ficou dessa forma, eu apenas botei o robô para dar vários toquinhos na bola.
Vídeo que eu gravei do que está acontecendo mais ou menos(apesar de não saber a real velocidade da bola para ter comparação)
![](ballsfps.png)
Para o caso de dt estar setado como 1/40 aconteceu o esperado e as duas ficaram iguais.
OBS: TA TUDO NA BRANCH KALMAN-FIX
Atualizado por Gabriel Borges da Conceição há quase 5 anos
- Tarefa mãe ajustado para #1230
Atualizado por Gabriel Borges da Conceição há mais de 4 anos
- Situação alterado de Em andamento para Fechada