Typy czujników

W tej sekcji opisano osie czujników, czujniki podstawowe i czujniki złożone (aktywność, położenie, nieskalibrowane i interakcja).

Osie czujników

Wartości zdarzeń czujników z wielu czujników wyrażone są w określonej ramce, która jest statyczna względem urządzenia.

Osie urządzeń mobilnych

Interfejs API czujnika odnosi się tylko do naturalnej orientacji ekranu (osie nie są zamieniane, gdy zmienia się orientacja ekranu urządzenia).

Układ współrzędnych API czujników dla urządzeń mobilnych

Rysunek 1. Układ współrzędnych (względem urządzenia mobilnego) wykorzystywany przez Sensor API

Osie samochodowe

W implementacjach Android Automotive osie definiowane są względem ramy nadwozia pojazdu. Początkiem układu odniesienia pojazdu jest środek tylnej osi. Układ odniesienia pojazdu jest zorientowany w taki sposób, że:

  • Oś X jest skierowana w prawo i leży na płaszczyźnie poziomej, prostopadłej do płaszczyzny symetrii pojazdu.
  • Oś Y skierowana jest do przodu i leży na płaszczyźnie poziomej.
Układ współrzędnych API czujników dla urządzeń motoryzacyjnych

Rysunek 2. Układ współrzędnych (względem urządzenia samochodowego) wykorzystywany przez Sensor API

Układ odniesienia pojazdu jest prawoskrętnym układem współrzędnych. Dlatego oś Z jest skierowana w górę.

Oś Z układu odniesienia jest wyrównana z grawitacją, co oznacza, że ​​obie osie X i Y są poziome. W rezultacie oś Y nie zawsze przechodzi przez oś przednią.

Czujniki bazowe

Nazwy typów czujników podstawowych pochodzą od czujników fizycznych, które reprezentują. Czujniki te przekazują dane z pojedynczego czujnika fizycznego (w przeciwieństwie do czujników złożonych, które generują dane z innych czujników). Przykładowe typy czujników podstawowych obejmują:

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

Jednak czujniki podstawowe nie są równe i nie należy ich mylić z podstawowym czujnikiem fizycznym. Dane z czujnika podstawowego nie są surowymi danymi wyjściowymi czujnika fizycznego, ponieważ stosowane są poprawki (takie jak kompensacja odchylenia i kompensacja temperatury).

Na przykład charakterystyka czujnika podstawowego może różnić się od właściwości leżącego u jego podstaw czujnika fizycznego w następujących przypadkach użycia:

  • Układ żyroskopowy ma zakres odchylenia wynoszący 1 stopień/s.
    • Po zastosowaniu kalibracji fabrycznej, kompensacji temperatury i kompensacji odchylenia rzeczywiste odchylenie czujnika Android zostanie zmniejszone i może osiągnąć punkt, w którym gwarantowane odchylenie będzie wynosić poniżej 0,01 stopnia/s.
    • W tej sytuacji mówimy, że czujnik Androida ma odchylenie poniżej 0,01 stopnia/s, mimo że w karcie katalogowej podstawowego czujnika podano 1 stopień/s.
  • Barometr o poborze mocy 100 uW.
    • Ponieważ wygenerowane dane muszą zostać przetransportowane z chipa do SoC, rzeczywisty koszt energii potrzebnej do zebrania danych z czujnika barometru Android może być znacznie wyższy, na przykład 1000 uW.
    • W tej sytuacji mówimy, że czujnik Androida pobiera moc 1000 uW, mimo że pobór mocy mierzony na przewodach układu barometru wynosi 100 uW.
  • Magnetometr zużywający 100uW podczas kalibracji, ale zużywający więcej podczas kalibracji.
    • Procedura kalibracji może wymagać aktywacji żyroskopu, co zużywa 5000 uW i uruchomienia jakiegoś algorytmu, co kosztuje kolejne 900 uW.
    • W tej sytuacji mówimy, że maksymalny pobór mocy czujnika (magnetometru) Android wynosi 6000 uW.
    • W tym przypadku bardziej użyteczną miarą jest średni pobór mocy, który jest raportowany w charakterystyce statycznej czujnika za pośrednictwem warstwy HAL.

Akcelerometr

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) zwraca czujnik inny niż wybudzenie

Czujnik akcelerometru informuje o przyspieszeniu urządzenia w trzech osiach czujnika. Zmierzone przyspieszenie obejmuje zarówno przyspieszenie fizyczne (zmianę prędkości), jak i grawitację. Pomiar jest raportowany w polach x, y i z sensor_event_t.acceleration.

Wszystkie wartości podano w jednostkach SI (m/s^2) i mierzą przyspieszenie urządzenia pomniejszone o siłę grawitacji wzdłuż trzech osi czujnika.

Oto przykłady:

  • Norma (x, y, z) powinna być bliska 0 podczas swobodnego spadania.
  • Gdy urządzenie leży płasko na stole i jest przesunięte lewą stroną w prawą stronę, wartość przyspieszenia x jest dodatnia.
  • Gdy urządzenie leży płasko na stole, wartość przyspieszenia wzdłuż z wynosi +9,81 alo, co odpowiada przyspieszeniu urządzenia (0 m/s^2) minus siła ciężkości (-9,81 m/s^2).
  • Gdy urządzenie leży płasko na stole i jest pchane w stronę nieba, wartość przyspieszenia jest większa niż +9,81, co odpowiada przyspieszeniu urządzenia (+A m/s^2) minus siła ciężkości (-9,81 m /s^2).

Odczyty kalibruje się za pomocą:

  • Kompensacja temperatury
  • Kalibracja odchylenia online
  • Kalibracja wagi online

Kalibrację odchylenia i skali można aktualizować tylko wtedy, gdy czujnik jest wyłączony, aby uniknąć powodowania skoków wartości podczas przesyłania strumieniowego.

Akcelerometr raportuje również oczekiwaną dokładność odczytów za pomocą sensors_event_t.acceleration.status . Więcej informacji na temat możliwych wartości tego pola można znaleźć w stałych SENSOR_STATUS_* modułu SensorManager .

