Компас Android кажется ненадежным

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


person ocross    schedule 06.06.2011    source источник
comment
Вы уверены, что проблема в Android, а не в железе?   -  person Jim Clay    schedule 06.06.2011
comment
Одним из очевидных источников разницы может быть магнитное поле против истинного севера. FWIW, мой основной GPS-навигатор Garmin указывает прямо вперед, если вы поворачиваете по кругу, не двигаясь. Единственный способ использовать эти основные единицы измерения GPS — направить его в направлении движения и переместить вперед. Это может не иметь никакого отношения к вашей проблеме, но?   -  person JAL    schedule 07.06.2011
comment
Прежде всего спасибо за быстрые ответы. Ну, менеджер датчиков всегда должен возвращать магнитный север, GPS будет возвращать истинный север, потому что он использует направление движения по широте / долготе, которое основано на истинном севере. Что касается аппаратной проблемы, то это возможно, однако я видел приложения, которые возвращают одинаковые результаты по всем направлениям, и задавался вопросом, как они это сделают. Я также тестировал DroidX, и результаты сильно отличались от Droid X. Мое изображение компаса даже вращалось в противоположных направлениях?   -  person ocross    schedule 07.06.2011


Ответы (3)


Несмотря на то, что автор ответил на свой вопрос, я должен вмешаться здесь, чтобы подчеркнуть почти полную бесполезность любых функций компаса на платформе Android.

Я пришел к выводу, что любой, кто зависит от приложения компаса Android, напрашивается на неприятности, ни одно из них не работает надежно, и это не вина разработчика.

Google и MFG просто не предоставили способ получить надежную точность от этих устройств или даже определить, является ли точность надежной, что еще хуже, потому что иногда они являются, а часто нет, и если кто-то доверяет этим устройствам для реального ориентирования. Боже, помоги им.

Причина, по которой автор, вероятно, думает, что он получает лучшие результаты, заключается в том, что они используют довольно хороший шумовой фильтр на устаревшем датчике ориентации (почему они не могут сделать это с более новым методом, мне не понятно) и в ограниченном тестировании на одном устройстве после калибровки. это будет работать, но в полевых условиях с использованием многих устройств я обнаружил, что по большей части надежность всегда под вопросом.

Во-первых, шум, создаваемый магнитными датчиками и датчиками ориентации, ужасен, да, это можно преодолеть с помощью надлежащих методов DSP, и с телефонами с поддержкой 2.3 и гироскопа в целом это улучшится, но позор Google и Mfg за то, что они тратят так много времени разработчиков с некачественные реализации аппаратных и программных выходов.

Во-вторых, я протестировал по крайней мере 18 телефонов с надлежащей фильтрацией DSP, и хотя это убирает шум, это не помогает с точностью, даже у телефонов одной и той же модели выходы разные (хотя некоторые модели кажутся лучше других).

В-третьих, у вас мало способов определить, откалиброваны ли датчики, даже выполнение спастического движения в виде восьмерки может или не может откалибровать телефон, и пользователь никогда не знает, работает он или нет, если у вас нет компаса для проверки, что своего рода поражения точки не так ли?

ПРИМЕЧАНИЕ: вы можете умножить и просуммировать магнитные датчики друг с другом и взять квадратный корень из этого sqrt(x*x+y*y+z*z) и убедиться, что он находится между 25 и 65 или около того, это один из индикаторов, который вам нужен. можно использовать для обнаружения аномальных полей, но это не совсем надежно, я думаю, это лучше, чем ничего.

В-четвертых, многие телефоны совершенно ненадежны, откалиброваны или нет, что не ограничивается типами моделей, а, возможно, дрянным контролем качества со стороны производителя, я действительно не знаю почему, но могу сказать, что 3 HTC ARIA дали совершенно разные результаты ( один на 30 градусов, другой на 50, а третий почти в точку) то же самое с невероятным, нексусом и т. д.

Я протестировал 18 телефонов, и многие из них были довольно близки к точности, ЕСЛИ вы могли правильно откалибровать, но многим из них потребовалось 2-10 попыток (мы проверяли после каждой попытки калибровки с помощью высокоточного компаса), и более чем несколько раз они просто НЕ калибровали. вообще.

ПРИМЕЧАНИЕ: вам нужно учитывать склонение для истинного смещения на север, что вы можете сделать с помощью API в Android, если у вас есть доступ к текущим координатам GPS, высоте, времени суток и т. д. проблема не была склонением, и если вы по сравнению с компасом это не проблема, так как на него также будут влиять местные магнитные поля.

В-пятых, холодный запуск всегда требует шага калибровки на каждом протестированном нами телефоне, включая X, невероятный, Aria, Nexus и Thunderbolt. Другими словами, когда вы впервые начинаете слушать датчик, в 95% случаев потребуется шаг калибровки (даже сломанные часы показывают правильное время два раза в день), поэтому, если вы настаиваете на добавлении этой функции, я бы просто сказал вашему пользователю сделать это в начало каждого события слушателя.

Если вы оставите датчики включенными (плохо для батареи), вам может потребоваться или не потребоваться повторная калибровка в зависимости от полей, с которыми он столкнулся), описанный выше метод работает нормально для этого.

Суть в том, что когда они работают они кажутся крутыми, но вы НИКОГДА в настоящее время не можете быть уверены в точности азимута, что делает их довольно ненадежными и бесполезными для любой реальной работы.

