迭代平滑位置的变化

时间:2016-05-06 13:55:33

标签: c# algorithm physics velocity

我有一个在运动中有噪音的实体。该实体直接面向目标实体,我正在尝试估计实现目标所需的时间。

我试图通过查看其位置历史来估计实体的速度。

我有一个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 :(得分:1)

迭代。保持两个具有不同衰减率的指数衰减平均值,然后通过比较它们进行投射。

这个想法是这样的。如果0 < k < 1则可以通过以下方式计算衰减平均值:

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

你应该做自己的数值实验,以确保我没有犯一个愚蠢的错误。但是如果你的路径是线性的,那么这个平均值会收敛到与上次1/k观测值的平均值非常相似的值,这代表了你对1/(2*k*T)秒之前的最佳猜测。因此,如果您有其中的2个,那么您将有2个平滑的测量结果。从那些你可以投射平均速度,并从那个位置,你可以估计到达时间。

您必须使用它来找到适用于您的数据集的两个常量。