来自X,Y位置流C ++的加速度和速度

时间:2015-03-02 01:06:32

标签: c++ boost stream velocity acceleration

我有一个(x,y)数据流,我想从中确定速度和加速度。这些数据非常典型,可以说是代表一辆汽车行驶。

新的数据点每2ms出现一次,我宁愿不积累/存储不必要的值,所以我想使用boost::accumulator

有没有更简单的方法来处理这类任务?或者其他已经存在已经存在的库?或者我的想法是正确的。还不确定我将使用哪些标签,但我喜欢容器为给定属性保留更新值并且不存储旧位置数据的想法。

另一个想法是使用循环缓冲区(例如大小200)并基于最后50个值和速度计算加速度,基于缓冲区中的所有值。但是,如果缓冲区存储原始位置数据,则每次需要循环遍历所有元素以计算加速度和速度。这可以通过改为保持某种滚动加速度和速度值来改进,该值通过从结束元素中移除值并将新元素的值添加到插入(重量为1 /缓冲区中的元素)来重新计算。然而,这对我来说似乎是某种提升滚动加权累加器。

1 个答案:

答案 0 :(得分:0)

您可能希望对数据应用某种Kalman过滤器。旧数据需要存在以帮助减少噪声的影响,需要新的数据,并加权更高,以便答案对最新信息敏感。

一种相当简单的位置方法,我们称之为 X ,其中每个新样本 x 是:

X = (1-w) * X + w * x

随着每个新值的进入。权重 w 在哪里调整您对新信息与旧信息的敏感程度。 w = 1 意味着你不关心历史, w = 0 意味着你根本不关心新信息(显然意味着你永远不会存储任何东西)。

可以通过计算连续点之间的差异并将该差值除以时间间隔来计算瞬时速度。这可以依次用卡尔曼滤波器进行滤波。

加速度是顺序速度的差异,再次除以时间间隔。您也可以过滤这些内容。

划分的差异对噪音比对位置更敏感。例如,如果您正在监视其位置的对象停止,您将继续获得位置测量。连续测量的速度矢量将指向随机方向。

Boost累加器似乎没有做你想做的事。