Намерете посоката си с компаса на Windows Phone

Посетители: 3128 Преглеждания: 3728 (днес 0)Шрифт:

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

Акселерометърът в Windows Phone е добър пример за сензор, който предоставя важна информация, но става много по-ценен, когато се комбинира с друг сензор, особено с компас.

Класът акселерометър предоставя вектор на ускорение като стойност от тип Vector3. Това е тип XNA, така че ако трябва да го използвате в програма Silverlight, трябва да добавите препратка към сборката на Microsoft.Xna.Framework.

В изтегления изходен код за тази статия има решение на Visual Studio, наречено 3DPointers, което съдържа четири XNA 3D проекта, всички от които изглеждат доста сходни. Програмата Accelerometer 3D рисува триизмерна "игла", която се носи в пространството и сочи в посоката, посочена от вектора на ускорението (фиг. 2 ).

намерете
Фиг. 2. Акселерометър 3D екран

В Windows Phone 7.1 приложният програмен интерфейс (API) на сензорите се е променил леко, за да се осигури съгласуваност между различните сензори. Accelerometer 3D Builder използва този нов API, за да създаде екземпляр на Accelerometer, който се записва като поле:

Стойността по подразбиране на свойството TimeBetweenUpdates е 25 ms; в този случай тя се задава според кадровата честота на програмата и е равна на 33 ms.

Програмата използва заменена версия на метода OnActivated за стартиране на акселерометъра:

Въпреки че е трудно да си представим сценарий, при който методът Start ще се провали в този момент, добра идея е да поставите извикването му в блок try. Компасът спира на OnDeactivated:

Програмата използва метода LoadContent за изграждане на 3D върхове за щифта и дефинира BasicEffect за съхраняване на информация за камерата и осветлението.Щифтът е дефиниран така, че основата му да е в началото и се простира с една единица нагоре по положителната ос Y. Камерата гледа директно към началото от положителната ос Z.

След това векторът на ускорението се използва в метода Update за определяне на световната трансформация. Тази трансформация в крайна сметка ще премести щифта спрямо началото. Кодът е показан нафиг. 3.

Фиг. 3. Метод за актуализиране в Accelerometer 3D

Този метод получава стойността на Acceleration директно от обекта Accelerometer, ако свойството IsDataValid е true. Щифтът трябва да се завърти въз основа на ъгъла между вектора на ускорението и положителната Y-ос. Скаларното произведение на тези два вектора дава този ъгъл, а кръстосаното произведение дава оста на въртене.

Компас на помощ

phone
Фиг. 4. Магнитометър 3D екран

Указания по компас

Обикновено, когато използваме компас, не е необходимо да изравняваме 3D вектора с магнитното поле на Земята. Много по-полезен би бил двуизмерен вектор, тангенциален към повърхността на Земята.

Както може би знаете, магнитното поле на Земята не е подравнено с нейната ос на въртене. Посоката на земната ос се нарича географски или истински север и това е същият север, който се използва на картите и за почти всичко останало. Ъглите на 2D повърхност често се използват за представяне на север. Често се нарича посока или компас.

В XNA програма, както видяхте, можете просто да получите текущата стойност от сензора, когато изпълнявате метода Update. Когато използвате сензорен клас в програма Silverlight, трябва да прикачите манипулатор за събитието CurrentValueChanged. Тогава тиможете да получите обекта за показания на сензора от аргументите на това събитие.

Изходният код за тази статия съдържа две програми Silverlight, Arrow Compass и Dial Compass, които показват посоката на север с помощта на свойството TrueHeading. Всички графики са дефинирани в XAML. Както при XNA програмите, тези Silverlight програми създават Compass обект в своите конструктори, но също така задават манипулатор за свойството CurrentValueChanged:

В програмата Arrow Compass този манипулатор задава ъгъла в обекта RotateTransform, свързан с графиката със стрелка:

Манипулаторът CurrentValueChanged се извиква в отделна нишка, така че ще трябва да използвате Dispatcher, за да актуализирате всички UI обекти. Тъй като ъгълът TrueHeading показва отклонение обратно на часовниковата стрелка, а завъртанията в Silverlight са по посока на часовниковата стрелка, кодът използва ъгъл с отрицателна посока за завъртането.

windows
Фиг. 5. Стрелка Компас Екран

компаса
Фиг. 6. Наберете екран с компас

Калибриране на компаса

В долния десен ъгъл Arrow Compass показва стойността HeadingAccuracy от CompassReading. На теория той отчита точността на стойностите на посоката на компаса. На практика съм виждал, че стойностите на HeadingAccuracy варират от 5% до 30%.

Класът Compass също дефинира събитие Calibrate, което се задейства, когато стойността на HeadingAccuracy надвишава 20%.

Комбиниран компас и акселерометър

Нещо повече, класът Motion върши допълнителната работа по изглаждане на данните от акселерометър и компас. Ако сте изпълнявали програмите, представени досега, вероятно сте забелязали значително разсейване в данните от тези класове. Това разпространение се премахва от класа Motion.

Въпреки това,Тъй като съм от хората, които не се страхуват от трудни задачи, реших да опитам да комбинирам „ръчно“ данни от акселерометър и компас и трябва да призная, че този експеримент ме накара да изпитвам голямо уважение към класа Motion!

Компас 3D показва четири щифта с различни цветове, подредени в невидим кръг: сребърните щифтове сочат на север, червените щифтове на изток, зелените щифтове на юг и сините щифтове на запад. Програмата се опитва да покаже тази фиксирана равнина успоредна на земната повърхност с правилната ориентация в посоката на четирите точки на компаса.

Избрах стратегия, използваща ъгли на Ойлер. Това са трите ъгъла, представляващи въртене по осите X, Y и Z, и заедно описват ориентация в 3D пространството. В механиката на полета тези три ъгъла се наричат ​​наклон (pitch), наклон (roll) и yaw (yaw). От гледна точка на авиацията, наклонът показва дали носът на самолета е нагоре или надолу и с колко, докато кренът се отнася до всеки наклон на самолета надясно или наляво. Тези ъгли на въртене могат да бъдат визуализирани като относителни към две оси: наклонът е въртене около ос, която минава през крилата, а кренът е въртене около ос, която минава от носа на самолета към опашката. Yaw е въртене около ос, перпендикулярна на повърхността на Земята, и този ъгъл показва посоката на компаса за равнината.

Изчисляването на ролката и тангажа от вектора на ускорението се оказа сравнително просто и изисква използването на стандартни формули:

Резултатите са показани наФиг. 7.

phone
Фиг. 7. Компас 3D Екран

Класът Motion е твърде важно допълнение към API на сензора, за да се използва само в тази програма. Както ще видите в следващата статия, този клас всъщност служи като портал към 3D света.