Temperatura otoczenia

Tryb raportowania: W przypadku zmiany

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) zwraca czujnik niebudzący

Czujnik ten podaje temperaturę otoczenia (pokoju) w stopniach Celsjusza.

Czujnik pola magnetycznego

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) zwraca czujnik inny niż wybudzenie

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

Czujnik pola magnetycznego (znany również jako magnetometr) raportuje pole magnetyczne otoczenia mierzone wzdłuż trzech osi czujnika.

Pomiar jest raportowany w polach x, y i z sensors_event_t.magnetic , a wszystkie wartości są wyrażone w mikroTeslach (uT).

Magnetometr raportuje również, jak dokładne będą jego odczyty, korzystając z sensors_event_t.magnetic.status . Więcej informacji na temat możliwych wartości tego pola można znaleźć w stałych SENSOR_STATUS_* modułu SensorManager .

Odczyty kalibruje się za pomocą:

  • Kompensacja temperatury
  • Kalibracja fabryczna (lub online) miękkiego żelaza
  • Kalibracja twardego żelaza online

Żyroskop

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) zwraca czujnik inny niż wybudzenie

Czujnik żyroskopowy raportuje prędkość obrotu urządzenia wokół trzech osi czujnika.

Obrót jest dodatni w kierunku przeciwnym do ruchu wskazówek zegara (reguła prawej ręki). Oznacza to, że obserwator patrzący z pewnego dodatniego miejsca na osi x, y lub z na urządzenie umieszczone na początku układu współrzędnych odnotowałby dodatni obrót, gdyby wydawało się, że urządzenie obraca się w kierunku przeciwnym do ruchu wskazówek zegara. Należy zauważyć, że jest to standardowa matematyczna definicja rotacji dodatniej i nie zgadza się z definicją przechyłu w przemyśle lotniczym.

Pomiar jest raportowany w polach x, y i z sensors_event_t.gyro , a wszystkie wartości są wyrażone w radianach na sekundę (rad/s).

Odczyty kalibruje się za pomocą:

  • Kompensacja temperatury
  • Kompensacja skali fabrycznej (lub online).
  • Kalibracja odchylenia online (aby usunąć dryf)

Żyroskop raportuje również oczekiwaną dokładność odczytów za pomocą sensors_event_t.gyro.status . Więcej informacji na temat możliwych wartości tego pola można znaleźć w stałych SENSOR_STATUS_* modułu SensorManager .

Żyroskopu nie można emulować w oparciu o magnetometry i akcelerometry, ponieważ spowodowałoby to zmniejszoną lokalną spójność i responsywność. Musi opierać się na zwykłym chipie żyroskopowym.

Tętno

Tryb raportowania: W przypadku zmiany

getDefaultSensor(SENSOR_TYPE_HEART_RATE) zwraca czujnik inny niż wybudzenie

Czujnik tętna podaje aktualne tętno osoby dotykającej urządzenie.

Bieżące tętno w uderzeniach na minutę (BPM) jest raportowane w sensors_event_t.heart_rate.bpm , a stan czujnika jest raportowany w sensors_event_t.heart_rate.status . Więcej informacji na temat możliwych wartości tego pola można znaleźć w stałych SENSOR_STATUS_* modułu SensorManager . W szczególności przy pierwszej aktywacji, chyba że wiadomo, że urządzenie nie znajduje się na ciele, pole stanu pierwszego zdarzenia musi być ustawione na SENSOR_STATUS_UNRELIABLE . Ponieważ ten czujnik podlega zmianom, zdarzenia są generowane wtedy i tylko wtedy, gdy heart_rate.bpm lub heart_rate.status uległa zmianie od czasu ostatniego zdarzenia. Zdarzenia są generowane nie szybciej niż co każdy sampling_period .

sensor_t.requiredPermission to zawsze SENSOR_PERMISSION_BODY_SENSORS .

Światło

Tryb raportowania: W przypadku zmiany

getDefaultSensor(SENSOR_TYPE_LIGHT) zwraca czujnik inny niż wybudzenie

Czujnik światła zgłasza aktualne oświetlenie w jednostkach SI-lux.

Pomiar jest raportowany w sensors_event_t.light .

Bliskość

Tryb raportowania: W przypadku zmiany

Zwykle definiowany jako czujnik budzenia

getDefaultSensor(SENSOR_TYPE_PROXIMITY) zwraca czujnik wybudzenia

Czujnik zbliżeniowy raportuje odległość od czujnika do najbliższej widocznej powierzchni.

Do Androida 4.4 czujniki zbliżeniowe zawsze były czujnikami wybudzania, budząc SoC po wykryciu zmiany w bliskości. Po Androidzie 4.4 radzimy najpierw wdrożyć wersję wybudzającą tego czujnika, gdyż to on służy do włączania i wyłączania ekranu podczas wykonywania połączeń telefonicznych.

Pomiar jest podawany w centymetrach w sensors_event_t.distance . Należy pamiętać, że niektóre czujniki zbliżeniowe obsługują jedynie pomiar binarny „blisko” lub „daleko”. W tym przypadku czujnik zgłasza wartość sensor_t.maxRange w stanie „daleko” i wartość mniejszą niż sensor_t.maxRange w stanie „blisko”.

Ciśnienie

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_PRESSURE) zwraca czujnik inny niż wybudzenie

Czujnik ciśnienia (znany również jako barometr) podaje ciśnienie atmosferyczne w hektopaskalach (hPa).

Odczyty są kalibrowane za pomocą

  • Kompensacja temperatury
  • Fabryczna kalibracja odchylenia
  • Kalibracja wagi fabrycznej

Barometr jest często używany do szacowania zmian wysokości. Aby oszacować wysokość bezwzględną, jako punkt odniesienia należy przyjąć ciśnienie na poziomie morza (zmieniające się w zależności od pogody).

Wilgotność względna

Tryb raportowania: W przypadku zmiany

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) zwraca czujnik niebudzący

