如何在Android上制作精确的指南针

我的android应用程序显示了世界上某个地方的方向,因此需要获得指南针的程度。
这是我一直用来计算度数的代码:

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); } }; 

这种方法通常有效,但有时它只是错误的北方,我需要做些什么来获得更准确的位置?

我有几个build议给你:

1)您的设备可能未被校准 。 为了做到这一点,以8的forms移动它( 见这个 )。 如果您的设备没有经过校准,或者没有通过将设备指向某个已知的基点方向进行一些testing并比较这些值, 通常情况下,如果一个设备没有校准,小旋转的方位angular会出现很大的变化。 那是我会担心的。

现在,不要忘记,传感器给你的磁北方轴承,而不是真正的北方 ! 这种差异被称为磁场的衰减,由于地球磁场的变化,其磁场随时间的推移而变化。 这个应用程序可以为您计算一些相对准确的值。 我不会太担心,因为这个偏angular通常很小,但是你可能正在寻找很好的精确度(目前我的偏angular是3度)。

2)远离金属物体或产生强磁场的物体 。 例如,如果您的手机靠近电脑或任何物理键盘,请勿进行testing! 这是testing指南针地理定位的纯毒物。 有些应用程序可以测量磁场强度(如果设备支持的话)。 当你接近金属材料时,你会经历更高的价值和方向上的强烈变化。 为了好玩,还有一些“ 金属探测器 ”:这个应用程序可以识别磁场的变化,当你靠近“金属物体”或磁性干扰设备的东西时会振动。

3)当您将设备倾斜到横向模式时,请记得更新方位。 ( 文章必须阅读! )这是因为方位angular值是基于垂直轴到手机平面的旋转。 当您将设备旋转到横向时,该值将改变+/-90º! 这不能通过禁用应用程序横向模式来解决! 您将不得不通过分析另外两个轴(俯仰和滚动)周围的旋转来以编程方式确定它。 这不是微不足道的,但networking中有一些例子。

编辑:如果您对某些代码感兴趣,请查看Mixare ,它是Android下GPL3下的开源增强现实框架。 看看他们的定位,指南针的地理位置和方位的代码。

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