Странное поведение измерений магнитного поля при вращении устройства
ситуация:
Я пытаюсь создать внутреннюю систему локализации с использованием изменений магнитного поля внутри здания с помощью отпечатков пальцев. В качестве датчика я использую свой мобильный телефон 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 ║
╚═════════════╩════════╩════════╩════════╩══════════╝
как вы можете видеть, даже после их поворота они действительно не совпадают. У тебя есть идеи, почему это может быть? Что-нибудь, о чем я еще не подумал? Большое спасибо заранее!
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 ║
╚═════════════╩════════╩════════╩════════╩══════════╝
дополнительная информация:
значения усредняются по a пара секунд. Так что это не проблема шума.
Я знаю, что не могу использовать функцию getOrientation
потому что он использует магнитное поле для вычисления ориентации и, что не имеет смысла так как я хочу найти вариации магнитного поля. Для примера выше я создал вращение кватерниона вручную.
1 ответов
убедитесь, что вы контролируете точность датчиков через onAccuracyChanged(Sensor sensor, int accuracy)
метод. Я нахожу, что с моим планшетом Nexus 10 точность регулярно меняется, и когда она низкая или ненадежная, я получаю результаты, подобные вашим.