Орієнтуйтеся на місцевість за допомогою компаса Windows Phone

Відвідувачів: 3128 Переглядів: 3728 (сьогодні 0)Шрифт:

Проблема акселерометра

Акселерометр в Windows Phone - хороший приклад датчика, який дає деяку суттєву інформацію, але стає набагато ціннішим у поєднанні з іншим датчиком, особливо з компасом.

Клас Accelerometer надає вектор прискорення як значення типу Vector3. Це XNA-тип, тому, якщо вам потрібно використовувати його в Silverlight, ви повинні додати посилання на збірку Microsoft.Xna.Framework.

У вихідному коді, який можна завантажити для цієї статті, є рішення Visual Studio під назвою 3DPointers, в якому містяться чотири проекти XNA 3D, і всі вони виглядають досить схожими. Програма Accelerometer 3D малює тривимірну «шпильку», яка ширяє в космосі і спрямована у бік, яку вказує вектор прискорення (рис. 2 ).

компаса
Мал. 2. Екран програми Accelerometer 3D

У Windows Phone 7.1 датчики API трохи змінили, щоб забезпечити узгодженість між різними датчиками. Конструктор програми Accelerometer 3D використовує цей новий API, щоб створити екземпляр Accelerometer, що зберігається як поле:

Значення властивості TimeBetweenUpdates за замовчуванням – 25 мс; в даному випадку воно встановлюється відповідно до частоти кадрів програми і дорівнює 33 мс.

Програма використовує перевизначену версію методу OnActivated для запуску Accelerometer:

Хоча важко уявити сценарій, де метод Start зазнає невдачі на цьому етапі, рекомендується поміщати його виклик у блок try. Компас зупиняється в OnDeactivated:

У програмі застосовується метод LoadContent для побудови 3D-вершин для "шпильки" і визначається BasicEffect для зберігання інформації камери та освітлення.Шпилька визначається так, щоб її основа знаходилася на початку координат і розширювалася на одну одиницю вгору по позитивній осі Y. Камера дивиться безпосередньо на початок координат з позитивної Z-осі.

Потім метод Update використовується вектор прискорення, щоб визначити перетворення світових координат (world transform). Це перетворення зрештою зміщує шпильку щодо початку координат. Код показаний на мал. 3 .

Мал. 3. Метод Update у програмі Accelerometer 3D

Цей метод отримує значення Acceleration безпосередньо від об'єкта Accelerometer, якщо властивість IsDataValid дорівнює true. Булавку потрібно обертати, виходячи з кута між вектором Acceleration та позитивною Y-віссю. Скалярний добуток цих двох векторів дає цей кут, а векторний добуток — вісь обертання.

Компас поспішає на допомогу

місцевість
Мал. 4. Екран програми Magnetometer 3D

Напрями з компасу

Зазвичай, коли ми користуємося компасом, нам не потрібно вирівнювати тривимірний вектор із магнітним полем Землі. Набагато кориснішим був би двомірний вектор, тангенціальний поверхні Землі.

Як ви, можливо, знаєте, магнітне поле Землі не збігається з її віссю обертання. Напрямок осі Землі називається географічним, або істинним, північ, і це той самий північ, який використовується на картах і практично для всіх інших цілей. Кути на двомірній поверхні часто застосовуються для того, щоб представляти напрямок на північ. Його часто називають напрямком або азимутом за компасом.

У XNA-програмі, як ви бачили, можна отримати поточне значення від датчика при виконанні методу Update. Використовуючи клас датчика в Silverlight, ви повинні підключити обробник для події CurrentValueChanged. Тоді визможете отримувати об'єкт показань датчика аргументів цієї події.

У вихідному коді для цієї статті містяться дві програми Silverlight - Arrow Compass і Dial Compass, що показують напрямок на північ за допомогою TrueHeading. Уся графіка визначена у XAML. Як і у випадку XNA-програм, ці програми Silverlight створюють об'єкт Compass у своїх конструкторах, але, крім цього, задають обробник властивості CurrentValueChanged:

У програмі Arrow Compass цей оброблювач задає кут в об'єкті RotateTransform, підключеному до символу стрілки (arrow graphic):

Обробник CurrentValueChanged викликається в окремому потоці, тому вам потрібно буде використовувати Dispatcher для оновлення будь-яких UI-об'єктів. Оскільки кут TrueHeading вказує відхилення проти годинникової стрілки, а повороти Silverlight здійснюються за годинниковою стрілкою, в коді використовується негативний кут напрямку для повороту.

компаса
Мал. 5. Екран програми Arrow Compass

місцевість
Мал. 6. Екран програми Dial Compass

Калібрування компасу

У правому нижньому кутку програма Arrow Compass відображає значення HeadingAccuracy з CompassReading. Теоретично воно повідомляє точність значень напряму компасу. Насправді я бачив розкид значень HeadingAccuracy від 5% до 30%.

У класі Compass також визначено подію Calibrate, яка спрацьовує, коли значення HeadingAccuracy перевищує 20%.

Об'єднання компасу та акселерометра

Більш того, клас Motion виконує додаткову роботу щодо згладжування даних від Accelerometer та Compass. Якщо ви запускали представлені на даний момент програми, то, ймовірно, помітили значний розкид даних від цих класів. Цей розкид забирається класом Motion.

Однак,оскільки я належу до тих людей, які не бояться важких завдань, я вирішив спробувати «вручну» скомбінувати дані від Accelerometer і Compass і повинен визнати, що цей експеримент змусив мене з великою повагою ставитись до класу Motion!

Програма Compass 3D відображає чотири шпильки різних кольорів, розташованих по невидимому колу: срібляста вказує на північ, червона – на схід, зелена – на південь та синя – на захід. Програма намагається показувати цю площину з шпильками паралельно поверхні Землі з правильною орієнтацією у напрямі чотирьох точок компасу.

Я вибрав стратегію за допомогою кутів Ейлера. Це три кути, що представляють повороти по осях X, Y і Z, і всі разом описують орієнтацію в тривимірному просторі. У механіці польоту ці три кути позначаються як тангаж (pitch), крен (roll) та нишпорення (yaw). З погляду авіації, тангаж вказує, задертий або опущений ніс літака і наскільки, тоді як крен визначає будь-який нахил площини праворуч або ліву. Ці кути обертання можна візуалізувати як відносні двом осям: тангаж – це обертання навколо осі, яка проходить через крила, а крен – обертання навколо осі, що проходить від носа літака до хвоста. Ризик - це обертання навколо осі, перпендикулярної поверхні Землі, і цей кут вказує напрямок по компасу для площини.

Обчислення крену та тангажу за вектором прискорення виявилося порівняно простим і вимагає використання стандартних формул:

Результати показані на мал. 7 .

орієнтуйтеся
Мал. 7. Екран програми Compass 3D

Клас Motion — надто важливе доповнення в датчиках API, щоб використовувати його тільки в цій програмі. Як ви побачите у наступній статті, цей клас насправді є порталом у тривимірний світ.