如何提高加速度计和指南针传感器的准确性?

7
我正在创建一个增强现实应用程序,当手机对准一个已存储在手机上的 Point of Interest(GPS位置)时,简单地可视化一个 TextView。TextView 会被绘制在屏幕上 Point of Interest 位置。
它可以正常工作,唯一的问题是指南针和加速度计非常“变幻莫测”,由于传感器的不准确性,TextView 不断地上下左右移动。
是否有解决这个问题的方法?

https://dev59.com/z1PTa4cB1Zd3GeqPkIzJ - Farhan
4个回答

8
我们的问题是相同的。当我创建简单的增强现实项目时,我也遇到了相同的问题。解决方法是使用指数平滑或移动平均函数。我推荐使用指数平滑,因为它只需要存储一个先前的值。下面提供了示例实现:
private float[] exponentialSmoothing( float[] input, float[] output, float alpha ) {
        if ( output == null ) 
            return input;
        for ( int i=0; i<input.length; i++ ) {
             output[i] = output[i] + alpha * (input[i] - output[i]);
        }
        return output;
}

Alpha是平滑因子(0 <= alpha <= 1)。如果您将alpha设置为1,则输出与输入相同(根本没有平滑)。如果您将alpha设置为0,则输出永远不会改变。为了消除噪音,您可以简单地平滑加速度计和磁力计值。
在我的情况下,我使用加速度计alpha值=0.2和磁力计alpha值=0.5。物体将更加稳定,移动也非常流畅。

我可以问一下,这个input[i]是加速度计的x、y、z值吗? - Dawood Awan
1
@DawoodAwan 不,它们是“onSensorChanged”事件的“event.values”参数。 - wanam

3

如果你想更进一步,可以查看关于低通滤波器的相关资料,以应用于方向数据或传感器融合。

祝你的应用好运。

JQCorreia


你好,请问你能再解释一下吗?我不太明白你在说什么,但听起来很不错。 - NullPointerException
看看我在这里的答案https://dev59.com/KGw05IYBdhLWcg3w9mrd#6912977以及里面的链接。 - Kay

1

我用一个简单的技巧解决了这个问题。这会稍微延迟你的结果,但它们肯定可以避免指南针和加速度计的不准确性。

创建最近 N 个值的历史记录(将值保存到数组中,增加索引,当达到 N 时再从零开始)。然后你只需使用存储值的算术平均值即可。


嗨,谢谢您的提议,我会尝试的。顺便问一下,为了比较您的代码,您是否有执行该操作的代码示例? - NullPointerException
我很久以前为iPhone做过这个,所以不幸的是没有;-) 但它非常简单。你只需要建立数组的总和,除以N,并使用这个值代替你从指南针或加速度计得到的直接值。 - Knickedi
谢谢,我测试了一下,它能够有所作用,但TextView 仍然在各个方向上移动了几个像素 :/ - NullPointerException
你永远不会找到完美的值,因为你的指南针和加速度计都不是完美的。你可以增加 N 并选择一个让你满意的延迟/视图跳转比率的值。 - Knickedi
请注意,您正在执行输入信号的低通滤波器。 - Aderstedt
我明白了,你是对的。我只是没有考虑使用权重并保持线性。谢谢你的提示。 - Knickedi

0

将陀螺仪传感器读数整合起来,可以极大地提高方向最终估计的稳定性。如果您的设备具有陀螺仪,请查看steady compass应用程序;如果您没有陀螺仪,请观看视频。

使用互补滤波器可以相对简单地完成陀螺仪的整合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接