2016-05-06 11 views
1

Ich habe eine Entität, die Rauschen in ihrer Bewegung hat. Das Unternehmen geht direkt auf eine Zieleinheit zu und ich versuche abzuschätzen, wie lange es dauern wird, bis es sein Ziel erreicht.Iterative Glättung von Änderungen in der Position

Ich versuche die Geschwindigkeit der Entität zu schätzen, indem ich auf ihre Positionshistorie schaue.

Ich habe eine History<Tuple<double,Vector2D>, die die letzten N Positionen hat und zu welcher Zeit ich diese Position bekam. Die Positionen sind im Allgemeinen in Intervallen von 1 Sekunde sehr konstant.

habe ich versucht, ein paar Haus Formeln wo XTk [n] der Komponente (x oder y) auf [n] Sekunden:

 private double GetFirstOrderVelocity(double xtk, double xtk1, double h) 
     { 
      return (xtk - xtk1)/h; 
     } 

     private double GetSecondOrderVelocity(double xtk, double xtk2, double h) 
     { 
      return (xtk - xtk2)/(h*2); 
     } 

     private double GetThirdOrderVelocity(double xtk, double xtk1, double xtk2, double xtk3, double h) 
     { 
      return (xtk + xtk1 - xtk2 - xtk3)/(h * 4); 
     } 

     private double GetFourthOrderVelocity(double xtk, double xtk1, double xtk3, double xtk4, double h) 
     { 
      return (xtk + (2 * xtk1) - (2 * xtk3) - xtk4)/(h * 8); 
     } 

Wo h ist immer 1, da sie bei 1 Sekunde kommen in Intervalle.

Die vierte Ordnung half, aber ich würde gerne wissen, ob es eine bessere und allgemeinere Möglichkeit gibt, Geschwindigkeit von früheren Positionen zu schätzen? Etwas, das iterativ ist, so dass ich, wenn ich eine stärkere Glättung benötige, nur einen Zähler erhöhen muss, der wahrscheinlich mehr von der Historie verwenden würde und die Reaktionsfähigkeit für die Glätte abwägen würde. Das Problem ist gerade jetzt, die Zeit für die Positionierung ist sehr nervös und logisch, wenn etwas für ein Ziel richtig ist, können wir mit genügend Stichproben ziemlich genau abschätzen, wie lange es bis dahin geht.

Antwort

1

Iterativ. Halten Sie zwei exponentiell abfallende Mittelwerte mit unterschiedlichen Abklingraten, und projizieren Sie sie dann, indem Sie sie vergleichen.

Die Idee ist dies. Wenn 0 < k < 1 dann kann eine abklingende Durchschnitt von berechnet werden:

average = (1-k)*prev_average + k*observation 

sollten Sie Ihre eigenen numerischen Experimente tun um sicherzustellen, dass ich nicht einen dummen Fehler gemacht hat. Aber wenn Ihr Pfad linear ist, konvergiert dieser Durchschnittswert zu etwas, das dem Durchschnitt der letzten 1/k Beobachtungen entspricht, was Ihre beste Schätzung dafür darstellt, wo es 1/(2*k*T) Sekunden war. Also, wenn Sie 2 davon haben, dann haben Sie 2 geglättete Messungen wo es hätte sein sollen. Von diesen können Sie die durchschnittliche Geschwindigkeit projizieren, und von da aus können Sie die Ankunftszeit schätzen. 0

Sie müssen damit herumspielen, um zwei Konstanten zu finden, die für Ihren Datensatz funktionieren.