被修改
我想在这个问题上作出序言,我理解噪音/错误对此的影响。
我在线性加速度的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?
我的静止阅读结果是指数曲线。只是想确保我的算法是正确的,这只是副作用的结果。
答案 0 :(得分:0)
这对我来说不合适。您有测量prev.X/Y/Z
和curr.X/Y/Z
,因此您需要获得更新位置或位移所需的所有信息,而无需计算速度。
如果你真的想要速度,那么你正在做的事情是不正确的。速度不是你所拥有的添加剂。从瞬时位置prev.X/Y/Z
和curr.X/Y/Z
,您可以通过以下步骤获得相应的速度:
vxt = (curr.X - prev.X) / dt;
vyt = (curr.Y - prev.Y) / dt;
vzt = (curr.Z - prev.Z) / dt;
其中X/Y/Z
表示相应的方向,是伪代码。
如果您可以做得更好并且考虑到测量噪声,则会在位置数据上加入卡尔曼滤波器和平滑器。