集成到从线性加速度到位置

本文关键字:位置 加速度 集成 线性 | 更新日期: 2023-09-27 17:57:06

已编辑

我想先提出这个问题,我了解噪音/错误对此的影响。

我有一堆线性加速度和时间的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();
    }

我已经阅读了这篇文章以及所有支持材料:如何找到陀螺仪和加速度计的行驶距离?

我的稳态读数结果是一条指数曲线。只是想确保我的算法是正确的,这只是副作用的结果。

集成到从线性加速度到位置

这对我来说看起来不对。您拥有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表示相应的方向,是伪代码。

您可以使其更好并考虑测量噪声的地方是在位置数据上加入卡尔曼滤波器和平滑器。