Андроидный компас кажется ненадежным
Я работаю над небольшим компасом за последние пару дней, и получил код в рабочем состоянии, но кажется, что чтение компаса неточно. После калибровки обоих телефонов мой первый тест, который я нашел, в том, что я просто держал против телефона и плоскую поверхность, смотрел на показания, а затем перевернул его горизонтально и положил на ту же плоскую поверхность (поворот на 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 градусов, на самом деле значение курса движется в противоположном направлении от других телефонов при вращении в одном направлении. Это единственный телефон, который производит этот результат даже после калибровки в настройках. Кроме того, они представляют собой живые обои для компаса, которые я тестирую, и у них нет такой же проблемы. Поэтому я бы предположил, что в программном обеспечении я смогу что-то сделать, чтобы избежать этого.
Ответы
Ответ 1
Хорошо после большого тестирования и отладки. Я пришел к выводу, что да, поскольку некоторые из вас упомянули различия, мой дроид 1 и Nexus S были чисто аппаратной разницей и магнитными помехами.
Однако Droid X был другой проблемой, независимо от того, что я пробовал, я не смог получить правильные показания из рекомендуемого метода с помощью getRotationMatrix и getOrientation, даже если добавлена функция повторной карты. Поэтому после некоторого возиться с успехом я понял, что идентификатор Датчик ориентации можно сделать выстрелом.
Google говорит, что этот способ устарел, и они рекомендуют делать это так, как я начал, но я пробовал все типы комбинаций с этим способом без успеха. Поэтому я пошел вперед и проигнорировал его предупреждение и использовал датчик ориентации... и это сработало. Зачем? я понятия не имею, дроид x новее os, чем мой дроид 1, поэтому он не должен иметь отношения к использованию устаревшего кода. Однако имеет смысл, почему приложения с компасом, написанные для целевого 1.6, будут работать, пока мое приложение "рекомендуется" не работает.
Если у кого-то есть лучший способ сделать это, дайте мне знать, или если вы знаете способ заставить его работать с getRotationMatrix и getOrientation, также расскажите.
В противном случае для всех, кто попадает в эту кирпичную стену так же сильно, как я делал это код, который закончился для меня.
изменился мой датчик на
switch (event.sensor.getType())
{
case Sensor.TYPE_ORIENTATION:
m_vforientVals = event.values.clone();
break;
}
if(m_vforientVals != null)
{
m_fCompBearing = m_vforientVals[0];
mCompHead.setText("" + (int)m_fCompBearing);
calcOffset();
rotateCmp();
}
и инициализировать прослушиватель датчиков
mSMngr.registerListener(mSListener,mSMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_NORMAL);
Ответ 2
Несмотря на то, что автор ответил на свой вопрос, я должен перезвонить здесь, чтобы укрепить почти полную бесполезность любых функций компаса на платформе Android.
Я пришел к выводу, что любой, кто зависит от приложения компаса Android, задает проблемы, никто из них не работает надежно, и это не ошибка разработчика.
Google и mfg просто не предоставили способ получить достоверную точность от этих устройств или даже определить, является ли точность достоверной, что еще хуже, потому что иногда они есть и много раз они не являются, и если кто-то доверяет этим устройствам для реального ориентирования Бог поможет им.
Причина, по которой автор, по-видимому, считает, что он получает лучшие результаты, заключается в том, что они используют довольно хороший фильтр шума на устаревшем датчике ориентации (почему они не могли этого сделать по новому методу вне меня) и в ограниченном тестировании на одном устройство после калибровки это будет работать, но в поле с использованием многих устройств я обнаружил, что по большей части надежность всегда под вопросом.
Сначала шум, создаваемый магнитными и ориентировочными датчиками, ужасен, да, это можно преодолеть с помощью надлежащих методов DSP, а с телефонами с поддержкой 2.3 и гироскопов это улучшится в целом, но позор в Google и Mfg для того, время разработки с дрянной реализацией аппаратных и программных выходов.
Во-вторых, я тестировал по меньшей мере 18 телефонов с надлежащей фильтрацией DSP на месте, и хотя это устраняет шум, который не помогает с точностью, даже у той же модели телефонов есть разные выходы (хотя некоторые модели кажутся лучше других)
В-третьих, у вас мало возможностей определить, калибруются ли датчики, даже если движение спастической фигуры 8 может или не может откалибровать телефон, и пользователь никогда не знает, работает ли он или нет, если у вас нет компаса проверить, какой вид поражения это не так?
ПРИМЕЧАНИЕ. Вы можете умножить и суммировать магнитные датчики друг с другом и взять квадратный корень из этого sqrt (x * x + y * y + z * z) и убедиться, что это между 25 и 65 или около того, это один индикатор, который вы можете использовать для обнаружения аномальных полей, но он не полностью надежный, лучше, чем ничего, я думаю.
В-четвертых, многие телефоны полностью ненадежны, откалиброваны или нет, что не ограничивается модельными типами, но, возможно, дрянной QA со стороны mfg, я действительно не знаю, почему, но могу сказать, что 3 HTC ARIA произвели дико разные результаты (один 30 градусов, другие 50, и третий почти пятно на) то же самое с невероятным, связь и т.д.
Я тестировал 18 телефонов, и многие из них были довольно близки к точной, если бы вы могли откалибровать правильно, но многие из них взяли 2-10 попыток (мы проверили после каждой попытки калибровки с помощью высокоточного компаса) и более чем в несколько раз просто НЕ откалибровать.
ПРИМЕЧАНИЕ: вам нужно учитывать отклонение для истинного сдвига на север, которое вы можете сделать с API в андроиде, если у вас есть доступ к текущим координатам GPS, высоте, времени суток и т.д. проблема была не склонение и если вы сравните с компасом, который не является проблемой, так как это будет также осуществляться локальными магнитными полями.
Fith, холодный запуск всегда требует шага калибровки на каждом тестируемом нами телефоне, который включает в себя X, невероятную, Арию, Nexus и Thunderbolt. Другими словами, при первом запуске сенсорного прослушивания в 95% случаев потребуется выполнить шаг калибровки (даже прерывистые часы - два раза в день), поэтому, если вы настаиваете на добавлении этой функции, я просто скажу, что ваш пользователь должен сделать это на начало каждого события слушателя.
Если вы покидаете сенаторы, работающие (плохо для батареи), вам может понадобиться или не нужно откалибрировать в зависимости от полей, с которыми они столкнулись), этот метод работает нормально для этого.
Суть в том, что, когда они работают, они кажутся классными, но вы НИКОГДА не можете быть уверены в точности азимута, что делает их довольно ненадежными и бесполезными для любой реальной работы.
Лично я использовал бы GPS-приемник при перемещении, а затем, по возможности, вектор вектора вращения, он может быть не идеальным, но это было бы намного лучше, чем безумная реализация, которую вы используете в текущей линейке телефонов для азимут.
Извините за длинный ответ, но я потратил впустую почти месяц, пытаясь заставить его работать с помощью эксперта-инженера DSP, и мы в значительной степени писали о платформе Android как полезный в этом отношении.
A "Иногда это срабатывает, иногда это не так, вы никогда не сможете быть уверены, если у вас нет реального компаса".
Ответ 3
Ваш код выглядит хорошо, если в вашем коде будет ошибка. Я уверен, что оба устройства пострадают от этого. Я думаю, это аппаратное обеспечение в устройствах, которые вызывают различия.
Вы "откалибровали" оба компаса, переместив телефон на фигуре восьми фигур? Многие приложения компаса предлагают это, включая программное обеспечение карты, которое поставляется с устройствами symbian. Это может работать