从线性加速度到位置进行积分

时间:2014-04-07 17:47:18

标签: c# math accelerometer physics calculus

被修改

我想在这个问题上作出序言,我理解噪音/错误对此的影响。

我在线性加速度的x,y,z坐标中有一堆数据以及时间。

我希望通过双积分使用这些数据随时间移动距离。这看起来是正确的方法吗?

    private class SampleReading
    {
        public float X { get; set; }
        public float Y { get; set; }
        public float Z { get; set; }
        public long TimeTick { get; set; }
    }


    private static void ProcessSamples(IList<SampleReading> samples)
    {
        float dx = 0;
        float vx = 0;
        float dy = 0; 
        float vy = 0;
        float dz = 0;
        float vz = 0;

        var graphSb = new StringBuilder();

        for (var i = 1; i < samples.Count; i++)
        {
            var curr = samples[i];
            var prev = samples[i - 1];

            var dt = curr.TimeTick - prev.TimeTick;
            if (dt == 0) continue;

            vx += (prev.X + curr.X) / 2.0f * dt;
            dx += vx * dt;

            vy += (prev.Y + curr.Y) / 2.0f * dt;
            dy += vy * dt;

            vz += (prev.Z + curr.Z) / 2.0f * dt;
            dz += vz * dt;

            var distance = Math.Sqrt(dx * dx + dy * dy + dz * dz);
            graphSb.AppendLine(curr.TimeTick + ", " + distance);
        }

        var foo = graphSb.ToString();
    }

我已经阅读了这篇文章的所有支持材料:How can I find distance traveled with a gyroscope and accelerometer?

我的静止阅读结果是指数曲线。只是想确保我的算法是正确的,这只是副作用的结果。

1 个答案:

答案 0 :(得分:0)

这对我来说不合适。您有测量prev.X/Y/Zcurr.X/Y/Z,因此您需要获得更新位置或位移所需的所有信息,而无需计算速度。

如果你真的想要速度,那么你正在做的事情是不正确的。速度不是你所拥有的添加剂。从瞬时位置prev.X/Y/Zcurr.X/Y/Z,您可以通过以下步骤获得相应的速度:

vxt = (curr.X - prev.X) / dt;
vyt = (curr.Y - prev.Y) / dt;
vzt = (curr.Z - prev.Z) / dt;

其中X/Y/Z表示相应的方向,是伪代码。

如果您可以做得更好并且考虑到测量噪声,则会在位置数据上加入卡尔曼滤波器和平滑器。