Лично я бы использовал пеленг GPS во время движения, а затем, если возможно, метод вектора вращения, он может быть не идеальным, но он был бы чертовски лучше, чем хреновая реализация, которая есть в текущей линейке телефонов для азимута.

Извините за длинный ответ, но я потратил почти месяц на попытки заставить это работать с помощью опытного инженера DSP, и мы в значительной степени написали о платформе Android как о полезной в этом отношении.

По моему мнению, в каждое приложение компаса следует включить заявление об отказе от ответственности «Иногда это работает, иногда нет, вы никогда не можете быть уверены, если у вас нет настоящего компаса».

person Idistic    schedule 14.06.2011
comment
Да, я согласен с тобой. Я пришел к выводу, что вы должны понимать, что будет около +-30 градусов погрешности с показаниями, которые, как кажется, на большинстве моих устройств (проверено только с 6) колеблются в диапазоне около 10. Что касается того, почему Я сказал, что датчик ориентации был исправлением, потому что Droid X вообще не работал. Чтение было далеко не правильным, когда другие были близки с погрешностью, и переключение на ориентацию заставило X работать так же, как и другие. Шумоподавление было хорошим, но я делал свой собственный фильтр нижних частот уже после получения значений. - person ocross; 15.06.2011
comment
@ocross Что я действительно обнаружил, так это то, что если файл конфигурации датчиков был удален, проблема смещения и проблема повторной калибровки исчезли. Проблема в том, что требуется root-доступ, и это временно. Кроме того, проблема с залипанием, по-видимому, связана с ручной калибровкой на телефонах, которые я тестировал, движение запястья lazy-8 исправил, по крайней мере, это. Для другого мне пришлось включить функцию смещения, которая могла быть синхронизирована с азимутом GPS (точность скорости должна быть хорошей) или вручную пользователем. Проблема в том, что дрейф происходит со временем - person Idistic; 10.07.2011
comment
Этот вид поста является одновременно и благословением, и проклятием: я собирался полагаться на акселерометры для определения курса (еще один не очень надежный метод), но задавался вопросом, не было бы лучше переключиться на магнитометры для определения курса. идея с самого начала. Поскольку мне понадобится пошаговое точное определение курса, акселерометры не работают и компасы, кажется, не работают, что тогда остается? Достаточно ли надежен GPS? Даже с помехами горизонта? - person ravemir; 02.04.2013
comment
@ravemir Имейте в виду, что становится лучше. Настоящая проблема в том, что он не универсален (некоторые телефоны хороши, другие - отстой), вот в чем настоящая проблема. GPS работает, если вы двигаетесь со скоростью более нескольких миль в час/км/ч и у вас хороший сигнал, но только если вы думаете о прямом направлении (поворот налево во время движения направо, конечно, не сработает, если вы не можете получить вращательное движение). векторы и т. д.) Вам нужны приличные датчики и слияние датчиков, чтобы все это работало надежно, и это приближается, но вы пока не можете полагаться на то, что это их. - person Idistic; 03.04.2013
comment
Направление действительно прямое, но я не уверен, что бег может быть быстрее нескольких миль в час. Если это действительно так, я действительно потратил много времени на то, чтобы ничего не стоило xD - person ravemir; 04.04.2013
comment
Я экспериментировал со следующей ошибкой датчика компаса: / - person GVillani82; 09.01.2014
comment
Я впечатлен тем, что ваши пределы погрешности настолько малы - ориентируясь пешком или на машине, я обычно игнорирую маркер направления на телефоне, который обычно составляет 40-80 градусов от фактического курса, а иногда и больше. - person nsandersen; 17.04.2017

Ну после долгих испытаний и отладки. Я пришел к выводу, что да, как некоторые из вас упомянули, различия между моим Droid 1 и Nexus S были чисто аппаратными различиями и магнитными помехами.

Однако Droid X был другой проблемой, что бы я ни пытался, я не мог получить правильные показания рекомендуемым способом с помощью getRotationMatrix и getOrientation, даже когда была добавлена ​​​​функция переназначения координат. Итак, после некоторого безуспешного возни я решил попробовать датчик ориентации.

Google говорит, что этот способ устарел, и они рекомендуют делать это так, как я начал, однако я пробовал все типы комбинаций таким образом, но безуспешно. Поэтому я пошел дальше и проигнорировал их предупреждение и использовал датчик ориентации ... и это сработало. Почему ? Я понятия не имею, у droid x более новая операционная система, чем у моего droid 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);
person ocross    schedule 08.06.2011

Ваш код выглядит хорошо для меня, если в вашем коде будет ошибка, я уверен, что оба устройства пострадают от этого. Я думаю, что аппаратное обеспечение устройств вызывает различия. Вы «откалибровали» оба компаса, перемещая телефон в форме восьмерки? Многие приложения для компаса предлагают это, в том числе картографическое программное обеспечение, которое поставляется с устройствами Symbian. Это может сработать

person Quint Stoffers    schedule 06.06.2011
comment
Спасибо за ответ, и вы действительно делаете большое замечание о калибровке, которая может иметь огромное значение и сделать компасы ненадежными. К сожалению, это был шаг, который я забыл упомянуть перед тестами (я отредактировал его сейчас). Я попробую еще раз и на этот раз откалибрую еще дольше, посмотрим, замечу ли я какие-либо лучшие результаты. - person ocross; 07.06.2011