Atualmente, estou trabalhando em um projeto para a escola em que preciso implementar um filtro Kalman estendido para um robô pontual com um scanner a laser. O robô pode girar com raio de giro de 0 grau e avançar. Todos os movimentos são lineares por partes (acionar, girar, acionar).
O simulador que estamos usando não suporta aceleração, todo movimento é instantâneo.
Também temos um mapa conhecido (imagem png) em que precisamos localizar. Podemos traçar um raio na imagem para simular digitalizações a laser.
Meu parceiro e eu estamos um pouco confusos quanto aos modelos de movimento e sensor que precisaremos usar.
Até agora, estamos modelando o estado como um vetor .
Estamos usando as equações de atualização da seguinte maneira
void kalman::predict(const nav_msgs::Odometry msg){
this->X[0] += linear * dt * cos( X[2] ); //x
this->X[1] += linear * dt * sin( X[2] ); //y
this->X[2] += angular * dt; //theta
this->F(0,2) = -linear * dt * sin( X[2] ); //t+1 ?
this->F(1,2) = linear * dt * cos( X[2] ); //t+1 ?
P = F * P * F.t() + Q;
this->linear = msg.twist.twist.linear.x;
this->angular = msg.twist.twist.angular.z;
return;
}
Pensamos que tínhamos tudo funcionando até percebermos que esquecemos de inicializar Pe que era zero, significando que não havia nenhuma correção acontecendo. Aparentemente, nossa propagação foi muito precisa, pois ainda não introduzimos ruído no sistema.
Para o modelo de movimento, estamos usando a seguinte matriz para F:
Como é o jacobiano das nossas fórmulas de atualização. Isso está correto?
Para o modelo de sensor, estamos aproximando o jacobiano (H) tomando diferenças finitas das posições , e dos robôs e traçado de raios no mapa. Conversamos com a AT que disse que isso iria funcionar, mas ainda não tenho certeza. Nosso professor está fora, então não podemos perguntar a ele infelizmente. Estamos usando 3 medições a laser por etapa de correção, portanto H é 3x3.
A outra questão foi sobre como inicializar P. Tentamos 1.10.100 e todos colocam o robô fora do mapa em (-90, -70) quando o mapa tem apenas 50x50.
O código para nosso projeto pode ser encontrado aqui: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Qualquer conselho é muito apreciado.
EDITAR:
Neste ponto, consegui estabilizar o filtro com ruído de movimento básico, mas sem movimento real. Assim que o robô começa a se mover, o filtro diverge rapidamente e sai do mapa.