Czujnik wilgotności względnej mierzy względną wilgotność powietrza w otoczeniu i zwraca wartość w procentach.

Typy czujników kompozytowych

Czujnik złożony generuje dane poprzez przetwarzanie i/lub łączenie danych z jednego lub kilku czujników fizycznych. (Każdy czujnik, który nie jest czujnikiem podstawowym, nazywany jest czujnikiem złożonym). Przykłady czujników kompozytowych obejmują:

  • Detektor kroków i znaczny ruch , które zwykle opierają się na akcelerometrze, ale mogą również opierać się na innych czujnikach, jeśli pobór mocy i dokładność są akceptowalne.
  • Wektor rotacji gry oparty na akcelerometrze i żyroskopie.
  • Nieskalibrowany żyroskop , który jest podobny do podstawowego czujnika żyroskopu, ale z kalibracją odchylenia jest zgłaszana osobno, zamiast być korygowana w pomiarze.

Podobnie jak w przypadku czujników podstawowych, charakterystyka czujników złożonych wynika z charakterystyki ich danych końcowych. Na przykład pobór mocy wektora rotacji gry jest prawdopodobnie równy sumie poboru mocy przez układ akcelerometru, układ żyroskopu, układ przetwarzający dane i magistrale przenoszące dane. Jako inny przykład dryft wektora rotacji gry zależy w równym stopniu od jakości algorytmu kalibracji, jak i od charakterystyki czujnika fizycznego.

W poniższej tabeli wymieniono dostępne typy czujników kompozytowych. Każdy czujnik złożony opiera się na danych z jednego lub kilku czujników fizycznych. Unikaj wybierania innych podstawowych czujników fizycznych w celu przybliżenia wyników, ponieważ zapewniają one słabe wrażenia użytkownika.

Typ czujnika Kategoria Podstawowe czujniki fizyczne Tryb raportowania

Wektor rotacji gry

Postawa

Akcelerometr, żyroskop, NIE WOLNO UŻYWAĆ magnetometru

Ciągły

Wektor rotacji geomagnetycznej Czujnik małej mocy

Postawa

Akcelerometr, magnetometr, NIE WOLNO UŻYWAĆ żyroskopu

Ciągły

Gest spojrzenia Czujnik małej mocy

Interakcja

Nieokreślony

Jeden strzał

Powaga

Postawa

Akcelerometr, żyroskop

Ciągły

Żyroskop nieskalibrowany

Nieskalibrowany

Żyroskop

Ciągły

Przyspieszenie liniowe

Działalność

Akcelerometr, żyroskop (jeśli jest obecny) lub magnetometr (jeśli nie ma żyroskopu)

Ciągły

Pole magnetyczne nieskalibrowane

Nieskalibrowany

Magnetometr

Ciągły

Orientacja (przestarzałe)

Postawa

Akcelerometr, magnetometr, żyroskop (jeśli jest)

Ciągły

Podnieś gest Czujnik małej mocy

Interakcja

Nieokreślony

Jeden strzał

Wektor obrotu

Postawa

Akcelerometr, magnetometr, żyroskop

Ciągły

Znaczący ruch Czujnik małej mocy

Działalność

Akcelerometr (lub inny o bardzo małej mocy)

Jeden strzał

Licznik kroków Czujnik małej mocy

Działalność

Akcelerometr

Na zmianę

Detektor kroków Czujnik małej mocy

Działalność

Akcelerometr

Specjalny

Detektor przechyłu Czujnik małej mocy

Działalność

Akcelerometr

Specjalny

Gest budzenia Czujnik małej mocy

Interakcja

Nieokreślony

Jeden strzał

Czujnik małej mocy = Czujnik małej mocy

Złożone czujniki aktywności

Przyspieszenie liniowe

Podstawowe czujniki fizyczne: Akcelerometr i (jeśli jest obecny) żyroskop (lub magnetometr, jeśli nie ma żyroskopu)

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) zwraca czujnik inny niż wybudzenie

Czujnik przyspieszenia liniowego raportuje przyspieszenie liniowe urządzenia w ramce czujnika, nie uwzględniając grawitacji.

Wynik jest koncepcyjnie: sygnał wyjściowy akcelerometru minus sygnał wyjściowy czujnika grawitacyjnego . Jest ona podawana w m/s^2 w polach x, y i z sensors_event_t.acceleration .

Gdy urządzenie jest nieruchome, odczyty na wszystkich osiach powinny być bliskie 0.

Jeżeli urządzenie posiada żyroskop, czujnik przyspieszenia liniowego musi wykorzystywać żyroskop i akcelerometr jako dane wejściowe.

Jeśli urządzenie nie posiada żyroskopu, czujnik przyspieszenia liniowego musi wykorzystywać akcelerometr i magnetometr jako dane wejściowe.

Znaczący ruch

Podstawowy czujnik fizyczny: Akcelerometr (lub inny, o ile ma małą moc)

Tryb raportowania: jednorazowy

Niska moc

Zaimplementuj tylko wersję budzenia tego czujnika.

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) zwraca czujnik budzenia

Detektor znaczącego ruchu uruchamia się po wykryciu znaczącego ruchu : ruchu, który może prowadzić do zmiany lokalizacji użytkownika.

Przykładami takich znaczących ruchów są:

  • Chodzenie lub jazda na rowerze
  • Siedzenie w jadącym samochodzie, autokarze lub pociągu

Przykłady sytuacji, które nie powodują znaczącego ruchu:

  • Telefon w kieszeni, a osoba się nie rusza
  • Telefon leży na stole, który trochę się trzęsie z powodu ruchu ulicznego w pobliżu lub pralki

Na wysokim poziomie istotny czujnik ruchu służy do zmniejszenia zużycia energii podczas określania lokalizacji. Gdy algorytmy lokalizacji wykryją, że urządzenie jest nieruchome, mogą przełączyć się w tryb niskiego poboru mocy, w którym na podstawie znacznego ruchu wybudzają urządzenie, gdy użytkownik zmienia lokalizację.

