Android:指南针太不精确了?

时间:2010-12-06 10:31:29

标签: android compass-geolocation

我有一个应用程序,我想访问magnotometer。我从我的应用程序中得到了结果,但与g1指南针应用程序的方向结果相比,我的应用程序的结果与指南针应用程序完全不同。例如:我的应用程序是250°,罗盘应用程序是90°! 那不可能,这是我的代码。成为更好的结果有什么不同吗?

public class MySensorListener implements SensorListener{
  int orientation;
  public MySensorListener(){
     orientation = 0;
  }
    public void onAccuracyChanged(int sensor, int accuracy) {
  // TODO Auto-generated method stub

 }

    public void onSensorChanged(int sensor, float[] values) {
        orientation = (int)values[0];
    }
}

我像这样接触了Sensormanager:

private MySensorListener doCompass(){
 MySensorListener cl;
 SensorManager cm;
 compassListener = new MySensorListener();

  cm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  cm.registerListener(
   cl, 
   SensorManager.SENSOR_ORIENTATION, 
   SensorManager.SENSOR_DELAY_UI); //updateRate
  return cl;
}

任何人都可以帮忙吗? :)

谢谢

3 个答案:

答案 0 :(得分:3)

您必须使用Math.toDegrees。因为value [0]返回弧度。

修改 我在其他帖子上看到,有人说价值[0]返回弧度。 但是,在我尝试编码后,我不知道值[0]返回弧度或等级/ gon。因为当我转换成度...时,该值大于360.所以我尝试将其转换为等级。它看起来很好,没有问题。代码就像这样

Double azimuth = value[0];
azimuth = azimuth * 360 / 400;
抱歉英语不好:)

答案 1 :(得分:1)

我不确定卡尔曼滤波器是否对方向传感器值有效,但这是您可能需要的。有关Android的卡尔曼滤波器的更多信息,请参阅here

如果你不想经历研究和实施卡尔曼滤波器的头痛,请使用我在下面做的。它对我来说工作得相当好。 :

private boolean isMagneticFieldFine(float[] fieldValues){
    double value = Math.sqrt(fieldValues[0]*fieldValues[0] + fieldValues[1]*fieldValues[1] + fieldValues[2]*fieldValues[2]);        
    return value < 65.0 && value > 25.0;
}

另一方面,不推荐使用SensorListener,请尝试使用SensorEventListener!

答案 2 :(得分:0)

有许多方法可以校准方向,例如使用其他传感器数据进行校准(例如陀螺仪和加速度计),或使用统计模型(例如粒子滤波器和卡尔曼滤波器)。本演讲介绍了工业中用于校准运动传感器的一些最新技术:https://www.youtube.com/watch?v=C7JQ7Rpwn2k