Android 如何提高加速度计和罗盘传感器的精度?

Android 如何提高加速度计和罗盘传感器的精度?,android,accelerometer,augmented-reality,compass-geolocation,Android,Accelerometer,Augmented Reality,Compass Geolocation,我正在创建一个增强现实应用程序,当手机面对一个兴趣点(手机上存储了gps位置)时,它可以直观地显示文本视图。文本视图绘制在屏幕中的兴趣点位置 它工作正常,问题是指南针和加速计是非常“变型”的,文本视图不断地上下左右移动,因为传感器不准确 有办法解决这个问题吗?如果你想更进一步的话,你应该看看低通滤波器的方位数据或传感器融合 祝你的应用程序好运 JQCorreia我用一个简单的技巧解决了这个问题。这将延迟你的结果一点,但他们确实避免了罗盘和加速度计的不准确性 创建上一个N值的历史记录(因此,当您到

我正在创建一个增强现实应用程序,当手机面对一个兴趣点(手机上存储了gps位置)时,它可以直观地显示文本视图。文本视图绘制在屏幕中的兴趣点位置

它工作正常,问题是指南针和加速计是非常“变型”的,文本视图不断地上下左右移动,因为传感器不准确


有办法解决这个问题吗?

如果你想更进一步的话,你应该看看低通滤波器的方位数据或传感器融合

祝你的应用程序好运


JQCorreia

我用一个简单的技巧解决了这个问题。这将延迟你的结果一点,但他们确实避免了罗盘和加速度计的不准确性


创建上一个
N
值的历史记录(因此,当您到达
N
时,请将该值保存到一个数组中,并再次从零开始递增索引)。然后您只需使用存储值的算术平均值。

我们的问题是相同的。我在创建简单的增强现实项目时也遇到了同样的问题。解决方法是使用移动平均函数。我建议使用指数平滑,因为它只需要存储以前的一个值。下面提供了示例实现:

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;
}
private float[]指数平滑(float[]输入,float[]输出,float alpha){
if(输出==null)
返回输入;

对于(int i=0;i陀螺仪传感器读数的积分可以极大地提高最终方位估计的稳定性。 如果您的设备有陀螺仪,请查看应用程序;如果您没有陀螺仪,请查看视频


陀螺仪的集成可以用一个互补滤波器以一种相当简单的方式完成。

嗨,请你再解释一下好吗?我不明白你在说什么,但听起来不错看看我的答案和里面的链接。嗨,谢谢你的建议,我会试试。顺便问一下,为了比较你的代码,你有代码吗请举个例子好吗?我很久以前就为iPhone做了,所以很不幸没有;-)但它很简单。你只需构建数组的和,除以
N
,然后使用这个值,而不是从指南针或加速计获得的直接值。谢谢,我对它进行了测试,它工作了一点,但textview仍在向各个方向移动一些像素:/你永远找不到完美的值,因为你的指南针和加速计满足要求er远非完美。您可以增加
N
,并在您对延迟/视图跳转率满意的地方选择它的值。请注意,您所做的是对输入信号进行低通滤波。请问,此输入[I]是加速度计的x、y、z值吗?@DawoodAwan否,它们输入[]是加速度计的“event.values”参数“onSensorChanged”事件。