Ten czujnik musi mieć małą moc. Stanowi kompromis w zakresie zużycia energii, co może skutkować niewielką liczbą fałszywie ujemnych wyników. Dzieje się tak z kilku powodów:

  • Celem tego czujnika jest oszczędzanie energii.
  • Wyzwolenie zdarzenia, gdy użytkownik się nie porusza (fałszywie dodatnie), jest kosztowne pod względem mocy, dlatego należy go unikać.
  • Niewyzwolenie zdarzenia, gdy użytkownik się porusza (fałszywie ujemny), jest dopuszczalne, o ile nie jest to powtarzane. Jeśli użytkownik szedł przez 10 sekund, niewyzwolenie zdarzenia w ciągu tych 10 sekund jest niedopuszczalne.

Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Detektor kroków

Podstawowy czujnik fizyczny: Akcelerometr (+ ewentualnie inne, o ile mała moc)

Tryb raportowania: Specjalny (jedno zdarzenie na każdy wykonany krok)

Niska moc

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) zwraca czujnik inny niż wybudzenie

Detektor kroków generuje zdarzenie za każdym razem, gdy użytkownik wykona krok.

Znacznik czasu zdarzenia sensors_event_t.timestamp odpowiada momentowi uderzenia stopy w ziemię, powodując dużą zmianę przyspieszenia.

W porównaniu do licznika kroków, detektor kroków powinien mieć mniejsze opóźnienie (mniej niż dwie sekundy). Zarówno czujnik kroków, jak i licznik kroków wykrywają, kiedy użytkownik chodzi, biegnie i wchodzi po schodach. Nie powinny się uruchamiać, gdy użytkownik jedzie na rowerze, prowadzi samochód lub znajduje się w innym pojeździe.

Ten czujnik musi mieć małą moc. Oznacza to, że jeśli detekcji kroku nie można wykonać sprzętowo, nie należy definiować tego czujnika. W szczególności, gdy detektor kroków jest aktywny, a akcelerometr nie, tylko kroki powinny wyzwalać przerwania (nie każdy odczyt akcelerometru).

sampling_period_ns nie ma wpływu na detektory krokowe.

Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Licznik kroków

Podstawowy czujnik fizyczny: Akcelerometr (+ ewentualnie inne, o ile mała moc)

Tryb raportowania: W przypadku zmiany

Niska moc

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) zwraca czujnik inny niż wybudzenie

Licznik kroków raportuje liczbę kroków wykonanych przez użytkownika od ostatniego ponownego uruchomienia, gdy jest aktywny.

Pomiar jest raportowany jako uint64_t w sensors_event_t.step_counter i jest resetowany do zera dopiero po ponownym uruchomieniu systemu.

Znacznik czasu zdarzenia jest ustawiony na czas wykonania ostatniego kroku dla tego zdarzenia.

Znaczenie czasu trwania kroku można znaleźć w typie czujnika detektora kroków .

W porównaniu z czujnikiem kroków licznik kroków może mieć większe opóźnienie (do 10 sekund). Dzięki temu opóźnieniu czujnik ten charakteryzuje się dużą dokładnością; liczba kroków po całym dniu pomiarów powinna mieścić się w granicach 10% rzeczywistej liczby kroków. Zarówno czujnik kroków, jak i licznik kroków wykrywają, kiedy użytkownik chodzi, biegnie i wchodzi po schodach. Nie powinny się uruchamiać, gdy użytkownik jedzie na rowerze, prowadzi samochód lub znajduje się w innym pojeździe.

Sprzęt musi zapewniać, że wewnętrzna liczba kroków nigdy się nie przepełni. Minimalny rozmiar wewnętrznego licznika sprzętu powinien wynosić 16 bitów. W przypadku nieuchronnego przepełnienia (co najwyżej co ~2^16 kroków) SoC można obudzić, aby sterownik mógł wykonać konserwację licznika.

Jak stwierdzono w Interakcja , gdy ten czujnik działa, nie powinien zakłócać działania innych czujników, w szczególności akcelerometru, który może być w użyciu.

Jeśli określone urządzenie nie obsługuje tych trybów pracy, HAL nie może zgłaszać tego typu czujnika. Oznacza to, że niedopuszczalne jest „emulowanie” tego czujnika w warstwie HAL.

Ten czujnik musi mieć małą moc. Oznacza to, że jeśli detekcji kroku nie można wykonać sprzętowo, nie należy definiować tego czujnika. W szczególności, gdy licznik kroków jest włączony, a akcelerometr nie, tylko kroki powinny wyzwalać przerwania (nie dane akcelerometru).

Detektor przechyłu

Podstawowy czujnik fizyczny: Akcelerometr (+ ewentualnie inne, o ile mała moc)

Tryb raportowania: Specjalny

Niska moc

Zaimplementuj tylko wersję budzenia tego czujnika.

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) zwraca czujnik budzenia

Detektor przechyłu generuje zdarzenie za każdym razem, gdy zostanie wykryte zdarzenie przechylenia.

Zdarzenie przechylenia definiuje się jako kierunek średniej grawitacji w 2-sekundowym oknie zmieniający się o co najmniej 35 stopni od aktywacji lub ostatniego zdarzenia wygenerowanego przez czujnik. Oto algorytm:

  • reference_estimated_gravity = średnia pomiarów akcelerometru w ciągu pierwszej sekundy po aktywacji lub szacowana grawitacja w momencie wygenerowania ostatniego zdarzenia przechylenia.
  • current_estimated_gravity = średnia pomiarów akcelerometru w ciągu ostatnich 2 sekund.
  • Wyzwalaj, gdy angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

Duże przyspieszenia bez zmiany orientacji telefonu nie powinny powodować zdarzenia przechyłu. Na przykład ostry zakręt lub mocne przyspieszenie podczas jazdy samochodem nie powinno powodować zdarzenia przechyłu, nawet jeśli kąt średniego przyspieszenia może różnić się o więcej niż 35 stopni. Zazwyczaj czujnik ten jest realizowany za pomocą jedynie akcelerometru. Można zastosować również inne czujniki, jeśli nie zwiększają one znacząco zużycia energii. Jest to czujnik o niskim poborze mocy, który powinien pozwolić SoC przejść w tryb zawieszenia. Nie emuluj tego czujnika w HAL. Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Złożone czujniki położenia

