2

我正在为 android 制作一个指南针,我可以让它工作,但它有一个缺陷。即使设备没有移动,罗盘上的读数也会持续变化几度。我知道这是由于磁失真弄乱了传感器,但我怎样才能让我的应用程序在用户移动时仍然响应但在用户静止时没有显示这么多变化。那么如何才能让指南针看起来更稳定呢?

4

3 回答 3

2

你必须平滑信号。如何显示最后 N 个值的平均值而不是显示原始最后一个值?

于 2013-03-21T03:47:21.413 回答
1

如果要编写指南针,则需要对加速度和磁场进行低通滤波

这是一个低通滤波器的例子。不是很优雅,只是为了展示原理:

float filteredValue;

void lowPassFilter(float rawValue) {

    final float alpha = 0.8f;
    float filteredValue = alpha * filteredValue + (1.0f - alpha) * rawValue;

    return filteredValue;
}

请注意,filteredValue在每次调用后都会被记住(就像一个成员变量)。

另一方面,rawValue是来自传感器事件的值,例如event.values[0]

请注意,每个“新鲜”的新rawValue仅影响 20% 的过滤值(由alpha给出)。这以延迟为代价为读数带来了“稳定性”。

于 2013-03-25T21:06:54.960 回答
1

您是否尝试过实现低通滤波器?http://blog.thomnichols.org/2011/08/smoothing-sensor-data-with-a-low-pass-filter

于 2013-03-21T04:18:03.033 回答