如何在安卓手机上制作一个准确的指南针

18

我的安卓应用需要显示特定世界位置的方向,因此需要获取指南针度数。
这是我一直在使用的代码来计算度数:

public void getDirection() {        
    mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
    if(mySensors.size() > 0){
        mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI);           
    }
    else{
        TextView alert = (TextView)findViewById(R.id.instruct);
        alert.setText(getString(R.string.direction_not_found));
        myCompassView.setVisibility(myCompassView.INVISIBLE);

    }
}
private SensorEventListener mySensorEventListener = new SensorEventListener(){

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        compassBearing = (float)event.values[0];
        float bearing;
        bearing = compassBearing - templeBearing;
        if (bearing < 0)
            bearing = 360 + bearing;
        myCompassView.updateDirection(bearing);
        }
};

这种方法通常有效,但有时会获取错误的北向位置,我该怎么做才能获得更准确的位置?


这将是一个很好的问题,可以添加到新的http://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality StackExchange提案中。 - SashaZd
这个链接应该会有所帮助。 https://dev59.com/c4fca4cB1Zd3GeqPg0vB - Derek
1个回答

40

我有几个建议:

1) 您的设备可能未经校准。为了校准,请将其以八字形移动(参见此处)。如果您不知道您的设备是否已校准,请通过将设备对准某些已知的基准方向并比较数值来进行一些测试。通常,如果设备未校准,则在小角度旋转时会看到航向值的大幅变化。这就是我担心的。

现在,请不要忘记传感器仅提供到磁北极的方位角,而非真正的北极!这种差异被称为地磁偏角,其值随着时间和地点的改变而改变,因为地球磁场会发生变化。这个应用程序可以相对精确地计算出一些值。我不会过于担心这个问题,因为地磁偏角通常很小,但如果您需要高精度(例如在我所在的地方,目前地磁偏角为3º),那么您可能会关注这个问题。

2) 远离金属物体或产生强磁场的物品。例如,如果您的手机靠近电脑或任何实体键盘,则不要进行测试!这对于测试指南针-地理定位来说是致命的。一些应用程序可以测量磁场的强度(如果设备支持)。当您靠近金属物品时,您会体验到更高的数值和方向的强烈变化。有趣的是,也有一些“金属探测器”:这个应用程序会识别磁场的变化,并在靠近“金属物体”或干扰设备磁力的东西时震动。

3) 当你将设备倾斜到横屏模式时,请记得更新方位角。(这篇文章是必读的!) 这是因为方位角值是基于手机垂直轴的旋转的。当你将设备旋转到横屏模式时,该值会改变+/-90度!禁用应用程序横屏模式无法解决这个问题! 您将不得不通过分析其他两个轴(俯仰和滚动)周围的旋转来编程确定它。这并不简单,但在网络上有一些示例。

编辑: 如果您对一些代码感兴趣,请查看Mixare,它是一个面向Android的GPL3下的开源增强现实框架。请查看他们的代码关于方向、指南针、地理定位和方位角的部分。

PS:我与上述应用程序的创建者没有任何联系。


2
  1. 有没有办法告诉用户设备未校准?
  2. 有没有办法知道何时存在磁干扰?
  3. 我禁用了横屏模式,所以我不需要担心这个,对吗?
- eladrich
@MobileCushion非常好的回答,非常感谢。 - RiadSaadi
1
磁偏角通常是一个小值,但在磁北极和地理北极之间的连线上可能高达180度,因此不应忽略。 - rawiniasDaddy

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