Wektor obrotu

Podstawowe czujniki fizyczne: akcelerometr, magnetometr i żyroskop

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) zwraca czujnik inny niż wybudzenie

Czujnik wektora obrotu raportuje orientację urządzenia względem układu współrzędnych wschód-północ-góra. Zwykle uzyskuje się go poprzez integrację odczytów akcelerometru, żyroskopu i magnetometru. Układ współrzędnych wschód-północ-góra definiuje się jako bezpośrednią bazę ortonormalną, gdzie:

  • X wskazuje na wschód i jest styczny do ziemi.
  • Y wskazuje północ i jest styczny do podłoża.
  • Z jest skierowany w stronę nieba i jest prostopadły do ​​ziemi.

Orientacja telefonu jest reprezentowana przez obrót niezbędny do wyrównania współrzędnych wschód-północ-góra ze współrzędnymi telefonu. Oznacza to, że zastosowanie obrotu do ramki świata (X, Y, Z) wyrównałoby je ze współrzędnymi telefonu (x, y, z).

Obrót można postrzegać jako obrót telefonu o kąt theta wokół osi rot_axis , aby przejść od orientacji urządzenia referencyjnego (wyrównanie wschód-północ-góra) do bieżącej orientacji urządzenia. Obrót jest kodowany jako cztery bezjednostkowe składowe x, y, z, w kwaternionu jednostkowego:

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

Gdzie:

  • Pola x, y i z osi rot_axis są współrzędnymi wschód-północ-góra wektora jednostkowej długości reprezentującego oś obrotu
  • theta jest kątem obrotu

Kwaternion jest kwaternionem jednostkowym: musi mieć normę 1 . Niezastosowanie się do tego spowoduje nieprawidłowe zachowanie klienta.

Ponadto czujnik ten zgłasza szacunkową dokładność kursu:

sensors_event_t.data[4] = estimated_accuracy (w radianach)

Błąd nagłówka musi być mniejszy niż estimated_accuracy w 95% przypadków. Czujnik ten musi wykorzystywać żyroskop jako główne wejście zmiany orientacji.

Czujnik ten wykorzystuje również dane wejściowe akcelerometru i magnetometru w celu kompensacji dryftu żyroskopu i nie można go wdrożyć przy użyciu samego akcelerometru i magnetometru.

Wektor rotacji gry

Podstawowe czujniki fizyczne: Akcelerometr i żyroskop (bez magnetometru)

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) zwraca czujnik inny niż wybudzenie

Czujnik wektora rotacji gry jest podobny do czujnika wektora rotacji, ale nie wykorzystuje pola geomagnetycznego. Dlatego oś Y nie wskazuje na północ, ale na inne odniesienie. To odniesienie może dryfować o ten sam rząd wielkości, co żyroskop dryfuje wokół osi Z.

Zobacz czujnik wektora obrotu , aby uzyskać szczegółowe informacje na temat ustawiania sensors_event_t.data[0-3] . Ten czujnik nie zgłasza szacunkowej dokładności kursu: sensors_event_t.data[4] są zarezerwowane i powinny być ustawione na 0 .

W idealnym przypadku telefon obrócony i przywrócony do tej samej orientacji w świecie rzeczywistym powinien zgłaszać ten sam wektor rotacji gry.

Czujnik ten musi opierać się na żyroskopie i akcelerometrze. Nie może wykorzystywać magnetometru jako sygnału wejściowego, poza tym pośrednio poprzez ocenę odchylenia żyroskopu.

Powaga

Podstawowe czujniki fizyczne: Akcelerometr i (jeśli jest obecny) żyroskop (lub magnetometr, jeśli nie ma żyroskopu)

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_GRAVITY) zwraca czujnik inny niż wybudzenie

Czujnik grawitacji zgłasza kierunek i wielkość grawitacji we współrzędnych urządzenia.

Składniki wektora grawitacji są podawane w m/s^2 w polach x, y i z sensors_event_t.acceleration .

Gdy urządzenie jest w stanie spoczynku, sygnał wyjściowy czujnika grawitacyjnego powinien być identyczny z sygnałem akcelerometru. Na Ziemi wielkość wynosi około 9,8 m/s^2.

Jeżeli urządzenie posiada żyroskop, czujnik grawitacyjny musi wykorzystywać żyroskop i akcelerometr jako dane wejściowe.

Jeśli urządzenie nie posiada żyroskopu, czujnik grawitacyjny musi wykorzystywać akcelerometr i magnetometr jako dane wejściowe.

Wektor rotacji geomagnetycznej

Podstawowe czujniki fizyczne: Akcelerometr i magnetometr (bez żyroskopu)

Tryb raportowania: Ciągły

Niska moc

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) zwraca czujnik inny niż wybudzenie

Wektor rotacji geomagnetycznej jest podobny do czujnika wektora rotacji, ale wykorzystuje magnetometr i nie żyroskop.

Czujnik ten musi być oparty na magnetometrze. Nie można tego zrealizować za pomocą żyroskopu, a wejście żyroskopu nie może być wykorzystywane przez ten czujnik.

Zobacz czujnik wektora obrotu , aby uzyskać szczegółowe informacje na temat ustawiania sensors_event_t.data[0-4] .

Podobnie jak w przypadku czujnika wektora obrotu, błąd kursu musi być mniejszy niż szacowana dokładność ( sensors_event_t.data[4] ) w 95% przypadków.

Czujnik ten musi mieć małą moc, więc musi być zaimplementowany sprzętowo.

Orientacja (przestarzałe)

Podstawowe czujniki fizyczne: akcelerometr, magnetometr i (jeśli jest) żyroskop

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_ORIENTATION) zwraca czujnik inny niż wybudzenie

