迭代平滑位置变化

Iteratively Smoothing Changes in Position

我有一个实体,它的运动有噪音。该实体正直奔目标实体,我正在尝试估计它需要多长时间才能达到目标。

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

我有一个 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 秒的间隔进入。

四阶有帮助,但我想知道是否有更好更通用的方法来估计先前位置的速度?迭代的东西,所以如果我需要更强的平滑,我只需要增加一个计数器,这可能会使用更多的历史记录,并会牺牲响应能力来换取平滑度。现在的问题是定位时间非常不稳定,从逻辑上讲,如果某物正朝着目标前进,有了足够的样本,我们就可以开始相当准确地估计它到达那里需要多长时间。

迭代。保留两个具有不同衰减率的指数衰减平均值,然后通过比较它们来预测。

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

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

你应该做你自己的数值实验以确保我没有犯愚蠢的错误。但是,如果您的路径是线性的,则此平均值将收敛到很像最后 1/k 观察值的平均值,这代表了您对 1/(2*k*T) 秒前位置的最佳猜测。因此,如果您有其中 2 个,那么您将对它应该在的位置进行 2 个平滑测量。从这些你可以预测平均速度,从任何一个位置你都可以估计到达时间。0

您将不得不尝试使用它来找到两个适用于您的数据集的常量。