Последние пару дней я работал над небольшим приложением для компаса и запустил код, но кажется, что показания компаса неточны. После калибровки обоих телефонов мой первый тест, в котором я обнаружил это, заключался в том, что я просто приложил телефон к плоской поверхности, посмотрел на показания, затем перевернул его горизонтально и положил на ту же плоскую поверхность (поворот на 180 *), и значение сделал не изменить 180* было ближе к 240*.
Затем я сравнил показания с компасом, время от времени показания казались близкими, но в других точках они отличались более чем на 50*. Я даже пытался положить свой телефон и компас на пол, чтобы компасы не подвергались магнитным помехам с теми же результатами (обратите внимание, что я также держу компас и телефон отдельно, чтобы они были в одном направлении, выровнявшись с краями книги). .
Затем я установил пример приложения на другой телефон (первый был Nexus S, второй Motorola 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);
Заранее спасибо!
Редактировать: также попробовал это с дроидом X с худшими результатами... Когда телефон поворачивается на 45 градусов (поворачивается вокруг оси z компьютерной системы координат), возвращаемый курс компаса может измениться более чем на 180 градусов, фактически значение курса идет в направлении, противоположном другим телефонам, когда вращается в том же направлении. Это единственный телефон, который выдает такой результат даже после калибровки в настройках. Кроме того, это живые обои с компасом, которые я тестирую, и у них нет такой же проблемы. Поэтому я бы предположил, что я могу что-то сделать в программном обеспечении, чтобы избежать этого.