Ich arbeite derzeit an einem Projekt für die Schule, bei dem ich einen erweiterten Kalman-Filter für einen Punktroboter mit einem Laserscanner implementieren muss. Der Roboter kann sich mit einem Wenderadius von 0 Grad drehen und vorwärts fahren. Alle Bewegungen sind stückweise linear (fahren, drehen, fahren).
Der von uns verwendete Simulator unterstützt keine Beschleunigung, alle Bewegungen erfolgen sofort.
Wir haben auch eine bekannte Karte (PNG-Bild), in der wir lokalisieren müssen. Wir können Strahlspuren im Bild verfolgen, um Laserscans zu simulieren.
Mein Partner und ich sind wenig verwirrt über die Bewegungs- und Sensormodelle, die wir verwenden müssen.
Bisher modellieren wir den Zustand als Vektor .
Wir verwenden die Aktualisierungsgleichungen wie folgt
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;
}
Wir dachten, wir hätten alles zum Laufen gebracht, bis wir bemerkten, dass wir die Initialisierung vergessen hatten P
und dass es Null war, was bedeutete, dass keine Korrektur stattfand. Anscheinend war unsere Ausbreitung sehr genau, da wir noch kein Rauschen in das System eingeführt haben.
Für das Bewegungsmodell verwenden wir die folgende Matrix für F:
Da es der Jacobian unserer Update-Formeln ist. Ist das richtig?
Das andere Problem war, wie man P initialisiert. Wir haben 1.10.100 ausprobiert und alle platzieren den Roboter außerhalb der Karte bei (-90, -70), wenn die Karte nur 50x50 ist.
Den Code für unser Projekt finden Sie hier: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Jeder Rat wird sehr geschätzt.
BEARBEITEN:
Zu diesem Zeitpunkt habe ich den Filter dazu gebracht, sich mit Grundbewegungsgeräuschen zu stabilisieren, aber ohne tatsächliche Bewegung. Sobald sich der Roboter zu bewegen beginnt, divergiert der Filter ziemlich schnell und verlässt die Karte.