Kwalifikacje kadry dydaktycznej kluczem do rozwoju Uczelni PROJEKT WSPÓŁFINANSOWANY ZE ŚRODKÓW UNII EUROPEJSKIEJ I EUROPEJSKIEGO FUNDUSZU SPOŁECZNEGO Uniwersytet Kazimierza Wielkiego w Bydgoszczy Wydział Matematyki, Fizyki i Techniki specjalność: Sieci i systemy rozproszone Technologie mobilne i rozproszone na platformie.net Wykład 11 Sensory. GPS i mapa. Sensory w WP7 Standardowo dostępne A-GPS, Accelerometer, Compass, Gyro (opcja!), GPS, przyspieszenia, kompas, żyroskop. Light, światła. Proximity zbliżeniowy 3 1
Akcelerometr Mierzy zmiany przyśpieszenia przechylanie i ruch telefonu w przestrzeni XYZ, w odniesieniu do kierunku pionowego. Wynik pomiaru wartość składowych przyśpieszenie ziemskiego, w czasie. 4 Pomiar Jeżeli telefon leży poziomo ekranem do góry składowa g z = 1 g g = 9,81 m/s 2 składowa g x, y = 0 5 Użycie akcelerometru W jaki sposób pobierać wartości akcelerometru zainicjować obiekty klasy Accelerometer, monitorować zmiany danych zdarzenie ReadingChanged, przekazać rezultat tego zdarzenia z powrotem do głównego wątku strony zdarzenie uruchomione jest w innym wątku użyć tych wartości w aplikacji. biblioteka + n.space: Microsoft.Devices.Sensors 6 2
Przykład Zainicjowanie obiektów akcelerometr, wartość zmierzona. Accelerometer accelr; SensorReadingEventArgs<AccelerometerReading> acceleration; zgłoszenie obsługi zdarzenia ReadingChanged accelr = new Accelerometer(); accelr.timebetweenupdates = TimeSpan.FromMilliseconds(20); accelr.currentvaluechanged += new EventHandler< SensorReadingEventArgs<AccelerometerReading> >(accelr_currentvaluechanged); accelr.start(); 7 Odczyt wartości Obsługa zdarzenia void accelr_currentvaluechanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) acceleration = e; } Użycie wartości zmierzonych private void btnodczyt_click(object sender, RoutedEventArgs e) XText.Text = acceleration.sensorreading.acceleration.x.tostring(); YText.Text = acceleration.sensorreading.acceleration.y.tostring(); ZText.Text = acceleration.sensorreading.acceleration.z.tostring(); } 8 Akcelerometr - szczegóły Dla klasy Accelerometer: bool IsSupported czy dostępny TimeSpan TimeBetweenUpdates częstotliwość odczytu Start() / Stop() rozpoczęcie / zakończenie pomiaru Jeżeli pomiar ciągły odczyt umieścić w wątku klasa DispatcherTimer +.Interval +.Tick 9 3
Akcelerometr - szczegóły Maksymalnie 10 jednoczesnych instancji klasy jeżeli więcej - wyjątek. Właściwości State: gets; current state; SensorState enumeration. TimeBetweenUpdates: gets/sets; time between CurrentValueChanged events IsSupported (static): gets/sets; supports the accelerometer sensor. 10 Zdarzenia CurrentValueChanged gdy dostarczane nowe dane z sensora. ReadingChanged gdy dostarczane nowe dane z sensora, metoda przestarzała w bieżącym wydaniu zalecane użycie CurrentValueChanged 11 Kompas Czujnik może być wykorzystane do: określenia kąta wzgl. bieguna magnetycznego bieguna północnego, wykrycia pola magnetyczne wokół urządzenia. Kompas jest sensorem opcjonalnym wziąć pod uwagę to przy programowaniu, aplikacja powinna sprawdzić, czy jest dostępny. Dokładność wskazania maleje wymagana kalibracja akcja użytkownika można zaimplementować okno kalibracji. Nie działa na emulatorze 12 4
Inicjacja Wymagane składniki biblioteka + ns: Microsoft.Devices.Sensors Klasa Compass if (Compass.IsSupported) test dostępności pole statyczne klasy Compass Użycia - analogicznie do Accelerometr Zwraca strukturę CurrentValue typu CompasReading 5 wartości 13 Co w CurrentValue struktura public structcompassreading: ISensorReading HeadingAccuracy dokładność odczytu, MagneticHeading pozycja w stopniach, mierzona od bieguna magnetycznego ziemi w prawo, MagnetometerReading indukcja pola magnetycznego w mikroteslach, Timestamp znacznik czasu częstotliwość odczytu TrueHeading jak MagneticHeading, ale od bieguna geograficznego (deklinacja!) 14 Inne Metody Start(), Stop() początek, koniec odczytu Właściwości CurrentValue było IsDataValid gets the validity of the sensor s data, IsSupported gets whether the device is running supports the compass, TimeBetweenUpdates gets/sets time between CurrentValueChanged events 15 5
Zdarzenia Calibrate occurs when the operating system detects that the compass needs calibration. CurrentValueChanged occurs when new data arrives from the sensor, public struct CompassReading : ISensorReading 16 Przykład obiekty Compass kompas; SensorReadingEventArgs<CompassReading> odczytkompasu; inicjacja, zdarzenie kompas = new Compass(); kompas.timebetweenupdates = TimeSpan.FromMilliseconds(20); kompas.currentvaluechanged += new EventHandler<SensorReading EventArgs<CompassReading>>(kompas_CurrentValueChanged); kompas.start(); odczyt void kompas_currentvaluechanged(object sender, SensorReadingEventArgs<CompassReading> e) odczytkompasu = e; } 17 Przykład - użycie odczyt dla bieguna geograficznego do pola tekstowego odczyt dla bieguna magnetycznego do pola tekstowego private void btnodczyt_click(object sender, RoutedEventArgs e) XText.Text = "geogr: "+kompas.currentvalue.trueheading.tostring(); YText.Text = "magn.:"+kompas.currentvalue.magneticheading.tostring(); } 18 6
Orientacja i ruch urządzenia Sensory kompas, akcelerometr, żyroskop Każdy z interfejsów API czujnika zbudowana na bazie klasy SensorBase, podobne: start, stop, wyjście. Wspólne zdarzenie: CurrentValueChanged czas pomiędzy zdarzeniami: TimeBetweenUpdates wartość: SensorReadingEventArgs<typSensora> struktura specyficzna dla sensora - typsensora początek, koniec: Start(), Stop() 19 Problem z położeniem Problem (fizyczne ograniczenia) surowe dane z czujników: nie jest łatwo określić rzeczywisty kierunek i ruch urządzenia akcelerometr: ruch urządzenia + siła grawitacji żyroskop: mierzy prędkość obrotową przy zmianie położenia pojawia się zjawisko dryfu matematyka 20 Rozwiązanie sensor wirtualny Klasa API Motion kompas + czujnik przyspieszenia + matematyka + żyroskop większa dokładność 21 7
Motion API Nikt nie lubi wektorów synteza danych - kompas, gyro, akcelerometr. Klasa Motion wirtualny sensor obsługa jw. TimeBetweenUpdates, CurrentValueChanged, SensorReadingEventArgs<typSensora>, Start(), Stop(). Czy jest wspierane.issupported statyczne pole klasy Na wyjściu SensorReadingEventArgs<MotionReading> 22 Motion na wyjściu Struktura SensorReadingEventArgs<MotionReading> klasa Attitude orientacja w przestrzeni DeviceAcceleration przyśpieszenie urządzenia [g] DeviceRotationRate prędkość obrotowa urządzenia, [rad/s] Gravity (klasa Vector3) siła grawitacji (wektor) działająca na urządzenie. Timestamp częstotliwość pomiaru. 23 Orientacja w przestrzeni Klasa Attitude orientacja w przestrzeni [rad] jak w przestrzeni obrócone urządzenie Pitch Roll Yaw 24 8
GPS GPS klasyczny musi widzieć satelity (5-10) z reguły nie działa w pomieszczeniach. A-GPS (AssistedGPS) wykorzystuje Wi-Fi, serwery operatora komórk., musi być udostępniony przez operatora, skraca czas uruchomienia. A-GPS w WP wymaga System.Device oraz ns: System.Device.Location zainicjować obiekt klasy GeoCoordinateWatcher, monitorować czujnik GPS zmiana pozycji, podobnie, jak akcelerometr. 25 Przykład Aplikacja określa aktualne położenie telefonu GeoCoordinateWatcher gps wyświetla mapę z aktualnym położeniem kontrolka Map o nazwie Map <my:map x:name="map" Grid.Row="4" ZoomLevel="8" Center="54.0, 20.0" Mode="Road" CredentialsProvider= ze strony Bing Maps! " HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> </my:map> 26 Przykład w kodzie Obiekty public partial class MainPage : PhoneApplicationPage GeoCoordinateWatcher gps; inicjowanie public MainPage() InitializeComponent(); gps = new GeoCoordinateWatcher(GeoPositionAccuracy.High); gps.positionchanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>> (gps_positionchanged); gps.start(); 27 9
Przykład w kodzie cd. Zdarzenie zmiana pozycji void gps_positionchanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) if (!e.position.location.isunknown) Map.Center = e.position.location; } 28 29 30 10