我最近开发了一个小型的指南针应用程序,代码已经可以正常运行,但是指南针读数似乎不太准确。在校准两部手机之后,我的第一个测试结果是将手机放在平面上,查看读数,然后水平翻转手机放在相同的平面上(180度),但是读数并没有改变180度,而是接近240度。
我随后对比测试了普通指南针和我的应用程序读数,有时候读数看起来很接近,但在其他情况下,读数会偏差50度以上。我甚至尝试将手机和指南针放在地板上,远离任何磁性干扰,但结果相同(请注意,我也让指南针和手机保持距离,并通过书本边缘将它们定位在同一方向上)。
我将应用程序安装到了另一部手机上(第一部为Nexus S,第二部为Motorola Droid 1)。两部手机之间的差异在某些点上是相等的,但在大多数情况下,它们的差异在50到15度之间。
我查看了文档,并查阅了许多论坛帖子,但没有发现任何与我类似的结果。可能是我的代码存在一些小错误导致读数出现错误,或者存在一些已记录的错误,我没有注意到。
非常感谢任何见解或建议!
下面是我的SensorEventListener类中onSensorChanged代码。
我随后对比测试了普通指南针和我的应用程序读数,有时候读数看起来很接近,但在其他情况下,读数会偏差50度以上。我甚至尝试将手机和指南针放在地板上,远离任何磁性干扰,但结果相同(请注意,我也让指南针和手机保持距离,并通过书本边缘将它们定位在同一方向上)。
我将应用程序安装到了另一部手机上(第一部为Nexus S,第二部为Motorola Droid 1)。两部手机之间的差异在某些点上是相等的,但在大多数情况下,它们的差异在50到15度之间。
我查看了文档,并查阅了许多论坛帖子,但没有发现任何与我类似的结果。可能是我的代码存在一些小错误导致读数出现错误,或者存在一些已记录的错误,我没有注意到。
非常感谢任何见解或建议!
下面是我的SensorEventListener类中onSensorChanged代码。
public void onSensorChanged(SensorEvent event)
{
// If the sensor data is unreliable return
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
{
Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show();
}
// Gets the value of the sensor that has been changed
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
m_vfgravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
m_vfgeomag = event.values.clone();
break;
}
if (m_vfgravity != null && m_vfgeomag != null)
{
if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag))
{
SensorManager.getOrientation(m_vfinR, m_vforientVals);
m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2;
//convert to 0-360 from -180-180
if(m_fCompBearing < 0.0)
{
m_fCompBearing = 360 + m_fCompBearing;
}
mCompHead.setText("" + (int)m_fCompBearing);
}
calcOffset();
rotateCmp();
}
}
我的代码在活动的onCreate方法中
mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSListener = new cSensorListener();
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_UI);
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
提前致谢!
编辑:我还尝试了使用Droid X,但效果最差...当手机旋转约45度(围绕z轴旋转计算机坐标系)时,指南针的方向可能会改变超过180度。实际上,当以相同方向旋转时,该方向值与其他手机相反。即使在设置中进行校准,这是唯一会产生此结果的手机。同时,有一个指南针动态壁纸我用来测试也没有同样的问题。因此,我认为在软件中应该有一些可以避免这个问题的解决方法。