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.