Je travaille actuellement sur un projet pour l'école où j'ai besoin d'implémenter un filtre de Kalman étendu pour un robot ponctuel avec un scanner laser. Le robot peut tourner avec un rayon de braquage de 0 degré et avancer. Tous les mouvements sont linéaires par morceaux (entraînement, rotation, entraînement).
Le simulateur que nous utilisons ne prend pas en charge l'accélération, tout mouvement est instantané.
Nous avons également une carte connue (image png) que nous devons localiser. Nous pouvons ray tracer dans l'image afin de simuler des balayages laser.
Mon partenaire et moi sommes peu confus quant aux modèles de mouvement et de capteur que nous devrons utiliser.
Jusqu'à présent, nous modélisons l'état comme un vecteur .
Nous utilisons les équations de mise à jour comme suit
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;
}
Nous pensions que tout fonctionnait jusqu'à ce que nous remarquions que nous avons oublié d'initialiser P
et que c'était zéro, ce qui signifie qu'aucune correction ne s'est produite. Apparemment, notre propagation était très précise car nous n'avons pas encore introduit de bruit dans le système.
Pour le modèle de mouvement, nous utilisons la matrice suivante pour F:
Comme son jacobien de nos formules de mise à jour. Est-ce correct?
L'autre problème était d'avoir comment initialiser P. Nous avons essayé 1,10,100 et ils placent tous le robot en dehors de la carte à (-90, -70) lorsque la carte n'est que de 50x50.
Le code de notre projet se trouve ici: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Tout conseil est grandement appréciée.
ÉDITER:
À ce stade, le filtre s'est stabilisé avec un bruit de mouvement de base, mais aucun mouvement réel. Dès que le robot commence à bouger, le filtre diverge assez rapidement et quitte la carte.