Uwaga: jest to starszy typ czujnika, który został wycofany w zestawie SDK systemu Android. Został on zastąpiony czujnikiem wektora obrotu, który jest wyraźniej zdefiniowany. Jeśli to możliwe, używaj czujnika wektora obrotu zamiast czujnika orientacji.

Czujnik orientacji informuje o położeniu urządzenia. Pomiary są podawane w stopniach w polach x, y i z sensors_event_t.orientation :

  • sensors_event_t.orientation.x : azymut, kąt pomiędzy kierunkiem północy magnetycznej a osią Y wokół osi Z ( 0<=azimuth<360 ). 0=Północ, 90=Wschód, 180=Południe, 270=Zachód.
  • sensors_event_t.orientation.y : skok, obrót wokół osi X ( -180<=pitch<=180 ), z wartościami dodatnimi, gdy oś Z przesuwa się w stronę osi Y.
  • sensors_event_t.orientation.z : roll, obrót wokół osi Y ( -90<=roll<=90 ), z wartościami dodatnimi, gdy oś X przesuwa się w stronę osi Z.

Należy pamiętać, że ze względów historycznych kąt przechylenia jest dodatni w kierunku zgodnym z ruchem wskazówek zegara. (Matematycznie rzecz biorąc, powinno być dodatnie w kierunku przeciwnym do ruchu wskazówek zegara):

Przedstawienie orientacji względem urządzenia

Rysunek 3. Orientacja względem urządzenia

Definicja ta różni się od odchylenia, pochylenia i przechylenia stosowanych w lotnictwie, gdzie oś X przebiega wzdłuż długiego boku samolotu (od ogona do nosa).

Czujnik orientacji raportuje również oczekiwaną dokładność odczytów za pomocą sensors_event_t.orientation.status . Więcej informacji na temat możliwych wartości tego pola można znaleźć w stałych SENSOR_STATUS_* modułu SensorManager .

Nieskalibrowane czujniki

Nieskalibrowane czujniki zapewniają więcej surowych wyników i mogą zawierać pewne odchylenia, ale także zawierać mniej „skoków” w wyniku poprawek zastosowanych podczas kalibracji. Niektóre aplikacje mogą preferować te nieskalibrowane wyniki jako płynniejsze i bardziej niezawodne. Na przykład, jeśli aplikacja próbuje przeprowadzić własną fuzję czujników, wprowadzenie kalibracji może w rzeczywistości zniekształcić wyniki.

Akcelerometr nieskalibrowany

Podstawowy czujnik fizyczny: Akcelerometr

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) zwraca czujnik inny niż wybudzenie

Nieskalibrowany czujnik akcelerometru zgłasza przyspieszenie urządzenia wzdłuż trzech osi czujnika bez jakiejkolwiek korekcji odchylenia (w przypadku pomiarów nieskalibrowanych stosowane jest odchylenie fabryczne i kompensacja temperatury) wraz z oszacowaniem odchylenia. Wszystkie wartości podane są w jednostkach SI (m/s^2) i są podawane w polach sensors_event_t.uncalibrated_accelerometer :

  • x_uncalib : przyspieszenie (bez kompensacji odchylenia) wzdłuż osi X
  • y_uncalib : przyspieszenie (bez kompensacji odchylenia) wzdłuż osi Y
  • z_uncalib : przyspieszenie (bez kompensacji odchylenia) wzdłuż osi Z
  • x_bias : szacowane odchylenie wzdłuż osi X
  • y_bias : szacowane odchylenie wzdłuż osi Y
  • z_bias : szacowane odchylenie wzdłuż osi Z

Żyroskop nieskalibrowany

Podstawowy czujnik fizyczny: żyroskop

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) zwraca czujnik inny niż wybudzenie

Nieskalibrowany żyroskop podaje prędkość obrotu wokół osi czujnika bez stosowania do nich kompensacji odchylenia, wraz z oszacowaniem odchylenia. Wszystkie wartości podane są w radianach/sekundę i są podawane w polach sensors_event_t.uncalibrated_gyro :

  • x_uncalib : prędkość kątowa (bez kompensacji dryftu) wokół osi X
  • y_uncalib : prędkość kątowa (bez kompensacji dryftu) wokół osi Y
  • z_uncalib : prędkość kątowa (bez kompensacji dryftu) wokół osi Z
  • x_bias : szacowany dryf wokół osi X
  • y_bias : szacowany dryf wokół osi Y
  • z_bias : szacowany dryf wokół osi Z

Koncepcyjnie, pomiar nieskalibrowany jest sumą pomiaru skalibrowanego i oszacowania błędu systematycznego: _uncalibrated = _calibrated + _bias .

Oczekuje się, że wartości x_bias , y_bias i z_bias wzrosną, gdy tylko zmieni się oszacowanie obciążenia, i powinny być stabilne przez resztę czasu.

Szczegółowe informacje na temat stosowanego układu współrzędnych można znaleźć w definicji czujnika żyroskopowego .

Do pomiarów należy zastosować kalibrację fabryczną i kompensację temperatury. Należy także wdrożyć oszacowanie dryfu żyroskopu, aby możliwe było zgłaszanie rozsądnych szacunków w x_bias , y_bias i z_bias . Jeżeli implementacja nie jest w stanie oszacować dryftu, wówczas ten czujnik nie może zostać zaimplementowany.

Jeśli ten czujnik jest obecny, musi być również obecny odpowiedni czujnik żyroskopowy, a oba czujniki muszą mieć te same wartości sensor_t.name i sensor_t.vendor .

Pole magnetyczne nieskalibrowane

Podstawowy czujnik fizyczny: magnetometr

Tryb raportowania: Ciągły

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) zwraca czujnik inny niż wybudzenie

