Андроидный компас кажется ненадежным

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