【发布时间】:2011-06-06 18:15:21
【问题描述】:
过去几天我一直在开发一个小型指南针应用程序,并且已经启动并运行了代码,但指南针读数似乎不准确。在校准了两部手机后,我的第一次测试发现我只是将手机靠在平坦的表面上看读数,然后将其水平翻转并将其放在同一个平坦的表面上(180* 转)并且值确实不改变 180* 它更接近 240*。
然后我用指南针测试了读数,有时读数似乎很接近,但在其他点上它超过了 50*。我什至试着把我的手机和指南针放在地板上,以使指南针远离任何磁场干扰,结果相同(注意我还保持指南针和手机分开,通过与书的边缘对齐来保持它们在同一个方向上) .
然后我将示例应用程序放在另一部手机上(首先是 nexus S,其次是摩托罗拉 droid 1)。两部手机之间的差异范围从在某些点相等,但在大多数点之间相差 50 到 15 度。
我查看了文档,还查看了许多不同的论坛帖子,但我没有看到任何人有相同的结果。我的代码中可能有一些小错误导致我的读数不正确,或者我没有看到一些记录在案的错误。
任何见解或建议将不胜感激!
这是我在 SensorEventListener 类中的传感器更改代码
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();
}
}
并在创建我的活动时输入代码
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 度以上,事实上当以相同方向旋转时,航向值与其他手机的方向相反。这是唯一一款即使在设置中校准后仍能产生此结果的手机。他们也是我测试的指南针动态壁纸,没有相同的问题。所以我会假设我可以在软件中做一些事情来避免这种情况。
【问题讨论】:
-
你确定问题是安卓而不是硬件吗?
-
一个明显的差异来源是磁北与真北。 FWIW,如果您转一圈不动,我的基本 garmin gps 单元指向正前方。使用这些基本 gps 单位的唯一方法是将其指向行进方向并移动向前。这可能与您的问题无关,但是?
-
首先感谢您的快速解答。好吧,传感器管理器总是应该返回磁北,gps 将返回真北,因为它使用基于真北的纬度/经度上的运动方向。至于这是一个硬件问题,这是有可能的,但是我看到应用程序会全面返回类似的结果,并且想知道他们将如何做到这一点。我也用 DroidX 进行了测试,结果在 Droid X 上大不相同,我的指南针图像甚至向相反的方向旋转?
标签: android compass-geolocation sensors android-sensors