Nieskalibrowany czujnik pola magnetycznego zgłasza pole magnetyczne otoczenia wraz z szacunkową kalibracją twardego żelaza. Wszystkie wartości podane są w mikroTeslach (uT) i są podawane w polach sensors_event_t.uncalibrated_magnetic :

  • x_uncalib : pole magnetyczne (bez kompensacji żelaza) wzdłuż osi X
  • y_uncalib : pole magnetyczne (bez kompensacji twardego żelaza) wzdłuż osi Y
  • z_uncalib : pole magnetyczne (bez kompensacji żelaza) wzdłuż osi Z
  • x_bias : szacowane odchylenie twardego żelaza wzdłuż osi X
  • y_bias : szacowane odchylenie twardego żelaza wzdłuż osi Y
  • z_bias : szacowane odchylenie twardego żelaza wzdłuż osi Z

Koncepcyjnie, pomiar nieskalibrowany jest sumą pomiaru skalibrowanego i oszacowania błędu systematycznego: _uncalibrated = _calibrated + _bias .

Nieskalibrowany magnetometr umożliwia algorytmom wyższego poziomu obsługę błędnych szacunków dotyczących twardego żelaza. Oczekuje się, że wartości x_bias , y_bias i z_bias wzrosną, gdy tylko zmieni się szacunkowa wartość twardego żelaza, i powinny pozostać stabilne przez resztę czasu.

Do pomiarów należy zastosować kalibrację miękkiego żelaza i kompensację temperatury. Należy także wdrożyć twarde oszacowanie, aby rozsądne szacunki mogły być zgłaszane w x_bias , y_bias i z_bias . Jeśli implementacja nie jest w stanie oszacować błędu systematycznego, nie wolno wdrażać tego czujnika.

Jeśli ten czujnik jest obecny, musi być obecny odpowiedni czujnik pola magnetycznego, a oba czujniki muszą mieć te same wartości sensor_t.name i sensor_t.vendor .

Kąt zawiasu

Tryb raportowania: W przypadku zmiany

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) zwraca czujnik budzenia

Czujnik kąta zawiasu mierzy kąt w stopniach pomiędzy dwiema integralnymi częściami urządzenia. Oczekuje się, że ruch zawiasu mierzony przez ten typ czujnika zmieni sposób, w jaki użytkownik może wchodzić w interakcję z urządzeniem, na przykład poprzez rozłożenie lub odsłonięcie wyświetlacza.

Czujniki złożone interakcyjne

Niektóre czujniki służą głównie do wykrywania interakcji z użytkownikiem. Nie definiujemy, w jaki sposób te czujniki muszą zostać zaimplementowane, ale muszą mieć małą moc, a za sprawdzenie ich jakości pod kątem doświadczenia użytkownika odpowiada producent urządzenia.

Gest budzenia

Podstawowe czujniki fizyczne: Nieokreślone (cokolwiek o małej mocy)

Tryb raportowania: jednorazowy

Niska moc

Zaimplementuj tylko wersję budzenia tego czujnika.

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) zwraca czujnik budzenia

Czujnik gestu budzenia umożliwia wybudzanie urządzenia na podstawie ruchu specyficznego dla urządzenia. Po uruchomieniu tego czujnika urządzenie zachowuje się tak, jakby naciśnięto przycisk zasilania, włączając ekran. To zachowanie (włączenie ekranu, gdy ten czujnik wyzwala) może być dezaktywowane przez użytkownika w ustawieniach urządzenia. Zmiany w ustawieniach nie wpływają na zachowanie czujnika: tylko to, czy framework włącza ekran, gdy uruchamia się. Rzeczywisty gest, który można wykryć, nie jest określony i może być wybrany przez producenta urządzenia.

Ten czujnik musi mieć niską moc, ponieważ prawdopodobnie zostanie aktywowany 24/7.

Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Odbierz gest

Podstawowe czujniki fizyczne: niezdefiniowane (cokolwiek niskiej mocy)

Mod raportowania: jeden strzał

Niska moc

Zaimplementuj tylko wersję budzenia tego czujnika.

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) zwraca czujnik budzenia

Czujnik gestu odbioru uruchamia się, gdy urządzenie jest zbierane, niezależnie od tego, gdzie było wcześniej (biurko, kieszeń, torba).

Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Spojrzenie gest

Podstawowe czujniki fizyczne: niezdefiniowane (cokolwiek niskiej mocy)

Mod raportowania: jeden strzał

Niska moc

Zaimplementuj tylko wersję budzenia tego czujnika.

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) zwraca czujnik budzenia

Czujnik gestu spojrzenia umożliwia krótkie włączenie ekranu, aby umożliwić użytkownikowi rzucenie zawartości na ekranie na podstawie określonego ruchu. Gdy ten czujnik uruchomi się, urządzenie chwilowo włączy ekran, aby umożliwić użytkownikowi spojrzenie powiadomień lub innej zawartości, gdy urządzenie pozostaje zablokowane w stanie nieinteraktywnym (drzemka), a następnie ekran ponownie się wyłączy. To zachowanie (krótko włączenie ekranu, gdy ten czujnik wyzwala) może zostać dezaktywowane przez użytkownika w ustawieniach urządzenia. Zmiany w ustawieniach nie wpływają na zachowanie czujnika: tylko to, czy framework krótko włącza ekran, gdy uruchamia się. Rzeczywisty gest, który można wykryć, nie jest określony i może być wybrany przez producenta urządzenia.

Ten czujnik musi mieć niską moc, ponieważ prawdopodobnie zostanie aktywowany 24/7. Każde zdarzenie czujnika zgłasza 1 w sensors_event_t.data[0] .

Ograniczone osie czujniki IMU

Dostępne na Androida 13, czujniki IMU ograniczone osie to czujniki obsługujące przypadki użycia, w których nie są dostępne wszystkie trzy osie (x, y, z). Standardowe typy IMU na Androidzie (takie jak SENSOR_TYPE_ACCELEROMETER i SENSOR_TYPE_GYROSCOPE ) Zakładaj, że wszystkie trzy osie są obsługiwane. Jednak nie wszystkie współczynniki i urządzenia obsługują 3-osiowe akcelerometry i 3-osiowe żyroskopy.

Odemy ograniczone akcelerometr

Podstawowe czujniki fizyczne: akcelerometr

Mod raportowania: ciągły

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES) zwraca czujnik bez Wake-up

