2016-05-06 1 views
1

動きにノイズがあるエンティティがあります。エンティティはターゲットエンティティに向かってまっすぐ進んでおり、目標到達までにどれくらいの時間がかかるかを推定しようとしています。位置の変化を繰り返しスムージングする

私はエンティティの速度をその位置履歴を見て推定しようとしています。

私はHistory<Tuple<double,Vector2D>を持っています。これは最後のN個のポジションを持ち、何時にそのポジションを獲得しましたか?位置は一般に1秒間隔で非常に一貫して来る。

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

それらは1秒で来るのでhは常に1:

私は、いくつかのホームXTK [n]は[n]は秒前に成分(xまたはy)である式を行った試み間隔。

4桁の助けがありましたが、以前の位置からの速度を推定するためのより良い、より一般的な方法があるかどうかを知りたいと思いますか?反復的なことがあるので、よりスムーズなスムージングが必要な場合は、カウンタを増やすだけでよく、これはおそらく歴史の多くを使用し、スムーズさのために応答性をトレードオフします。問題は、ターゲットが適切な方向に向いている場合には、非常に不安定で、論理的には、十分なサンプルがあれば、そこに到達するまでの時間をかなり正確に推定することができます。

答えて

1

反復。異なる減衰率で2つの指数関数的減衰平均を保ち、それらを比較することによって投影する。

アイデアはこれです。 0 < k < 1はその後、減衰平均はで計算できる場合は、次の

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

あなたは私が愚かなミスをしなかったことを確認するため、独自の数値実験を行う必要があります。しかし、パスが線形である場合、この平均値は最後の1/kの観測値の平均値のようなものに収束します。これは、1/(2*k*T)秒前の位置を推測しています。だから、もしあなたがこれらの2つを持っているなら、あなたは2つの測定値を平滑化して、どこにあったはずだったのでしょうか。それらからあなたは平均速度を投影することができ、どちらの位置でも到着時間を推定することができます。

あなたのデータセットで動作する2つの定数を見つけるには、それを試してみる必要があります。

関連する問題