2016-05-06 33 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

你将不得不玩弄它找到两个常量适用于您的数据集。