我有一个运动中有噪音的实体。该实体正朝着目标实体前进,我正在尝试估计达到目标所需的时间。
我正在尝试通过查看实体的位置历史来估计实体的速度。
我有一个History<Tuple<double,Vector2D>
前N个职位,我什么时候得到那个职位。这些位置通常以1秒的间隔非常一致地进入。
我在[n]秒前尝试了一些自制公式,其中xtk [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秒的时间间隔。
第四阶有帮助,但是我想知道是否有更好,更通用的方法来根据先前位置估算速度?某些事情是迭代的,因此,如果我需要更强的平滑度,我只需要增加一个计数器,这可能会使用更多的历史记录,并且会在响应性与平滑度之间进行权衡。现在的问题是,定位的时间非常短,从逻辑上来说,如果某物正朝着目标前进,有了足够的样本,我们可以开始相当准确地估计到达目标的时间。
迭代的。保留两个具有不同衰减率的指数衰减平均值,然后通过比较它们进行投影。
想法是这样的。如果这样,0 < k < 1
则可以通过以下方式计算衰减平均值:
average = (1-k)*prev_average + k*observation
您应该进行自己的数值实验,以确保我没有犯一个愚蠢的错误。但是,如果您的路径是线性的,则该平均值将收敛到与上次1/k
观测值的平均值类似的水平,这代表您对1/(2*k*T)
秒前位置的最佳猜测。因此,如果您拥有其中的2个,那么您将有2个平滑的测量值应该在哪里。从这些值中,您可以预测平均速度,从任何位置中,您都可以估计到达时间。0
您将不得不使用它来找到两个对您的数据集有效的常量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句