c# - 迭代平滑位置变化

标签 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 秒的间隔进入。

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

最佳答案

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

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

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

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

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

关于c# - 迭代平滑位置变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074242/

相关文章:

c# - 使用 C#.NET 生成 PDF

java - 数组中的不同值

c++ - 计算二维惯性张量

java - 有人可以解释如何实验重力值吗?

c# - 在 GridView 中,我的 Roe 未更新或删除

c# using 语句放置

c# - 锁语句的内存屏障

algorithm - 如果没有垃圾收集,算法和/或数据结构的一些例子很难或不可能正确实现?

python - 具有上限/下限的 Numpy 自定义 Cumsum 函数?

javascript - 游戏编程: remove movement lag (jumping)