Attualmente sto lavorando a un progetto per la scuola in cui devo implementare un filtro Kalman esteso per un robot punto con uno scanner laser. Il robot può ruotare con raggio di sterzata di 0 gradi e avanzare. Tutti i movimenti sono lineari a tratti (guida, ruota, guida).
Il simulatore che stiamo utilizzando non supporta l'accelerazione, tutto il movimento è istantaneo.
Abbiamo anche una mappa nota (immagine png) in cui dobbiamo localizzarci. Possiamo tracciare i raggi nell'immagine per simulare le scansioni laser.
Il mio compagno e io siamo un po 'confusi per quanto riguarda i modelli di movimento e sensore che dovremo usare.
Finora stiamo modellando lo stato come vettore .
Stiamo usando le equazioni di aggiornamento come segue
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;
}
Pensavamo di avere tutto funzionato fino a quando non ci siamo resi conto che ci siamo dimenticati di inizializzare P
e che era zero, il che significa che non si stava verificando alcuna correzione. Apparentemente la nostra propagazione è stata molto accurata poiché non abbiamo ancora introdotto rumore nel sistema.
Per il modello di movimento stiamo usando la seguente matrice per F:
Essendo il giacobino delle nostre formule di aggiornamento. È corretto?
L'altro problema di come inizializzare P. Abbiamo provato 1,10,100 e tutti posizionano il robot fuori dalla mappa a (-90, -70) quando la mappa è solo 50x50.
Il codice per il nostro progetto è disponibile qui: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Ogni consiglio è molto apprezzato.
MODIFICARE:
A questo punto ho ottenuto il filtro per stabilizzarsi con un rumore di movimento di base ma nessun movimento reale. Non appena il robot inizia a muoversi, il filtro diverge abbastanza rapidamente ed esce dalla mappa.