Czujnik Accelelerometrom Limited Axes jest równoważny z TYPE_ACCELEROMETER , ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.

Ostatnie trzy wartości zdarzeń czujnika zgłoszone przez czujnik reprezentują to, czy obsługiwana jest wartość przyspieszenia osi x, y i z. Wartość 1.0 wskazuje, że oś jest obsługiwana, a wartość 0 wskazuje, że nie jest obsługiwana. Producenci urządzeń identyfikują obsługiwane osie w czasie kompilacji, a wartości nie zmieniają się w czasie wykonywania.

Producenci urządzeń muszą ustawić wartości przyspieszenia dla nieużywanych osi na 0 , zamiast mieć niezdefiniowane wartości.

Gyroscope Limited osie

Leżące u podstaw czujniki fizyczne: żyroskop

Mod raportowania: ciągły

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES) zwraca czujnik bez Wake-up

Czujnik osi Limited Gyroscope jest równoważny z TYPE_GYROSCOPE , ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.

Ostatnie trzy wartości zdarzeń czujnika zgłoszone przez czujnik reprezentują to, czy obsługiwana jest wartość prędkości kątowej dla osi x, y i z. Wartość 1.0 wskazuje, że oś jest obsługiwana, a wartość 0 wskazuje, że nie jest obsługiwana. Producenci urządzeń identyfikują obsługiwane osie w czasie kompilacji, a wartości nie zmieniają się w czasie wykonywania.

Producenci urządzeń muszą ustawić wartości prędkości kątowej dla nieużywanych osi na 0 .

Akcelerometr ograniczony osi nieskrępowane

Podstawowe czujniki fizyczne: akcelerometr

Mod raportowania: ciągły

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED) Zwraca czujnik bez Wake-up

Akcelerometr Limited osi nieinalizowany czujnik jest równoważny z TYPE_ACCELEROMETER_UNCALIBRATED , ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.

Ostatnie trzy wartości zdarzeń czujnika zgłoszone przez czujnik reprezentują, czy obsługiwane są wartości przyspieszenia i odchylenia dla osi x, y i z. Wartość 1.0 wskazuje, że oś jest obsługiwana, a wartość 0 wskazuje, że nie jest obsługiwana. Producenci urządzeń identyfikują obsługiwane osie w czasie kompilacji, a wartości nie zmieniają się w czasie wykonywania.

Producenci urządzeń muszą ustawić wartości przyspieszenia i odchylenia dla nieużywanych osi na 0 .

Żyroskop ograniczony osi nieskrodzone

Leżące u podstaw czujniki fizyczne: żyroskop

Mod raportowania: ciągły

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED) zwraca czujnik bez Wake-up

Gyroskop ograniczony osie nieskalibrowany czujnik jest równoważny z TYPE_GYROSCOPE_UNCALIBRATED , ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.

Ostatnie trzy wartości zdarzeń czujnika zgłoszone przez czujnik reprezentują, czy obsługiwane są prędkość kątowa i dryf dla osi x, y i z. Wartość 1.0 wskazuje, że oś jest obsługiwana, a wartość 0 wskazuje, że nie jest obsługiwana. Producenci urządzeń identyfikują obsługiwane osie w czasie kompilacji, a wartości nie zmieniają się w czasie wykonywania.

Producenci urządzeń muszą ustawić prędkość kątową i dryf dla nieużywanych osi na 0 .

Złożone ograniczone osie IMU

Podstawowe czujniki fizyczne: dowolna kombinacja 3-osiowego akcelerometru, 3-osiowego żyroskopu, 3-osiowego akcelerometru nieskalibrowanego i 3-osiowego gyroskopu nieinlealizowane.

Mod raportowania: ciągły

Złożony czujnik IMU z ograniczonym osiem jest równoważny czujnikowi IMU z ograniczonym osiem, ale zamiast być obsługiwanym w HAL, przekształca dane czujnika 3-osiowego w równoważne warianty ograniczonych osi. Te kompozytowe czujniki są włączone tylko dla urządzeń motoryzacyjnych.

Poniższa tabela pokazuje przykładową konwersję ze standardowego 3-osiowego akcelerometru do akcelerometru z ograniczonymi osiami.

Wartości sensorevent dla sensor_type_accelerometr Przykład sensor_type_accelerometr Sensorevent Kompozytowa sensor_type_accelerometr_limited_axes sensorevent
Wartości [0]

-0.065

-0.065

Wartości [1]

0,078

0,078

Wartości [2]

9.808

9.808

Wartości [3]

Nie dotyczy

1,0

Wartości [4]

Nie dotyczy

1,0

Wartości [5]

Nie dotyczy

1,0

Czujniki samochodowe

Czujniki obsługi motoryzacyjnych przypadków użycia.

Nagłówek

U podstaw czujników fizycznych: każda kombinacja GPS, magnetometru, akcelerometru i żyroskopu.

Mod raportowania: ciągły

getDefaultSensor(SENSOR_TYPE_HEADING) zwraca czujnik bez Wake-up

Dostępny z Androida 13, czujnik nagłówka mierzy kierunek, w którym urządzenie wskazuje na prawdziwe północ w stopnie. Czujnik nagłówka zawiera dwie wartości SensorEvent . Jeden dla zmierzonego nagłówka urządzenia i jeden dla dokładności dostarczonej wartości nagłówka.

Wartości nagłówkowe zgłoszone przez ten czujnik muszą wynosić od 0.0 (włącznie) do 360.0 (wyłącznie), z 0 wskazującymi na północ, 90 wschód, 180 na południe i 270 zachodnich.

Dokładność tego czujnika definiuje się z 68 -procentowym zaufaniem. W przypadku, gdy podstawowy rozkład jest normalny Gaussa, dokładność jest jednym odchyleniem standardowym. Na przykład, jeśli czujnik nagłówka zwraca wartość nagłówka 60 stopni i wartość dokładności 10 stopni, istnieje 68 -procentowe prawdopodobieństwo, że prawdziwy nagłówek wynosi od 50 stopni do 70 stopni.