2016-05-06 62 views
1

我有一個在運動中有噪音的實體。該實體正朝着目標實體前進,我試圖估計它需要多長時間才能實現目標。迭代平滑位置變化

我想通過查看其位置歷史來估計實體的速度。

我有一個History<Tuple<double,Vector2D>它有最後N個位置,我什麼時候得到那個位置。這些職位通常以1秒的間隔非常一致地出現。

我嘗試了一些自制的公式,其中XTK [N]是[N]秒前組分(X或Y):

 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); 
     } 

哪裏h始終爲1,因爲他們以1秒進來間隔。

第四順序有幫助,但我想知道是否有更好更一般的方法來估計以前職位的速度?有些東西是迭代的,所以如果我需要更強的平滑,我只需要增加一個計數器,它可能會使用更多的歷史記錄,並會平滑響應性。現在的問題是,如果某個目標正在朝某個方向發展,那麼定位的時間非常緊張,並且在邏輯上,如果有足夠的樣本,我們就可以開始相當準確地估計到目標爲止的時間。

回答

1

迭代。保持兩個不同衰減率的指數衰減平均值,然後通過比較它們來計算。

想法是這樣的。如果0 < k < 1那麼平均衰減可以通過計算:

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

你應該做你自己的數值實驗,以確保我沒有做一個愚蠢的錯誤。但是如果你的路徑是線性的,那麼這個平均值將會收斂到最後一個觀測值的平均值,這代表了你對1/(2*k*T)秒之前的最佳猜測。所以如果你有2個這樣的話,那麼你會有2個平滑的測量值。從那些你可以投射平均速度,並從那兩個位置,你可以估計到達時間。0

你將不得不玩弄它找到兩個常量適用於您的數據集。