0

我有一个应用程序,我想在其中访问磁力计。我从我的应用程序中获得了结果,但与 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;
}

任何人都可以帮忙,pleeease?!:)

谢谢

4

3 回答 3

3

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

编辑 我在其他帖子上看到,有人说 value[0] 返回弧度。但是,在我尝试对其进行编码之后,我不知道 value[0] 返回弧度或等级/gon。因为当我转换成度数时..值大于360。所以我尝试将它转换成等级。它看起来不错,没有问题。代码是这样的

Double azimuth = value[0];
azimuth = azimuth * 360 / 400;

抱歉英语不好:)

于 2014-07-08T07:36:15.613 回答
1

我不确定卡尔曼滤波器是否对方向传感器值有效,但这可能是您需要的。此处提到了有关 android 卡尔曼滤波器的更多信息

如果您不想为学习和实现卡尔曼滤波器而头疼,请使用我在下面所做的。它对我来说效果很好。:

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 代替!

于 2010-12-06T17:40:00.817 回答
0

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

于 2014-07-10T03:28:08.997 回答