繁体   English   中英

迭代平滑位置变化

[英]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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM