Странное поведение измерений магнитного поля при вращении устройства

ситуация:

Я пытаюсь создать внутреннюю систему локализации с использованием изменений магнитного поля внутри здания с помощью отпечатков пальцев. В качестве датчика я использую свой мобильный телефон Galaxy Nexus.

В основном идея получить мои отпечатки пальцев заключается в том, чтобы измерить магнитное поле в направлении x,y и z соответственно и повернуть вектор по ориентации мобильного телефона, чтобы привести вектор в мировую систему координат. Разместить кто-то также измеряет магнитное поле, поворачивает вектор и отправляет его на сервер, где я запускаю свои алгоритмы определения местоположения.

моя проблема:

когда я измеряю магнитное поле в одном и том же месте в разных ориентациях, я не получаю тот же результат после поворота вектора. Даже сила поля не одинакова.

чтобы показать это, я сделал четыре измерения в том же положении и повернул мобильный вокруг своей оси z (стандартная спецификация для Android) на 90, 180 и 270 градусов против часовой стрелки соответственно. Результаты можно увидеть на этой "таблице" и на графиках Matlab (перейдите по ссылке) ниже (если вы хотите иметь другие представления, дайте мне знать)

Edit: Точнее, я определил свою собственную систему координат, называемую, скажем, системой координат комнаты. Я взял одну стену комнаты и определил ее как Северную. Оси Y мой телефон пришельцы с стена (в первом положении) в то время как она была плоской на столе. Поэтому положительная ось z указывает на небо, а ось x определяется как стены в 90 градусов. Векторы названы "сырые" исходные значения телефона и поэтому они находятся в системе координат телефона. Вектор с именем "повернутый" поворачивается в эту "систему координат комнаты". На графике пунктирные векторы являются необработанными векторами, а сплошные-повернутыми те.

╔═════════════╦════════╦════════╦════════╦══════════╗
║ Vector      ║    X   ║   Y    ║    Z   ║ Strength ║
╠═════════════╬════════╬════════╬════════╬══════════╣
║ 0°Raw       ║  17.55 ║   8.21 ║ -36.83 ║  41.62   ║
║ 0°Rotated   ║  17.55 ║   8.21 ║ -36.83 ║  41.62   ║
║ 90°Raw      ║  15.74 ║ -11.36 ║ -36.86 ║  41.66   ║
║ 90°Rotated  ║  11.36 ║  15.74 ║ -36.86 ║  41.66   ║
║ 180°Raw     ║ -65.06 ║ -16.18 ║ -44.79 ║  80.63   ║
║ 180°Rotated ║  65.06 ║  16.18 ║ -44.79 ║  80.63   ║
║ 270°Raw     ║   6.38 ║  61.95 ║ -46.37 ║  77.64   ║
║ 270°Rotated ║  61.95 ║  -6.38 ║ -46.37 ║  77.64   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

enter image description hereenter image description here

как вы можете видеть, даже после их поворота они действительно не совпадают. У тебя есть идеи, почему это может быть? Что-нибудь, о чем я еще не подумал? Большое спасибо заранее!

Edit2:

второй эксперимент

Я сделал еще один эксперимент с лучшими результатами, но все же не так хорошо, как я ожидал. На этот раз направление не такое постоянное, как должно быть быть. На этот раз я снял мерки на открытом воздухе. Я направил ось y на истинный север и положил ее на землю. Я повернул ее примерно 3 раза на 90 градусов против часовой стрелки. Я сделал с другой камерой снимок положения мобильного телефона и измерил реальное вращение с помощью photoshop. Результаты вы можете увидеть на таблице и на графиках ниже:

╔═════════════╦════════╦════════╦════════╦══════════╗
║ Vector      ║    X   ║   Y    ║    Z   ║ Strength ║
╠═════════════╬════════╬════════╬════════╬══════════╣
║ 0°Raw       ║   1.22 ║  20.31 ║ -57.53 ║  61.02   ║
║ 0°Rotated   ║   1.22 ║  20.31 ║ -57.53 ║  61.02   ║
║ 104°Raw     ║  25.92 ║   5.66 ║ -57.53 ║  63.35   ║
║ 104°Rotated ║ -11.93 ║  23.70 ║ -57.53 ║  63.35   ║
║ 204°Raw     ║   5.42 ║ -16.86 ║ -59.67 ║  62.24   ║
║ 204°Rotated ║ -11.90 ║  13.12 ║ -59.67 ║  62.24   ║
║ 290°Raw     ║ -12.18 ║   0.73 ║ -57.85 ║  59.12   ║
║ 290°Rotated ║  -3.64 ║  11.64 ║ -57.85 ║  59.12   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

enter image description hereenter image description here

дополнительная информация:

значения усредняются по a пара секунд. Так что это не проблема шума.

Я знаю, что не могу использовать функцию getOrientation потому что он использует магнитное поле для вычисления ориентации и, что не имеет смысла так как я хочу найти вариации магнитного поля. Для примера выше я создал вращение кватерниона вручную.

1 ответов


убедитесь, что вы контролируете точность датчиков через onAccuracyChanged(Sensor sensor, int accuracy) метод. Я нахожу, что с моим планшетом Nexus 10 точность регулярно меняется, и когда она низкая или ненадежная, я получаю результаты, подобные вашим.