W tej sekcji opisano osie czujników, czujniki podstawowe i złożone (aktywność, orientacja, brak kalibracji i interakcji).
Osie czujnika
Wartości zdarzeń czujników pochodzące z wielu czujników są wyrażane w ramach określonej klatki, która jest statyczna w stosunku do urządzenia.
Osie urządzenia mobilnego
Interfejs Sensor API działa tylko względem naturalnej orientacji ekranu (osie nie są zastępowane przy zmianie orientacji ekranu urządzenia.
Osie samochodowe
W implementacjach Androida Automotive osie są definiowane w stosunku do ramy nadwozia pojazdu. Punkt początkowy ramki referencyjnej pojazdu to środek tylnej osi. Układ odniesienia pojazdu jest zorientowany tak, aby:
- Oś X jest skierowana w prawo i znajduje się w poziomej płaszczyźnie prostopadłej do płaszczyzny symetrii pojazdu.
- Oś Y jest skierowana do przodu i znajduje się na płaszczyźnie poziomej.
Układ odniesienia pojazdu jest układem współrzędnych prawoskrętnych. Dlatego oś Z jest skierowana do góry.
Oś Z ramki odniesienia jest wyrównana do grawitacji, co oznacza, że oś X i Y są poziome. Dlatego oś Y nie zawsze może przechodzić przez przednią oś.
Czujniki bazowe
Podstawowe typy czujników są nazywane tak samo jak reprezentowane przez nie fizyczne czujniki. Przekazują one dane z jednego czujnika fizycznego (w odróżnieniu od czujników kompozytowych generujących dane z innych czujników). Przykłady typów czujników podstawowych:
SENSOR_TYPE_ACCELEROMETER
SENSOR_TYPE_GYROSCOPE
SENSOR_TYPE_MAGNETOMETER
Czujniki podstawowe nie są jednakowe i nie należy ich mylić z podstawowymi czujnikami fizycznymi. Dane z czujnika podstawowego nie są nieprzetworzonym wyjściem z czujnika fizycznego, ponieważ zostały zastosowane korekty (np. korekta błędów i kompensacja temperatury).
Na przykład właściwości czujnika podstawowego mogą się różnić od właściwości fizycznego czujnika w ramach tych przypadków użycia:
- Element żyroskopu o szerokości zakresu błędu 1 deg/s.
- Po kalibracji fabrycznej i zaaplikowaniu kompensacji temperatury oraz kompensacji błędów rzeczywisty błąd czujnika Androida zostanie zmniejszony, prawdopodobnie do poziomu poniżej 0,01 stopnia na sekundę.
- W takiej sytuacji mówimy, że czujnik na urządzeniu z Androidem ma odchylenie mniejsze niż 0,01 stopnia na sekundę, mimo że w arkuszu danych podrzędnego czujnika podano wartość 1 stopnia na sekundę.
- Barometr o zużyciem energii 100 uW.
- Generowane dane muszą być przesyłane z chipa do SoC, dlatego rzeczywisty koszt energii na zbieranie danych z czujnika barometru Androida może być znacznie wyższy, na przykład 1000 uW.
- W tej sytuacji mówimy, że pobór mocy czujnika Androida wynosi 1000 µW, mimo że pobór mocy zmierzony na przewodach układu barometrycznego wynosi 100 µW.
- Magnetometr, który po kalibracji zużywa 100 uW, ale zużywa więcej podczas kalibracji.
- Rutyna kalibracji może wymagać aktywacji żyroskopu, co zużywa 5000 uW, oraz uruchomienia jakiegoś algorytmu, co kosztuje kolejne 900 uW.
- W tej sytuacji maksymalne zużycie energii przez czujnik Androida (magnetometr) wynosi 6000 uW.
- W tym przypadku średnie zużycie energii jest bardziej przydatnym wskaźnikiem. To właśnie jest podawane w charakterystyce statycznej czujnika w interfejsie HAL.
Akcelerometr
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER)
zwraca czujnik niewybudzony
Akcelerometr rejestruje przyspieszenie urządzenia wzdłuż 3 osi czujnika. Zmierzone przyspieszenie obejmuje zarówno przyspieszenie fizyczne (zmianę prędkości), jak i przyspieszenie grawitacyjne. Pomiar jest raportowany w polach x, y i z parametrusens_event_t.acceleration.
Wszystkie wartości są podawane w jednostkach SI (m/s^2) i mierzą przyspieszenie urządzenia pomniejszone o siła grawitacji wzdłuż 3 osi czujnika.
Oto przykłady:
- Norma (x, y, z) powinna być zbliżona do 0 podczas swobodnego spadania.
- Gdy urządzenie leży na stole i jest popychane w stronę prawą, wartość przyspieszenia x jest dodatnia.
- Gdy urządzenie leży na stole, wartość przyspieszenia wzdłuż osi z wynosi +9,81 alo, co odpowiada przyspieszeniu urządzenia (0 m/s²) pomniejszemu o siła grawitacji (-9,81 m/s²).
- Gdy urządzenie leży płasko na stole i jest wypchnięte w stronę nieba, wartość przyspieszenia jest większa niż +9,81, co odpowiada przyspieszeniu urządzenia (+A m/s^2) pomniejszonemu o siłę grawitacji (-9,81 m/s^2).
Wyniki są kalibrowane za pomocą:
- Kompensacja temperatury
- Kalibracja online z uwzględnieniem stronniczości
- Kalibracja wagi online
Kalibracja błędów i skali musi być aktualizowana tylko wtedy, gdy czujnik jest dezaktywowany, aby uniknąć skoków wartości podczas przesyłania strumieniowego.
Przyspieszeniomierz podaje też dokładność odczytów w wartości sensors_event_t.acceleration.status
. Więcej informacji o możliwych wartościach tego pola znajdziesz w konstantach
SensorManager
SENSOR_STATUS_*
.
temperatura otoczenia;
Tryb raportowania: przy zmianie
getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE)
zwraca czujnik niewybudzony
Ten czujnik mierzy temperaturę otoczenia (w pomieszczeniu) w stopniach Celsjusza.
Czujnik pola magnetycznego
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD)
zwraca czujnik bez funkcji budzenia
SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD
Czujnik pola magnetycznego (zwany też magnetometrem) przekazuje informacje o polu magnetycznym otoczenia zmierzonym wzdłuż 3 osi czujnika.
Pomiar jest raportowany w polach x, y i z w ramach sensors_event_t.magnetic
, a wszystkie wartości są podawane w mikroteslach (uT).
Magnetometr podaje też dokładność odczytów w wartości sensors_event_t.magnetic.status
. Więcej informacji o możliwych wartościach tego pola znajdziesz w konstantach
SensorManager
SENSOR_STATUS_*
.
Wyniki są kalibrowane za pomocą:
- Kompensacja temperatury
- kalibracja żelazka w fabryce (lub online);
- Kalibracja online żelaza
Żyroskop
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_GYROSCOPE)
zwraca czujnik bez funkcji budzenia
Czujnik żyroskopowy podaje szybkość obrotu urządzenia wokół 3 osi.
Obrócenie w zależności od kierunku ruchu wskazówek zegara (zgodnie z zasadą prawej ręki). Oznacza to, że obserwator patrzący z poziomu dodatniego na osi x, y lub z oraz na urządzenie znajdujące się w początku układu współrzędnych zgłaszałby dodatnie obracanie się urządzenia, jeśli urządzenie obracałoby się przeciwnie do ruchu wskazówek zegara. Pamiętaj, że jest to standardowa definicja matematyczna pozytywnej rotacji i nie zgadza się z definicją lotniczą przechylenia.
Pomiar jest raportowany w polach x, y i z sensors_event_t.gyro
. Wszystkie wartości są podawane w radianach na sekundę (rad/s).
Wyniki są kalibrowane za pomocą:
- Kompensacja temperatury
- Kompensacja na skali fabrycznej (lub online)
- Kalibracja uprzedzeń online (aby usunąć dryf)
Żyroskop podaje też dokładność odczytów w ramach sensors_event_t.gyro.status
. Więcej informacji o możliwych wartościach tego pola znajdziesz w konstantach
SensorManager
SENSOR_STATUS_*
.
Żyroskopu nie można emulować z użyciem magnetometrów i akcelerometrów, ponieważ miałoby to mniejszą lokalną spójność i reagowanie. Musi być oparty na zwykłym układzie żyroskopu.
Tętno
Tryb raportowania: przy zmianie
getDefaultSensor(SENSOR_TYPE_HEART_RATE)
zwraca czujnik niewybudzony
Czujnik tętna raportuje bieżące tętno osoby, która dotyka urządzenia.
Obecne tętno w uderzeniach na minutę (BPM) jest wyświetlane w sensors_event_t.heart_rate.bpm
, a stan czujnika – w sensors_event_t.heart_rate.status
. Więcej informacji o możliwych wartościach tego pola znajdziesz w konstantach
SensorManager
SENSOR_STATUS_*
. W szczególności przy pierwszej aktywacji, o ile nie wiadomo, że urządzenie nie znajduje się na ciele, pole stanu pierwszego zdarzenia musi mieć wartość SENSOR_STATUS_UNRELIABLE
. Ponieważ ten czujnik jest aktywny, zdarzenia są generowane tylko wtedy, gdy od ostatniego zdarzenia zmieniły się wartości heart_rate.bpm
lub heart_rate.status
. Zdarzenia są generowane nie szybciej niż co sampling_period
.
sensor_t.requiredPermission
to zawsze SENSOR_PERMISSION_BODY_SENSORS
.
Jasny
Tryb raportowania: Zmiana
getDefaultSensor(SENSOR_TYPE_LIGHT)
zwraca czujnik niewybudzający
Czujnik światła podaje aktualne natężenie oświetlenia w jednostkach SI luksów.
Pomiar jest raportowany w sensors_event_t.light
.
Bliskość
Tryb raportowania: Zmiana
Zwykle definiowany jako czujnik pobudki
getDefaultSensor(SENSOR_TYPE_PROXIMITY)
zwraca czujnik wybudzania
Czujnik zbliżeniowy podaje odległość od czujnika do najbliższej widocznej powierzchni.
Do wersji 4.4 Androida czujniki zbliżeniowe zawsze były czujnikami aktywującymi, które aktywowały SoC po wykryciu zmiany odległości. Po Androidzie 4.4 zalecamy, aby najpierw wdrożyć wersję wybudzającą tego czujnika, ponieważ to ona służy do włączania i wyłączania ekranu podczas nawiązywania połączeń.
Wymiar jest podany w centymetrach w sensors_event_t.distance
. Pamiętaj, że niektóre czujniki zbliżeniowe obsługują tylko pomiar binarny „w pobliżu” lub „daleko”.
W tym przypadku czujnik podaje wartość sensor_t.maxRange
w stanie „daleko” oraz wartość mniejszą niż sensor_t.maxRange
w stanie „blisko”.
Ciśnienie
Tryb raportowania: Ciągły
getDefaultSensor(SENSOR_TYPE_PRESSURE)
zwraca czujnik bez funkcji budzenia
Czujnik ciśnienia (zwanym też barometrem) podaje ciśnienie atmosferyczne w hektopaskale (hPa).
Wyniki są kalibrowane za pomocą
- Kompensacja temperatury
- Kalibracja odchylenia fabrycznego
- Kalibracja wagi fabrycznej
Barometr jest często używany do szacowania zmian wysokości. Aby oszacować bezwzględną wysokość, należy użyć ciśnienia na poziomie morza (zmieniającego się w zależności od pogody) jako wartości referencyjnej.
Wilgotność względna
Tryb raportowania: Zmiana
getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY)
zwraca czujnik bez funkcji budzenia
Czujnik wilgotności względnej mierzy względną wilgotność powietrza w otoczeniu i zwraca wartość w procentach.
Typy czujników złożonych
Czujnik złożony generuje dane przez przetwarzanie 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 złożonych:
- Detektor kroków i detektor znacznego ruchu, które zwykle działają na podstawie akcelerometru, ale mogą też korzystać z innych czujników, jeśli pobór mocy i dokładność są do zaakceptowania.
- Wektor obrotu gry na podstawie akcelerometru i żyroskopu.
- Żyroskop bez kalibracji, który jest podobny do czujnika podstawy żyroskopu, ale z kalibracją biasu zgłaszaną osobno zamiast być korygowana w pomiarach.
Podobnie jak w przypadku czujników podstawowych, właściwości czujników złożonych pochodzą z właściwości ich danych końcowych. Na przykład zużycie energii wektora obrotu w grze jest prawdopodobnie równe sumie zużycia energii przez układ akcelerometru, układ żyroskopu, układ przetwarzania danych i szyny przesyłające dane. Innym przykładem jest dryft wektora obrotu gry, który zależy zarówno od jakości algorytmu kalibracji, jak i od właściwości fizycznych czujnika.
W tabeli poniżej znajdziesz dostępne typy czujników złożonych. Każdy czujnik złożony korzysta z danych z jednego lub kilku czujników fizycznych. Unikaj stosowania w przybliżeniu wyników innych czujników fizycznych, które mają negatywny wpływ na wygodę użytkowników.
Typ czujnika | Kategoria | Podstawowe czujniki fizyczne | Tryb raportowania |
---|---|---|---|
Postawa |
Akcelerometr, żyroskop – NIE UŻYWAĆ magnetometru |
Ciągły |
|
Postawa |
Akcelerometr, magnetometr, NIE UŻYWAĆ żyroskopu |
Ciągły |
|
Gest rzut oka | Interakcja |
Niezdefiniowana |
One-shot |
Postawa |
Akcelerometr, żyroskop |
Ciągły |
|
Nieskalibrowany |
Żyroskop |
Ciągły |
|
Aktywność |
Akcelerometr, żyroskop (jeśli jest dostępny) lub magnetometr (jeśli go nie ma) |
Ciągły |
|
Nieskalibrowany |
Magnetometr |
Ciągły |
|
Orientacja (wycofana) |
Postawa |
akcelerometr, magnetometr, żyroskop (jeśli jest dostępny). |
Ciągły |
Interakcja |
Niezdefiniowana |
One-Shot |
|
Postawa |
Akcelerometr, magnetometr, żyroskop |
Ciągły |
|
Aktywność |
Akcelerometr (lub inny, o bardzo małej mocy) |
One-Shot |
|
Aktywność |
Akcelerometr |
W trakcie zmiany |
|
Aktywność |
Akcelerometr |
Specjalny |
|
Aktywność |
Akcelerometr |
Specjalny |
|
Interakcja |
Niezdefiniowana |
Jednorazowe |
= czujnik słabej mocy
Czujniki złożone aktywności
Przyspieszenie liniowe
Podstawowe czujniki fizyczne: akcelerometr i (jeśli jest dostępny) żyroskop (lub magnetometr, jeśli nie ma żyroskopu).
Tryb raportowania: ciągły.
getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION)
zwraca czujnik niewybudzony
Czujnik przyspieszenia liniowego zgłasza przyspieszenie liniowe urządzenia w ramce czujnika, bez uwzględniania grawitacji.
Ogólnie dane wyjściowe to: dane wyjściowe akcelerometru minus dane wyjściowe czujnika grawitacyjnego. Wartość ta jest podawana w m/s^2 w polach x, y i z w metryczce sensors_event_t.acceleration
.
Gdy urządzenie jest nieruchome, odczyty na wszystkich osiach powinny być zbliżone do 0.
Jeśli urządzenie ma żyroskop, czujnik przyspieszenia liniowego musi używać jako danych wejściowych żyroskopu i akcelerometru.
Jeśli urządzenie nie jest wyposażone w żyroskop, czujnik przyspieszenia liniowego musi używać jako danych wejściowych akcelerometru i magnetometru.
Znaczny ruch
Podstawowy czujnik fizyczny: akcelerometr (lub inny, o niskim poborze mocy).
Tryb raportowania: jednorazowy.
Niski poziom energii
Zaimplementuj tylko wersję wybudzającą tego czujnika.
getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION)
zwraca czujnik wybudzania
Detektor znaczącego ruchu uruchamia się, gdy wykryje znaczący ruch, czyli taki, który może spowodować zmianę lokalizacji użytkownika.
Przykłady takich znaczących ruchów:
- pieszo lub rowerem;
- Siedzenie w samochodzie, autokarze lub pociągu
Przykłady sytuacji, które nie powodują wykrycia znacznego ruchu:
- Telefon w kieszeni, a osoba się nie rusza
- Telefon leży na stole, który lekko się trzęsie z powodu ruchu ulicznego lub pralki.
Ogólnie rzecz biorąc, czujnik ruchu jest używany do zmniejszenia poboru mocy 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 korzystają z znaczącego ruchu, aby włączyć urządzenie, gdy użytkownik zmienia lokalizację.
Ten czujnik musi być niskonapięciowy. W tym trybie zużycie energii jest mniejsze, ale może to spowodować niewielką liczbę wyników fałszywie negatywnych. Robimy to z kilku powodów:
- Czujnik oszczędza energię.
- Wywoływanie zdarzenia, gdy użytkownik się nie porusza (fałszywie pozytywny wynik), jest kosztowne pod względem zapotrzebowania na moc, dlatego należy tego unikać.
- Nieuruchamianie zdarzenia, gdy użytkownik się przemieszcza (fałszywie negatywny wynik) jest dopuszczalne, o ile nie jest wykonywane wielokrotnie. Jeśli użytkownik szedł przez 10 sekund, nie wywołanie zdarzenia w ciągu tych 10 sekund jest niedopuszczalne.
Każde zdarzenie czujnika jest rejestrowane w sensors_event_t.data[0]
jako 1
.
Detektor kroków
Umiejscowiony czujnik fizyczny: akcelerometr (i ewentualnie inne, z powodu małej mocy)
Tryb raportowania: Specjalny (jedno zdarzenie na każdy wykonany krok)
Niski poziom energii
getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR)
zwraca czujnik niewybudzony
Wykrywanie kroków generuje zdarzenie za każdym razem, gdy użytkownik wykona dany krok.
Sygnatura czasowa zdarzenia sensors_event_t.timestamp
odpowiada momentowi, w którym stopa dotknęła ziemi, co powoduje dużą zmianę przyspieszenia.
W porównaniu z licznikiem kroków licznik kroków powinien mieć krótszy czas oczekiwania (mniej niż 2 sekundy). Zarówno licznik kroków, jak i detektor kroków wykrywają, kiedy użytkownik chodzi, biega i wchodzi po schodach. Nie powinny aktywować się, gdy użytkownik jeździ na rowerze, samochodem lub innym pojazdem.
Ten czujnik musi być niskonapięciowy. Oznacza to, że jeśli wykrywanie kroków nie jest możliwe na poziomie sprzętu, nie należy definiować tego czujnika. W szczególności, gdy detektor kroków jest włączony, a akcelerometr nie, przerywane są tylko kroki (a nie każdy odczyt akcelerometru).
sampling_period_ns
nie ma wpływu na liczniki kroków.
Każde zdarzenie czujnika jest rejestrowane w sensors_event_t.data[0]
jako 1
.
Licznik kroków
Podstawowy czujnik fizyczny: akcelerometr (+ inne, o ile mają niskie zużycie energii).
Tryb raportowania: Zmiana
Niski poziom energii
getDefaultSensor(SENSOR_TYPE_STEP_COUNTER)
zwraca czujnik niewybudzający
Licznik kroków podaje liczbę kroków wykonanych przez użytkownika od ostatniego ponownego uruchomienia urządzenia, gdy licznik był włączony.
Pomiar jest zgłaszany jako uint64_t
w sensors_event_t.step_counter
i jest resetowany do zera tylko po ponownym uruchomieniu systemu.
Sygnatura czasowa zdarzenia jest ustawiona na czas wykonania ostatniego kroku związanego z tym zdarzeniem.
Informacje o czasie wykonania kroku znajdziesz w typie czujnika Step detector.
W porównaniu z detektorem kroków licznik kroków może mieć dłuższy czas reakcji (do 10 sekund). Dzięki temu opóźnieniu czujnik ma wysoką dokładność. Liczba kroków po całym dniu pomiarów powinna mieścić się w 10% rzeczywistej liczby kroków. Zarówno wykrywacz kroków, jak i licznik kroków wykrywają, kiedy użytkownik idzie, biega i wchodzi po schodach. Nie powinny się aktywować, gdy użytkownik jeździ na rowerze, samochodem lub innym pojazdem.
Sprzęt musi zapewnić, że wewnętrzna liczba kroków nigdy nie przekroczy wartości maksymalnej. Minimalny rozmiar wewnętrznego licznika sprzętu to 16 bitów. W przypadku zbliżającego się przepełnienia (co najwyżej co ~2^16 kroków) SoC może zostać uaktywiona, aby sterownik mógł przeprowadzić konserwację licznika.
Jak opisano w sekcji Interakcja, podczas działania tego czujnika nie może on zakłócać działania innych czujników, w szczególności akcelerometru, który może być używany.
Jeśli dane urządzenie nie obsługuje tych trybów działania, HAL nie może zgłaszać tego typu czujnika. Oznacza to, że nie można „zasymulować” tego czujnika w HAL.
Ten czujnik musi być niskonapięciowy. Oznacza to, że jeśli wykrywania kroków nie można wykonać sprzętowo, czujnik nie powinien być zdefiniowany. W szczególności, gdy licznik kroków jest włączony, a akcelerometr nie jest, przerwy powinny być wywoływane tylko przez kroki (a nie dane z akcelerometru).
Czujnik przechylenia
Umiejscowiony czujnik fizyczny: akcelerometr (i ewentualnie inne, z powodu małej mocy)
Tryb raportowania: Specjalny
Mała moc
Wdrożyć tylko wersję tego czujnika, która umożliwia jego aktywację.
getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR)
zwraca czujnik wybudzania
Detektor przechyłu generuje zdarzenie za każdym razem, gdy wykryje przechylenie.
Zdarzenie przechylenia jest zdefiniowane przez kierunek zmiany średniej siły grawitacji w oknie 2-sekundowym o co najmniej 35 stopni od momentu aktywacji lub ostatniego zdarzenia wygenerowanego przez czujnik. Oto algorytm:
reference_estimated_gravity
= średnia z pomiary akcelerometru w pierwszej sekundzie po aktywacji lub szacunkowa wartość przyspieszenia grawitacyjnego w momencie wygenerowania ostatniego zdarzenia pochylenia.current_estimated_gravity
= średnia z pomiarów akcelerometru w ciągu ostatnich 2 sekund.- Wywołuj, gdy
angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees
Duże przyspieszenia bez zmiany orientacji telefonu nie powinny powodować zdarzenia pochylenia. Na przykład ostre skręcanie kierownicą lub gwałtowne przyspieszanie podczas jazdy samochodem nie powinno powodować zdarzenia przechylenia, mimo że średni kąt przyspieszenia może się zmieniać o ponad 35 stopni.
Zazwyczaj czujnik wdraża się wyłącznie za pomocą akcelerometru. Można też używać innych czujników, jeśli nie zwiększają one znacząco zużycia energii. To czujnik o małej mocy, który powinien umożliwić przejście układu SoC w tryb zawieszenia. Nie emuluj tego czujnika w HAL. Każde zdarzenie czujnika zgłasza 1
w sensors_event_t.data[0]
.
Czujniki złożone dotyczące orientacji
Wektor obrotu
Podstawowe czujniki fizyczne: akcelerometr, magnetometr i żyroskop
Tryb raportowania: ciągły.
getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR)
zwraca czujnik nie wybudzony
Czujnik wektor obrotu informuje o orientacji urządzenia względem układu współrzędnych Wschód-Północ-W górę. Zwykle jest ona uzyskiwana przez zintegrowanie odczytów akcelerometru, żyroskopu i magnetometru. System współrzędnych Wschód-Północ-W górę jest zdefiniowany jako bezpośrednia baza ortonormalna, w której:
- X wskazuje na wschód i jest styczny do ziemi.
- Y wskazuje północ i jest styczny do powierzchni ziemi.
- Z wskazuje niebo i jest prostopadły do ziemi.
Orientacja telefonu jest reprezentowana przez obrót potrzebny do dopasowania współrzędnych Wschód-Północ-W górę do współrzędnych telefonu. Oznacza to, że zastosowanie obrotu do układu odniesienia świata (X,Y,Z) dopasowuje go do współrzędnych telefonu (x,y,z).
Obrót telefonu można zaobserwować jako obrót telefonu o kąt theta wokół osi rot_axis
i przejście z orientacji urządzenia (wyrównanie wschód-północ w górę) do bieżącej orientacji. Obrót jest kodowany jako 4 wartości bezwymiarowe (x, y, z, w) składowe jednostkowego kwadratu:
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 obiektu
rot_axis
to współrzędne wschód-północ-góra wektora jednostkowego długości, który reprezentuje oś obrotu. theta
to kąt obrotu
Kwaternion jest jednostkowym kwaternionem: jego norma musi wynosić 1
.
Jeśli tego nie zrobisz, może to spowodować nieprawidłowe działanie klienta.
Ten czujnik podaje też szacowaną 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. Ten czujnik musi używać żyroskopu jako głównego wejścia zmiany orientacji.
Ten czujnik wykorzystuje też dane z akcelerometru i magnetometru, aby kompensować dryft żyroskopu. Nie można go zaimplementować, używając tylko 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 niewybudzający
Sensor wektora obrotu w grze jest podobny do sensora wektora obrotu, ale nie wykorzystuje pola geomagnetycznego. Dlatego oś Y nie wskazuje na północ, ale na inny punkt odniesienia. Ten punkt odniesienia może się przesuwać o ten sam rząd wielkości co przesuwanie się żyroskopu wzdłuż osi Z.
Szczegółowe informacje o ustawianiu sensors_event_t.data[0-3]
znajdziesz w sekcji dotyczącej czujnika Wektor obrotu. Ten czujnik nie zgłasza szacowanej dokładności nagłówka: pole sensors_event_t.data[4]
jest zarezerwowany i powinien być ustawiony na 0
.
W idealnym przypadku telefon, który został obrócony i zwrócony do tej samej orientacji w świecie rzeczywistym, powinien zgłaszać ten sam wektor obrotu w grze.
Ten czujnik musi być oparty na żyroskopie i akcelerometrze. Nie może używać magnetometru jako danych wejściowych, z wyjątkiem pośredniego szacowania na podstawie błędu żyroskopu.
Grawitacja
Podstawowe czujniki fizyczne: akcelerometr i (jeśli jest dostępny) żyroskop (lub magnetometr, jeśli nie ma żyroskopu).
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_GRAVITY)
zwraca czujnik niewybudzony
Czujnik grawitacji zgłasza kierunek i siłę grawitacji we współrzędnych urządzenia.
Składniki wektora grawitacji są podawane jako m/s^2 w polach x, y i z sensors_event_t.acceleration
.
Gdy urządzenie jest nieruchome, dane z czujnika grawitacyjnego powinny być identyczne z danymi z akcelerometru. Na Ziemi prędkość wynosi około 9, 8 m/s^2.
Jeśli urządzenie jest wyposażone w żyroskop, czujnik grawitacji musi używać żyroskopu i akcelerometru.
Jeśli urządzenie nie ma żyroskopu, czujnik przyspieszenia musi używać akcelerometru i magnetometru jako danych wejściowych.
Wektor rotacji geomagnetycznej
Podstawowe czujniki fizyczne: akcelerometr i magnetometr (bez żyroskopu)
Tryb raportowania: ciągły.
Niski poziom energii
getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR)
zwraca czujnik bez funkcji budzenia
Geomagnetyczny wektor obrotu jest podobny do czujnika wektora obrotowego, ale używa magnetometru (bez żyroskopu).
Ten czujnik musi być oparty na magnetomierzu. Nie można go zaimplementować za pomocą żyroskopu, a ten czujnik nie może używać danych z żyroskopu.
Szczegółowe informacje o ustawianiu sensors_event_t.data[0-4]
znajdziesz w sekcji dotyczącej czujnika Wektor obrotu.
Podobnie jak w przypadku czujnika wektorowego obrotu, błąd kursu musi być mniejszy od szacowanej dokładności (sensors_event_t.data[4]
) w 95% przypadków.
Czujnik musi zużywać niewiele energii, więc musi być wbudowany w sprzęt.
Orientacja (wycofana)
Bazowe czujniki fizyczne: akcelerometr, magnetometr i żyroskop (jeśli jest dostępny)
Tryb raportowania: ciągły.
getDefaultSensor(SENSOR_TYPE_ORIENTATION)
zwraca czujnik bez funkcji budzenia
Uwaga: jest to starszy typ czujnika, który został wycofany z pakietu SDK Androida. Został on zastąpiony przez czujnik wektora obrotu, który jest lepiej zdefiniowany. Jeśli to możliwe, użyj czujnika wektorów obrotu nad czujnikiem orientacji.
Czujnik orientacji informuje o orientacji urządzenia. Pomiary są raportowane w stopniach w kolumnach x, y i z w pliku sensors_event_t.orientation
:
sensors_event_t.orientation.x
: azymut, kąt między kierunkiem magnetycznego północy 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
: pochylenie, obrót wokół osi X (-180<=pitch<=180
), wartości dodatnie, gdy oś Z przesuwa się w kierunku osi Y.sensors_event_t.orientation.z
: obrót wokół osi Y (-90<=roll<=90
), z dodatnimi wartościami, gdy oś X przesuwa się w kierunku osi Z.
Z powodów historycznych kąt obrócenia jest dodatni w kierunku zgodnym z ruchem wskazówek zegara. (z matematycznego punktu widzenia powinien być dodatni w kierunku przeciwnym do ruchu wskazówek zegara):
Ta definicja różni się od skrętu, pochylenia i oscylacji stosowanych w lotnictwie, gdzie oś X jest wzdłuż dłuższego boku samolotu (od ogona do nosa).
Czujnik orientacji podaje też, jak dokładne są jego odczyty, za pomocą wartości sensors_event_t.orientation.status
. Aby dowiedzieć się więcej o możliwych wartościach w tym polu, sprawdź stałe
SENSOR_STATUS_*
SensorManager
.
Nieskalibrowane czujniki
Nieskalibrowane czujniki zapewniają bardziej surowe wyniki i mogą zawierać pewne odchylenia, ale również mniej „przeskoków” wynikających z poprawek wprowadzonych podczas kalibracji. Niektóre aplikacje mogą preferować te wyniki bez kalibracji, ponieważ są one płynniejsze i bardziej niezawodne. Jeśli na przykład aplikacja próbuje przeprowadzić własną fuzję czujników, wprowadzenie kalibracji może zniekształcić wyniki.
Akcelerometr nieskalibrowany
Bazowy czujnik fizyczny: akcelerometr
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED)
zwraca czujnik niewybudzający
Nieskalibrowany czujnik akcelerometru zgłasza przyspieszenie urządzenia wzdłuż 3 osi czujnika bez żadnej korekty tendencyjności (w przypadku nieskalibrowanych pomiarów jest stosowane odchylenie fabryczne i kompensacja temperatury) wraz z jego oszacowaniem.
Wszystkie wartości są wyrażone w jednostkach SI (m/s^2) i są raportowane w polach sensors_event_t.uncalibrated_accelerometer
:
x_uncalib
: przyspieszenie (bez kompensacji odchylenia) wzdłuż osi Xy_uncalib
: przyspieszenie (bez kompensacji błędów) na osi Yz_uncalib
: przyspieszenie (bez kompensacji błędów) na osi Zx_bias
: szacowana tendencja na osi Xy_bias
: szacowany odchylenie na osi Yz_bias
: oszacowany bias na osi Z
nieskalibrowany żyroskop;
Bazowy czujnik fizyczny: żyroskop
Tryb raportowania: ciągły.
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED)
zwraca czujnik bez funkcji budzenia
Nieskalibrowany żyroskop raportuje szybkość obrotu wokół osi czujnika bez stosowania kompensacji odchylenia do nich wraz z oszacowaniem odchylenia. Wszystkie wartości są wyrażone w radianach na sekundę i raportowane w polach sensors_event_t.uncalibrated_gyro
:
x_uncalib
: prędkość kątowa (bez kompensacji dryfu) wokół osi Xy_uncalib
: prędkość kątowa (bez kompensacji dryfu) wzdłuż osi Yz_uncalib
: prędkość kątowa (bez kompensacji dryfu) wokół osi Zx_bias
: szacunkowa odchyłka wokół osi Xy_bias
: szacunkowa odchyłka wokół osi Yz_bias
: szacunkowa odchyłka wokół osi Z
Zasadniczo nieskalibrowany pomiar to suma skalibrowanego pomiaru i szacowanej wartości odchylenia: _uncalibrated = _calibrated + _bias
.
Wartości x_bias
, y_bias
i z_bias
powinny gwałtownie się zmieniać, gdy tylko zmieni się szacowana wartość stronniczości, a pozostały czas powinny być stabilne.
Szczegółowe informacje o użytym układzie współrzędnych znajdziesz w definicji czujnika żyroskopu.
pomiary muszą być skalibrowane fabrycznie i skorygowane pod kątem temperatury; Musisz też zaimplementować szacowanie dryfu żyroskopu, aby można było raportować rozsądne szacunki w elementach x_bias
, y_bias
i z_bias
. Jeśli implementacja nie jest w stanie oszacować dryftu, nie należy stosować tego czujnika.
Jeśli ten czujnik jest obecny, musi być też obecny odpowiedni czujnik żyroskopu. Oba czujniki muszą mieć te same wartości sensor_t.name
i sensor_t.vendor
.
Nieskalibrowane pole magnetyczne
Bazowy czujnik fizyczny: magnetometr
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED)
zwraca czujnik niewybudzony
Nieskalibrowany czujnik pola magnetycznego podaje dane o otoczonym polu magnetycznym wraz z szacowaną kalibracją na twardym rdzeniu. Wszystkie wartości są podawane w mikroteslach (uT) i są raportowane w polach sensors_event_t.uncalibrated_magnetic
:
x_uncalib
: pole magnetyczne (bez kompensacji twardego żelaza) wzdłuż osi Xy_uncalib
: pole magnetyczne (bez kompensacji twardego żelaza) na osi Yz_uncalib
: pole magnetyczne (bez kompensacji twardego żelaza) na osi Zx_bias
: szacowana tendencja do stosowania nieuprawnionego oprogramowania na osi Xy_bias
: szacowana wartość błędu twardego na osi Yz_bias
: szacowany współczynnik biasu na osi Z
Zasadniczo nieskalibrowany pomiar to suma skalibrowanego pomiaru i szacowanej wartości odchylenia: _uncalibrated = _calibrated + _bias
.
Nieskalibrowany magnetometr pozwala algorytmom wyższego poziomu na obsługę złej estymacji twardego żelaza. Wartości x_bias
, y_bias
i z_bias
powinny wzrosnąć, gdy tylko zmieni się szacowana wartość sprzętu. Następnie powinny pozostać stabilne.
W przypadku pomiarów należy zastosować kalibrację na zimno i kompensację temperatury. Aby można było raportować uzasadnione szacunki za pomocą funkcji x_bias
, y_bias
i z_bias
, należy też wdrożyć szacunki oparte na żelazach twardych. Jeśli implementacja nie jest w stanie oszacować wartości przesunięcia, nie należy stosować 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: Zmiana
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
zwraca czujnik przebudzenia
Czujnik kąta zawiasu mierzy kąt w stopniach między dwoma integralnymi częściami urządzenia. Ruch zawiasu mierzony przez ten typ czujnika powinien zmieniać sposób interakcji użytkownika z urządzeniem, na przykład przez rozkładanie lub odsłanianie wyświetlacza.
Czujniki złożone interakcji
Niektóre czujniki służą głównie do wykrywania interakcji z użytkownikiem. Nie określamy sposobu implementacji tych czujników, ale muszą one zużywać niewiele energii. Sprawdzenie jakości tych czujników pod kątem wrażeń użytkownika leży po stronie producenta urządzenia.
Gest wybudzania
Bazowe czujniki fizyczne: nieokreślone (dowolna moc)
Tryb raportowania: jednorazowy.
Niski poziom energii
Zaimplementuj tylko wersję wybudzającą tego czujnika.
getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE)
zwraca czujnik wybudzania
Czujnik gestów umożliwia wybudzanie urządzenia za pomocą określonego ruchu. Gdy czujnik aktywuje się, urządzenie zachowuje się tak, jakby naciśnięto przycisk zasilania, i włączył ekran. Użytkownik może wyłączyć to zachowanie (włączanie ekranu po aktywacji tego czujnika) w ustawieniach urządzenia. Zmiany w ustawieniach nie wpływają na działanie czujnika: tylko na to, czy framework włącza ekran po uruchomieniu. Nie określa się dokładnego gestu, który ma być wykrywany. Może go wybrać producent urządzenia.
Czujnik musi mieć niski pobór mocy, ponieważ będzie prawdopodobnie aktywny przez całą dobę.
Każde zdarzenie z czujnika zgłasza 1
za sensors_event_t.data[0]
.
Gest podnoszenia
Podstawowe czujniki fizyczne: nieokreślone (cokolwiek o niskiej mocy)
Tryb raportowania: jednorazowy.
Niski poziom energii
Wdrożyć tylko wersję tego czujnika, która umożliwia jego aktywację.
getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE)
zwraca czujnik wybudzania
Czujnik gestów podnoszenia uruchamia się, gdy podnosisz urządzenie, niezależnie od tego, gdzie się ono znajdowało wcześniej (na biurku, w kieszeni lub torebce).
Każde zdarzenie czujnika jest rejestrowane w sensors_event_t.data[0]
jako 1
.
Gest rzutu oka
Podstawowe czujniki fizyczne: nieokreślone (cokolwiek o niskiej mocy)
Tryb raportowania: jednorazowy.
Niski poziom energii
Wdrożyć tylko wersję tego czujnika, która umożliwia jego aktywację.
getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)
zwraca czujnik wybudzania
Czujnik gestów w ramach funkcji spojrzenia umożliwia krótkie włączenie ekranu i umożliwienie użytkownikowi spojrzenia na zawartość ekranu w związku z określonym ruchem. Gdy ten czujnik zostanie uruchomiony, urządzenie chwilowo włączy ekran, aby umożliwić użytkownikowi przeglądanie powiadomień lub innych treści, przy jednoczesnym pozostaniu w zamkniętym stanie (w trybie uśpienia). Następnie ekran ponownie się wyłączy. To zachowanie (krótkie włączanie ekranu po aktywacji czujnika) może zostać wyłączone przez użytkownika w ustawieniach urządzenia. Zmiany w ustawieniach nie wpływają na działanie czujnika: tylko na to, czy framework krótko włącza ekran po jego uruchomieniu. Nie określa się, jaki gest ma być wykrywany, a producent urządzenia może wybrać dowolny gest.
Ten czujnik musi mieć małą moc, ponieważ prawdopodobnie będzie aktywny przez całą dobę, 7 dni w tygodniu.
Każde zdarzenie czujnika jest rejestrowane w 1
w sensors_event_t.data[0]
.
Czujniki IMU z ograniczoną liczbą osi
Czujniki IMU z ograniczoną liczbą osi są dostępne od Androida 13. Takie czujniki obsługują przypadki użycia, w których nie są dostępne wszystkie 3 osi (x, y, z). Standardowe typy IMU w Androidzie (np.
SENSOR_TYPE_ACCELEROMETER
i
SENSOR_TYPE_GYROSCOPE
)
zakładają, że obsługiwane są wszystkie 3 osi. Nie wszystkie formaty i urządzenia obsługują akcelerometry i 3-osiowe żyroskopy.
Ograniczone osie akcelerometru
Bazowe czujniki fizyczne: akcelerometr
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES)
zwraca czujnik niewybudzony
Czujnik ograniczonych osi akcelerometru jest odpowiednikiem czujnika TYPE_ACCELEROMETER
, ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.
Ostatnie 3 wartości zdarzeń czujnika zwracane przez czujnik wskazują, czy wartości przyspieszenia dla osi X, Y i Z są obsługiwane. Wartość 1.0
oznacza, że oś jest obsługiwana, a wartość 0
oznacza, że nie jest obsługiwana. Producenci urządzeń określają obsługiwane osie w czasie kompilacji, a ich wartości nie zmieniają się w czasie działania.
Producenci urządzeń muszą ustawić wartości przyspieszenia dla nieużywanych osi na
0
, zamiast nieokreślonych wartości.
Ograniczone osie żyroskopu
Podrzędne czujniki fizyczne: żyroskop
Tryb raportowania: Ciągły
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES)
zwraca czujnik niewybudzony
Czujnik z ograniczonymi osiami żyroskopu jest odpowiednikiem TYPE_GYROSCOPE
, ale obsługuje przypadki, w których nie są obsługiwane 1 lub 2 osi.
Ostatnie 3 wartości zdarzeń czujnika zgłaszane przez czujnik wskazują, 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 ona obsługiwana. Producenci urządzeń identyfikują obsługiwane osie w czasie kompilacji, a wartości nie zmieniają się w czasie działania.
Producenci urządzeń muszą w przypadku nieużywanych osi ustawić wartości prędkości kątowej na 0
.
Akcelerometr: nieskalibrowane osie ograniczone
Bazowe czujniki fizyczne: akcelerometr
Tryb raportowania: Ciągły
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED)
zwraca czujnik niewybudzony
Nieskalibrowany czujnik z ograniczonymi osiami akcelerometru jest odpowiednikiem czujnika TYPE_ACCELEROMETER_UNCALIBRATED
, ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.
Ostatnie 3 wartości zdarzeń czujnika zwracane przez czujnik wskazują, czy wartości przyspieszenia i błądu dla osi X, Y i Z są obsługiwane. Wartość 1.0
oznacza, że oś jest obsługiwana, a wartość 0
oznacza, że nie jest obsługiwana. Producenci urządzeń określają obsługiwane osie w czasie kompilacji, a ich wartości nie zmieniają się w czasie działania.
Producenci urządzeń muszą ustawić wartości przyspieszenia i odchylenia dla nieużywanych osi na 0
.
Nieskalibrowane osie z ograniczonym dostępem do danych z żyroskopu
Podrzędne czujniki fizyczne: żyroskop
Tryb raportowania: Ciągły
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED)
zwraca czujnik niewybudzający
Nieskalibrowany czujnik z ograniczonymi osiami żyroskopu jest odpowiednikiem czujnika TYPE_GYROSCOPE_UNCALIBRATED
, ale obsługuje przypadki, w których jedna lub dwie osie nie są obsługiwane.
Ostatnie 3 wartości zdarzeń czujnika zwracane przez czujnik wskazują, czy wartości prędkości kątowej i odchylenia dla osi X, Y i Z są obsługiwane. Wartość 1.0
wskazuje, że oś jest obsługiwana, a wartość 0
wskazuje, że nie jest ona obsługiwana. Producenci urządzeń określają obsługiwane osie w czasie kompilacji, a ich wartości nie zmieniają się w czasie działania.
Producenci urządzeń muszą ustawić wartości prędkości kątowej i odchylenia dla nieużywanych osi na 0
.
IMU z ośami ograniczonymi złożonymi
Podstawowe czujniki fizyczne: dowolna kombinacja 3-osiowego akcelerometru, 3-osiowego żyroskopu, nieskalibrowanego 3-osiowego akcelerometru i nieskalibrowanych 3-osiowych czujników żyroskopu.
Tryb raportowania: Ciągły
Kompozytowy czujnik IMU o ograniczonych osiach jest odpowiednikiem czujnika IMU o ograniczonych osiach, ale nie jest obsługiwany przez HAL, ale przekształca dane 3-osiowego czujnika w odpowiadające im wersje z ograniczonymi osiami. Te czujniki złożone są dostępne tylko w przypadku urządzeń samochodowych.
Poniższa tabela pokazuje przykładową konwersję standardowego 3-osiowego akcelerometru na złożony akcelerometr z ograniczoną liczbą osi.
Wartości SensorEvent dla SENSOR_TYPE_ACCELEROMETER | Przykładowe zdarzenie SENSOR_TYPE_ACCELEROMETER SensorEvent | Złożony typ SensorEvent SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES |
---|---|---|
values[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 |
values[4] | Nie dotyczy |
1,0 |
values[5] | Nie dotyczy |
1,0 |
Czujniki samochodowe
Czujniki do obsługi zastosowań w branży motoryzacyjnej.
Nagłówek
Podstawowe czujniki fizyczne: dowolna kombinacja czujników GPS, magnetycznych, akcelerometrów i żyroskopów.
Tryb raportowania: ciągły
getDefaultSensor(SENSOR_TYPE_HEADING)
zwraca czujnik bez funkcji budzenia
Czujnik kierunku dostępny w Androidzie 13 mierzy kierunek, w którym urządzenie jest skierowane względem geograficznego północy w stopniach. Czujnik nagłówka zawiera dwie wartości SensorEvent
.
1 dla nagłówka mierzonego urządzenia, a druga dla dokładności podanej wartości nagłówka.
Wartości kierunku podawane przez ten czujnik muszą mieścić się w zakresie od 0.0
(włącznie) do 360.0
(wyłącznie), przy czym 0
oznacza północ, 90
– wschód, 180
– południe, a 270
– zachód.
Dokładność tego czujnika jest określona na poziomie 68-procentowego poziomu ufności. W przypadku, gdy podstawą rozkładu jest norma Gaussa, dokładność wynosi jedno odchylenie standardowe. Jeśli na przykład czujnik kierunku zwraca wartość 60° i wartość dokładności 10°, prawdopodobieństwo, że rzeczywista wartość kierunku mieści się w zakresie od 50° do 70°, wynosi 68%.