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