Jak działają aplikacje poziomicy: akcelerometr w telefonie
Twój telefon wie, gdzie jest dół, bo ma maleńki czujnik zwany akcelerometrem MEMS. Ten czujnik mierzy, jak grawitacja ciągnie telefon jednocześnie w trzech kierunkach. Aplikacja poziomicy odczytuje te trzy liczby, liczy trochę trygonometrii i pokazuje ci kąt. Robi to setki razy na sekundę, wewnątrz układu, który gołym okiem ledwie byś dostrzegł. W tym artykule pokazujemy, co się tam naprawdę dzieje.
- Akcelerometr mierzy, jak grawitacja rozkłada się na trzy osie. Kiedy telefon stoi w miejscu, nie mierzy ruchu.
- Pochylenie (pitch) i przechył (roll) wyliczasz ze wzorów arctan zastosowanych do tych trzech odczytów grawitacji.
- Spirit Level Pro przepuszcza surowe odczyty przez wykładniczą średnią kroczącą (alpha=0,15), żeby bąbelek nie drżał.
- Czujniki MEMS dryfują wraz z temperaturą, więc kalibruj tam, gdzie pracujesz.
- Do telefonu trzymanego nieruchomo przy powierzchni wystarcza sam akcelerometr. Żyroskop nie jest potrzebny.
Czym jest akcelerometr MEMS?
MEMS to skrót od Micro-Electro-Mechanical Systems, czyli mikrosystemów elektromechanicznych. Element pomiarowy w akcelerometrze telefonu jest maleńki, kilkaset mikronów szerokości, mniejszy od ziarnka soli. Leży na tym samym krzemie co zwykła elektronika układu i powstaje w ten sam sposób. Dlatego takie czujniki są tanie i trafiają niemal do każdego telefonu.
Mechanizm jest prosty, kiedy już go sobie wyobrazisz. Maleńka masa wisi na krzemowych sprężynkach wytrawionych w układzie. Kiedy przechylasz układ, grawitacja przesuwa masę lekko poza środek. Ten ruch zmienia odstęp między metalowymi palcami ułożonymi jak zęby grzebienia, a zmiana odstępu zmienia pojemność między nimi. Układ odczytuje tę zmianę i zamienia ją na wartość przyspieszenia, podaną w jednostkach g.
I tu jest to, co umożliwia działanie poziomicy. Kiedy telefon stoi w miejscu, akcelerometr nie odczytuje ruchu. Odczytuje, jaka część grawitacji ciągnie wzdłuż każdej z trzech osi. Grawitacja to stała, znana siła. Kiedy już wiesz, jak dzieli się na trzy osie, możesz dokładnie wyliczyć, jak telefon jest przechylony.
Jak akcelerometr trójosiowy mierzy przechylenie?
Akcelerometr trójosiowy nadaje telefonowi własny zestaw kierunków: X biegnie od lewej do prawej, Y z góry na dół, a Z od przodu do tyłu. Połóż telefon płasko na stole, a grawitacja ciągnie prawie w całości wzdłuż Z, więc Z pokazuje około 9,81 m/s², a X i Y są blisko zera. Przechyl telefon, a grawitacja się przesunie, mniej na Z, więcej na X i Y, proporcjonalnie do kąta.
Zamiana tych trzech odczytów na kąty to podstawowa trygonometria. Pochylenie to przechylenie przód-tył, przechył to przechylenie lewo-prawo, a oba liczysz z tangensa odwrotnego:
Te dwie linijki to cały matematyczny rdzeń aplikacji poziomicy. Podaj trzy surowe wartości, wykonaj obliczenie i dostajesz pochylenie oraz przechył w radianach. Pomnóż przez 180/π, żeby dostać stopnie. To jest ta liczba na twoim ekranie.
Może zastanawiasz się, dlaczego w mianowniku jest pierwiastek z dwóch pozostałych osi, a nie tylko jednej. Dzięki temu odczyt jest stabilny przez cały obrót. Gdybyś dzielił przez jedną oś, matematyka rozpada się blisko pionu, bo ta oś spada do zera i dzielisz prawie przez nic. Wspólna wartość obu pozostałych osi pozwala tego uniknąć.
Spirit Level Pro pokazuje na żywo kąty pochylenia i przechyłu z wygładzaniem EMA, pięcioma presetami tolerancji i kalibracją jednym dotknięciem. Bez pobierania.
Wypróbuj Spirit Level Pro za darmoDlaczego surowe dane z czujnika są tak zaszumione?
Surowy sygnał z akcelerometru skacze bardziej, niż byś się spodziewał. Nawet telefon leżący całkiem nieruchomo pokazuje drobne wahania w odczytach. Część z tego to szum elektryczny w samym czujniku, część to drgania przechodzące przez podłoże, a część to błąd zaokrąglenia, gdy sygnał analogowy zamienia się na liczby. Pokaż ten surowy strumień na ekranie, a bąbelek będzie bez przerwy skakał, co jest bezużyteczne przy dokładnej pracy.
Szum ma kilka źródeł. Szum termiczny to losowe wahania elektryczne pochodzące z ciepła. Nie da się go usunąć i wyznacza granicę tego, jak cichy w ogóle może być czujnik. Szum drganiowy przychodzi ze świata wokół ciebie: sprężarka lodówki, kroki, ruch uliczny za oknem. A punkt zerowy czujnika sam z siebie powoli dryfuje w czasie. Każdy z nich wymaga innego rozwiązania.
Zwykłym rozwiązaniem programowym jest filtr dolnoprzepustowy. Przepuszcza wolne zmiany, jak prawdziwe przechylenie, a zatrzymuje szybkie, jak drgania. Najczęściej robi się to wykładniczą średnią kroczącą, czyli EMA. Każdy nowy odczyt liczy się w ułamku, alpha, a reszta przenosi się z ostatniej wartości po filtrze:
Spirit Level Pro używa EMA z alpha=0,15. Doszliśmy do tej wartości po ręcznym przetestowaniu całego zakresu. Przy alpha=0,05 odczyt był gładki jak szkło, ale powolny, i bąbelek zostawał w tyle za telefonem, gdy nim ruszałeś. Przy alpha=0,3 nadążał dobrze, ale drgał na tyle, że trudno było złapać dokładny odczyt. Alpha=0,15 leży pomiędzy. Bąbelek jest żywy, a nie nerwowy.
Jaką rolę odgrywa żyroskop?
Żyroskop mierzy, jak szybko telefon się obraca, w stopniach na sekundę. Nie mierzy, w którą stronę telefon jest skierowany. Ta różnica ma znaczenie. Sam z siebie żyroskop nie powie ci, czy telefon jest w poziomie. Wie tylko, czy się obraca i jak prędko. Do odczytu poziomu, gdy telefon trzymasz nieruchomo, akcelerometr ma już wszystko, czego trzeba.
Żyroskop pokazuje swoją wartość, gdy telefon się porusza, dzięki fuzji czujników. Akcelerometry dobrze odczytują przechylenie w spoczynku, ale stają się wolne i zaszumione przy szybkim ruchu. Żyroskopy dobrze śledzą szybki obrót, ale dryfują, bo ich drobne błędy sumują się w czasie. Filtr komplementarny lub filtr Kalmana łączy oba: żyroskop zajmuje się szybkim ruchem, a akcelerometr sprowadza długoterminowy odczyt z powrotem do prawdy.
Większość aplikacji poziomicy, w tym Spirit Level Pro, pomija fuzję czujników, bo praca jest statyczna. Kładziesz telefon, on się ustawia, ty odczytujesz kąt. Akcelerometr radzi sobie z tym sam. Fuzja czujników ma większe znaczenie, gdy coś jest w locie, jak dron śledzący własny ruch, niż gdy sprawdzasz półkę.
Dlaczego kalibracja jest tak ważna?
Każdy czujnik MEMS wychodzi z fabryki z małym wbudowanym przesunięciem. To odchylenie ustawione w produkcji i jest takie samo przy każdym odczycie: stała wartość, w stałym kierunku. Więc układ może pokazywać stopień czy dwa za dużo, nawet gdy telefon naprawdę leży płasko. To główny powód, dla którego aplikacja poziomicy wygląda na niedokładną prosto z pudełka.
Kalibracja to naprawia: mierzy to przesunięcie na powierzchni, której ufasz, że jest płaska, a potem je zapisuje. Spirit Level Pro trzyma te wartości w localStorage pod kluczami calibrationPitch i calibrationRoll. Od tej chwili każdy odczyt odejmuje te zapisane liczby, zanim trafi na ekran. Przesunięcia już nie ma.
Różnica jest duża. Pomiń kalibrację, a telefon z przesunięciem 1,5° pokazuje wszystko o 1,5° za bardzo. Może pokazać 0,0°, gdy stoi na prawdziwym nachyleniu 1,5°. Skalibruj ten sam telefon, a spada do kilku dziesiątych stopnia. To największy pojedynczy zysk na dokładności, jaki możesz osiągnąć, a kosztuje tylko kilka sekund.
Jak temperatura wpływa na dokładność?
Czujniki MEMS reagują na temperaturę. Krzemowe sprężynki trzymające masę pomiarową rozszerzają się i kurczą, gdy układ się nagrzewa i stygnie, co przesuwa punkt zerowy. Więc przenieś telefon z ciepłego auta do zimnego garażu, a odczyt lekko dryfnie, zanim czujnik ustabilizuje się w nowej temperaturze. To nie jest wielkie przesunięcie, ale realne.
Praktyczny wniosek jest prosty: kalibruj w temperaturze, w której zamierzasz pracować. Kalibracja zrobiona w ciepłym biurze nie utrzyma się w pełni w zimnym garażu. Nie musisz się tym zamartwiać przy każdej robocie. Do wieszania obrazów czy sprawdzania półki dryf jest za mały, żeby go zauważyć. Do precyzyjnej pracy w granicach kilku dziesiątych stopnia daj telefonowi minutę czy dwie na ustabilizowanie się po dużej zmianie temperatury, a potem skalibruj.
iPhone kontra Android: czy sprzęt czujnika się różni?
Różni się, i widać to w tym, jak aplikacja się zachowuje. Apple buduje własny układ obsługi ruchu. iPhone'y od 6s wzwyż mają koprocesor ruchu Apple, który obsługuje dane z czujników osobno od głównego procesora. Flagowce Samsung Galaxy opierają się na częściach STMicroelectronics, które łączą akcelerometr trójosiowy i żyroskop trójosiowy na jednej płytce. Telefony Google Pixel korzystały z czujników Bosch i TDK InvenSense, zależnie od rocznika.
Po kalibracji flagowy iPhone i flagowy Android wypadają mniej więcej tak samo. Różnica, która naprawdę ma znaczenie, jest między flagowcem a budżetowym Androidem. Tanie telefony mają tańsze MEMS o niższej rozdzielczości, a ich surowy sygnał jest bardziej zaszumiony. Kalibracja i tak sprowadza je blisko, a do większości prac majsterkowicza wynik jest w porządku.
To, co wyróżnia iPhone'a w aplikacji poziomicy, to mniej sam akcelerometr, a bardziej ten koprocesor ruchu. Zbiera on dane z czujników z dużą częstotliwością nawet wtedy, gdy aplikacja nie jest na wierzchu, więc filtr wygładzający ma więcej próbek do pracy. To duża część powodu, dla którego iPhone'y działają tu tak płynnie, nawet obok telefonów z Androidem z czujnikami na papierze równie dobrymi.
Najczęściej zadawane pytania
Jak działają aplikacje poziomicy na telefonie?
Odczytują akcelerometr MEMS telefonu, który mierzy, jak grawitacja ciągnie wzdłuż trzech osi (X, Y, Z). Przechyl telefon, a grawitacja przesunie się między tymi osiami. Aplikacja liczy wzory arctan, żeby dostać pochylenie i przechył, wygładza wynik, żeby uspokoić szum czujnika, i pokazuje go jako bąbelek albo liczbę. Całość dzieje się setki razy na sekundę.
Jak dokładny jest akcelerometr telefonu do zastosowań poziomicy?
Skalibrowany flagowiec odczytuje z dokładnością do kilku dziesiątych stopnia. Budżetowe telefony z Androidem odczytują gorzej bez kalibracji, bo ich czujniki są tańsze i bardziej różnią się między egzemplarzami. Największym czynnikiem jest kalibracja: usuwa fabryczne przesunięcie i sprowadza niemal każdy telefon blisko. Do większości prac majsterkowicza i fachowca skalibrowany telefon średniej klasy jest wystarczająco dokładny.
Czy aplikacja poziomicy używa żyroskopu?
Przy nieruchomym telefonie nie. Akcelerometr sam daje ci kąt przechylenia. Żyroskop mierzy prędkość obrotu, a nie pozycję, więc nie powie, czy telefon jest w poziomie, tylko jak szybko się obraca. Niektóre aplikacje łączą oba czujniki dla gładszych odczytów w ruchu, ale do dociśnięcia telefonu do ściany i odczytania kąta akcelerometr robi całą robotę.
Dlaczego moja aplikacja poziomicy pokazuje trochę źle nawet na płaskiej powierzchni?
Zwykle to fabryczne przesunięcie. Każdy układ MEMS ma małe wbudowane odchylenie, przez które pokazuje wartość niezerową, nawet gdy telefon leży płasko. Kalibracja na powierzchni, której ufasz, je usuwa. Inne przyczyny to dryf temperaturowy, etui telefonu, które unosi jedną krawędź nad powierzchnią, albo kurz pod telefonem. Kalibracja na czystym szklanym stole po każdej dużej zmianie temperatury rozwiązuje większość z tego.
Pełny obraz
Aplikacje poziomicy działają, bo fizyka za nimi jest niezawodna. Grawitacja jest stała, akcelerometr mierzy ją cały czas, a trygonometria zamienia trzy liczby na kąt. Droga od elementu pomiarowego do bąbelka to na całej długości ustalona matematyka. Nie ma w tym zgadywania.
To, co sprawia, że jedna aplikacja poziomicy jest lepsza od drugiej, to nie sprzęt. Każdy flagowy telefon ma już czujniki, które są aż nadto dobre. Różnica tkwi w oprogramowaniu: jak dobrze filtruje się surowy strumień, jak zapisuje się i stosuje kalibrację, jak presety tolerancji pasują do prawdziwych robót. Zrób to dobrze, a tani układ MEMS dorówna dedykowanym narzędziom, które kosztują znacznie więcej.
Wiedza o tym, jak działa czujnik, czyni cię też lepszym w jego używaniu. Kalibruj w temperaturze roboczej. Zdejmij etui do dokładnych odczytów. Daj liczbie ustabilizować się przez sekundę, zanim jej zaufasz. Każdy z tych nawyków wynika wprost ze zrozumienia, co robi sprzęt.