Aplikacja do monitorowania parametrów jazdy na platformę ... · większość posiadaczy...
Transcript of Aplikacja do monitorowania parametrów jazdy na platformę ... · większość posiadaczy...
Rok akademicki 2014/2015
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki
PRACA DYPLOMOWA INŻYNIERSKA
Adam Karpiuk
Aplikacja do monitorowania parametrów jazdy
na platformę Android
Opiekun pracy
dr inż. Jerzy Chrząszcz
Ocena: .....................................................
................................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Kierunek: Informatyka
Specjalność: Inżynieria Systemów Informatycznych
Data urodzenia: 1992.12.03
Data rozpoczęcia studiów: 2011.10.01
Życiorys
Urodziłem się 3 grudnia 1992 roku w Białymstoku. W latach 2008-2011 uczęszczałem
do I Liceum Ogólnokształcącego im. Adama Mickiewicza w Białymstoku, do klasy o profilu
matematyczno-informatyczno-fizycznym. W październiku 2011 roku rozpocząłem studia
inżynierskie na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej,
na kierunku Informatyka. Po ukończeniu pierwszych czterech semestrów wybrałem
specjalność Inżynieria Systemów Informatycznych.
.......................................................
Podpis studenta
EGZAMIN DYPLOMOWY
Złożył egzamin dyplomowy w dniu .................................................................................. 20__ r
z wynikiem ..................................................................................................................................
Ogólny wynik studiów: ...............................................................................................................
Dodatkowe wnioski i uwagi Komisji: .........................................................................................
......................................................................................................................................................
......................................................................................................................................................
STRESZCZENIE
Niniejsza praca dotyczy wykorzystania urządzenia mobilnego do pomiaru wielkości
fizycznych. Przedstawia projekt aplikacji dla systemu Android, służącej do monitorowania
i rejestrowania parametrów jazdy pojazdów. Działanie aplikacji skoncentrowane jest przede
wszystkim na wykrywaniu nierówności nawierzchni za pomocą wbudowanych czujników –
akcelerometru i modułu GPS.
W ramach pracy dokonano przeglądu dostępnych czujników oraz istniejących rozwiązań.
Następnie przedstawiono wymagania dotyczące tworzonej aplikacji, projekt rozwiązania
i szczegóły jego implementacji. Opisano narzędzia i algorytmy wykorzystywane podczas
realizacji projektu. Zaprezentowano proces testowania i skomentowano otrzymane rezultaty.
Słowa kluczowe: urządzenie mobilne, czujnik, pomiar, parametry jazdy, aplikacja, Android.
ANDROID APPLICATION FOR MONITORING DRIVING PARAMETERS
This thesis concerns the use of mobile devices to measure physical quantities. It presents
a project of Android application for monitoring and recording of vehicle driving parameters.
The application is focused mainly on detection of road surface anomalies using built-in
sensors – accelerometer and GPS receiver.
In this thesis, the author surveyed available sensors and existing solutions. Next,
he introduced requirements regarding created application, project of the solution and its
implementation details. Tools and algorithms used during the project development phase were
described. The author presented testing process and commented obtained results.
Keywords: mobile device, sensor, measurement, driving parameters, application, Android.
4
Spis treści
Wstęp ................................................................................................................................ 5
Cel i zakres pracy .......................................................................................................... 5
Struktura pracy .............................................................................................................. 6
1. Przegląd technologii ................................................................................................ 7
1.1 Android na tle innych platform .......................................................................... 7
1.2 Czujniki w urządzeniach mobilnych i ich zastosowania .................................... 8
1.3 Publikacje naukowe ......................................................................................... 13
1.4 Istniejące rozwiązania ...................................................................................... 14
2. Projekt rozwiązania ............................................................................................... 20
2.1 Przeznaczenie aplikacji .................................................................................... 20
2.2 Wymagania funkcjonalne ................................................................................. 20
2.3 Wymagania niefunkcjonalne ............................................................................ 21
2.4 Koncepcja rozwiązania .................................................................................... 22
2.5 Architektura rozwiązania ................................................................................. 25
3. Realizacja ............................................................................................................... 28
3.1 Stosowane narzędzia ........................................................................................ 28
3.2 Stosowane algorytmy ....................................................................................... 30
3.3 Opis implementacji .......................................................................................... 34
4. Testowanie .............................................................................................................. 40
Podsumowanie ............................................................................................................... 45
Dodatek .......................................................................................................................... 47
Podręcznik użytkownika ............................................................................................. 47
Spis ilustracji ................................................................................................................. 51
Spis tabel ........................................................................................................................ 51
Bibliografia .................................................................................................................... 52
5
Wstęp
Trudno jest spotkać osobę, która nie miałaby zastrzeżeń do stanu polskich dróg.
Większość narzeka, że są dziurawe, źle zaprojektowane, niewłaściwie oznakowane lub
zakorkowane. Największym problemem utrudniającym poprawę tej sytuacji jest
zazwyczaj brak pieniędzy lub niewłaściwa ich dystrybucja. Jeśli nie jest możliwe
naprawienie wszystkich odcinków na raz, to należy wybrać te, które powinny zostać
przebudowane w pierwszej kolejności. Czasami trudno jest obiektywnie ocenić stan
nawierzchni, ale można spróbować przyjąć odpowiednie kryteria, na przykład wstrząsy
odczuwalne we wnętrzu pojazdu.
Wielu kierowców podróżuje z nawigacją uruchomioną na urządzeniu przenośnym.
Nic nie stoi na przeszkodzie, aby oprócz wskazywania właściwej trasy, urządzenie
rejestrowało wstrząsy z wykorzystaniem akcelerometru i przyporządkowywało je do
aktualnej lokalizacji wskazywanej przez moduł GPS. Dzięki takim danym możliwe jest
utworzenie bazy nierówności na drogach, z której mogliby korzystać zarówno
kierowcy – ostrzegani przed dziurami, jak również zarządcy dróg – informowani o stanie
nawierzchni. Wstrząsy są rozpoznawane jako gwałtowne przyspieszenia w osi pionowej,
jednakże mając do dyspozycji akcelerometr trójosiowy, możemy zrobić użytek z danych
rejestrowanych również w pozostałych osiach. W kontekście pojazdów, przeciążenia
w osi poziomej mogą być odczytywane jako intensywne przyspieszenie lub hamowanie.
Jak wiadomo, częste wytracanie prędkości i ponowne jej osiąganie niesie za sobą straty
energii, co przekłada się na wzrost zużycia paliwa, emisji spalin i co istotne, w efekcie na
wzrost kosztów transportu. Zbierane za pomocą akcelerometru i modułu GPS informacje
mogą pomóc kierowcy zoptymalizować styl jazdy i dostosować się do zasad popularnego
w ostatnich latach eco-drivingu.
Cel i zakres pracy
Celem mojej pracy inżynierskiej jest stworzenie aplikacji służącej do monitorowania
i rejestrowania parametrów jazdy pojazdów. Program ma działać na urządzeniach
mobilnych pod kontrolą systemu operacyjnego Android. Podstawą jego funkcjonowania
jest pomiar wielkości fizycznych z użyciem wbudowanych czujników. W pracy, jako
urządzenie mobilne rozumiem dowolny telefon komórkowy, smartfon lub tablet
działający w szczególności na platformie Android, ale również iOS, Windows Phone, itp.
Aplikacja implementowana na potrzeby pracy inżynierskiej ma za zadanie
zweryfikować możliwość i zakres zastosowania sensorów w urządzeniu mobilnym do
przestawionych celów. Tworząc jej wersję demonstracyjną, skupiam się na jednym
z możliwych efektów analizy danych otrzymanych z akcelerometru i modułu GPS, jakim
jest wykrywanie nierówności dróg. Zakres programu obejmuje rejestrowanie pomiarów,
ich proste przetwarzanie, analizę i wizualizację na ekranie urządzenia.
6
Struktura pracy
Pierwszy rozdział zawiera przedstawienie systemu Android na tle innych platform,
przegląd czujników stosowanych w urządzeniach mobilnych, ze szczególnym
uwzględnieniem sensorów wykorzystywanych w tworzonej aplikacji, przegląd publikacji
naukowych poruszających podobną tematykę oraz opis istniejących programów
o zbliżonej funkcjonalności.
Rozdział drugi formułuje wymagania funkcjonalne i niefunkcjonalne oraz opisuje
projekt aplikacji, obejmujący koncepcję i architekturę rozwiązania.
W trzecim rozdziale zaprezentowane są stosowane przy realizacji projektu narzędzia
i algorytmy oraz wybrane szczegóły implementacji programu.
Czwarty rozdział dotyczy testowania – przedstawia metody wykorzystywane w celu
weryfikacji poprawności działania aplikacji i zgodności z wymaganiami oraz prezentuje
wyniki przeprowadzonych testów.
Podsumowanie zawiera wnioski i opisuje uzyskane rezultaty oraz zakres realizacji
celu pracy. Przedstawia koncepcje rozwoju projektu.
Jako dodatek dołączony jest podręcznik użytkownika aplikacji, ułatwiający
poruszanie się po wszystkich opcjach.
7
1. Przegląd technologii
1.1 Android na tle innych platform
Android jest najpopularniejszym systemem operacyjnym działającym na
urządzeniach mobilnych. Według danych International Data Corporation (IDC) [1]
z trzeciego kwartału 2014 roku, udział smartfonów z tym systemem w światowym rynku
kształtuje się na poziomie 84%. Przewaga nad konkurencyjnymi platformami iOS
i Windows Phone powiększa się z każdym rokiem i obecnie wynosi ponad 70%. Warto
zauważyć, że Android jest jedyną platformą spośród wymienionych, która na przestrzeni
ostatnich lat nie odnotowała spadku popularności. W związku z tym, że zdecydowana
większość posiadaczy smartfonów jest użytkownikami systemu Android, twórcy
oprogramowania na urządzenia mobilne nie mogą nie uwzględnić tego faktu przy
produkcji nowych aplikacji.
Okres Android iOS Windows
Phone
BlackBerry
OS
Inne
Q3 2014 84,4% 11,7% 2,9% 0,5% 0,6%
Q3 2013 81,2% 12,8% 3,6% 1,7% 0,6%
Q3 2012 74,9% 14,4% 2,0% 4,1% 4,5%
Q3 2011 57,4% 13,8% 1,2% 9,6% 18,0%
Tabela 1. Udział poszczególnych systemów operacyjnych na smartfony w rynku [1]
Od strony programisty, Android nie stawia takich ograniczeń jak inne platformy.
Z powodzeniem można pisać aplikacje na komputerze zarówno z systemem Windows,
Linux, jak i Mac OS. W przypadku iOS i Windows Phone, skazani jesteśmy na
programowanie pod systemem z tej samej rodziny, co urządzenie docelowe. Językiem
programowania aplikacji dla Androida jest Java – język popularny i rozpowszechniony,
co jest niewątpliwą zaletą, gdyż łatwo jest uzyskać pomoc społeczności deweloperów
i przykłady kodu.
Oprócz wcześniej przedstawionych aspektów, wpływ na decyzję o wyborze
platformy docelowej miała również moja sympatia do Androida od strony użytkownika
oraz fakt posiadania urządzenia z tym systemem.
8
Rysunek 1. Udział poszczególnych systemów operacyjnych na smartfony w rynku [1]
1.2 Czujniki w urządzeniach mobilnych i ich zastosowania
W ciągu ostatnich lat można zaobserwować rosnącą popularność czujników
w urządzeniach mobilnych. Producenci telefonów komórkowych i tabletów coraz
chętniej wyposażają swoje produkty w różnorodne sensory. Dzieje się tak za sprawą
szybkiego rozwoju elektroniki, co prowadzi do miniaturyzacji układów i spadku ich cen.
Obecnie czujniki zazwyczaj nie przekraczają rozmiarem ziarnka grochu, a kupić je można
nawet za kilkanaście złotych. Zastosowanie sensorów w przenośnych urządzeniach
znacznie zwiększa ich możliwości, a także daje pole do popisu producentom aplikacji
mobilnych.
Występowanie opisywanej tendencji można przedstawić na przykładzie liczby
stosowanych czujników w dwóch czołowych modelach telefonów firmy Samsung
z różnych okresów. W przypadku modelu Galaxy S z roku 2010 było to 5 sensorów,
natomiast w 2014 roku, w modelu Galaxy S5, liczba ta wzrosła dwukrotnie.
Zaprezentowany trend można zaobserwować również wśród urządzeń innych
producentów.
9
Czym jest czujnik? Według encyklopedii PWN:
Czujnik (sensor) – element wejściowy systemu przetwarzania informacji, np. urządzenia
pomiarowego, przetwarzający wejściową (oznaczaną, mierzoną) wielkość fizyczną,
chemiczną lub biologiczną (sygnał wejściowy czujnika) na użyteczną wielkość wyjściową
(sygnał wyjściowy czujnika, zwany też sygnałem pomiarowym), z zachowaniem
informacji o przebiegu i wartościach charakterystycznych tej pierwszej [2].
W swojej pracy inżynierskiej skupiam się przede wszystkim na użyciu akcelerometru
i modułu GPS, dlatego opisuję je bardziej szczegółowo niż pozostałe czujniki.
Akcelerometr
Akcelerometr to czujnik, który mierzy przyspieszenie w trzech prostopadłych osiach.
Jego najważniejszym elementem jest tzw. masa bezwładna umieszczona na sprężynach,
która w wyniku przemieszczania się powoduje zmianę napięcia wyjściowego, a po
zastosowaniu przetwornika analogowo-cyfrowego otrzymujemy cyfrową informację
dotyczącą przyspieszenia w osiach x, y, z. Typowe akcelerometry mierzą przyspieszenie
w zakresach od 0 do maksymalnie +/- 1-16 g, czyli w przybliżeniu 10-160 m/s2,
z rozdzielczością wyjściową 10-16 bit. Urządzenie pozostające w spoczynku rejestruje
wartość przyspieszenia wynikającą z grawitacji, czyli ok. 9,81 m/s2, co wynika
z wewnętrznej budowy sensora [3].
Praktycznie wszystkie współczesne urządzenia z dotykowym ekranem mają
wbudowany akcelerometr. Używany jest przede wszystkim do zmieniania orientacji
ekranu, gdy obrócimy telefon. Wówczas aplikacje zazwyczaj dostosowują układ
interfejsu, czyniąc go wygodniejszym w obsłudze. Jednak przyspieszeniomierz można
wykorzystać również do innych celów. Odczyty z akcelerometru doskonale nadają się do
liczenia kroków, gdy osoba trzyma urządzenie przy ciele. Ponadto, czujnik ten ma
zastosowanie w nawigacji bezwładnościowej, gdy nie ma dostępu do sygnału z satelitów
ani innych źródeł, np. w pomieszczeniach lub tunelach. Pozwala również badać ruch
pojazdów, ich przyspieszenie, wykrywać drgania, wstrząsy. Stosowany jest do
stabilizacji obrazu w fotografii, ochrony dysku twardego przed uderzeniami.
Akcelerometrowi można znaleźć szereg zastosowań w nowoczesnej medycynie.
Żyroskop
Żyroskop służy do pomiaru prędkości kątowej, na podstawie której można określić
obrót urządzenia wokół trzech osi. Stosowany jest często w połączeniu z akcelerometrem,
wspomaga jego działanie i rozszerza możliwości. Dużą popularnością cieszą się gry,
w których sterowanie odbywa się poprzez poruszanie telefonu (tabletu). Kontrolery gier
do konsoli Sony PlayStation oraz Nintendo Wii, wyposażone w akcelerometry
i żyroskopy, wprowadziły nową jakość do świata gier.
10
Moduł GPS
Moduł GPS (Global Positioning System) odpowiada za odczyt lokalizacji urządzenia.
Odbiera sygnał nadawany przez satelity, które krążą po orbitach wokół Ziemi. Obecnie
w skład systemu wchodzi trzydzieści jeden działających satelitów rozmieszczonych na
sześciu orbitach w ten sposób, że w danej chwili z każdego miejsca na powierzchni Ziemi
można zaobserwować cztery z nich. Wszystkie urządzenia pracujące w systemie muszą
mieć bardzo precyzyjnie zsynchronizowane zegary. Na podstawie czasów dotarcia
sygnałów urządzenie oblicza odległość od satelitów i dzięki metodzie trilateracji (znając
położenie satelitów na orbitach) określa aktualne współrzędne oraz przybliżoną
wysokość nad poziomem morza. Odbiornik otrzymuje informacje o czasie rozpoczęcia
transmisji, rejestruje czas zakończenia transmisji, a następnie, przyjmując prędkość
światła w próżni za prędkość rozchodzenia się fal radiowych, które przenoszą dane,
oblicza drogę, którą przebył sygnał, czyli odległość między satelitą a urządzeniem.
Do określenia długości i szerokości geograficznej potrzebne są sygnały z co najmniej
trzech satelitów, natomiast dane uzyskane z kolejnych satelitów pozwalają odczytać
również wysokość, na jakiej się znajdujemy oraz zwiększyć precyzję obliczeń. Aktualna
lokalizacja to punkt przecięcia sfer o środkach w miejscach, gdzie znajdują się satelity
i promieniach o długości równej odległościom od odbiornika. Zostało to zaprezentowane
w uproszczeniu na rys. 2. Dokładność określania pozycji wynosi nawet do kilku metrów,
a wpływ na nią ma wiele czynników. Źródłem błędów pomiaru mogą być m. in.
zakłócenia rozchodzenia się fal w jonosferze, troposferze czy atmosferze, odbicia
sygnałów od budynków, a także niedokładności zegarów satelitów oraz danych o ich
położeniu na orbitach.
Istotną wadą systemu GPS, zwłaszcza w kontekście urządzeń mobilnych, jest czas
uzyskiwania pierwszych danych o pozycji. W celu przyspieszenia procesu lokalizowania
wykorzystuje się często informacje z najbliższych komórkowych stacji bazowych lub
dostępnych sieci bezprzewodowych Wi-Fi, a ostatnio również odczyty z barometru.
Jednak ograniczeniem, którego nie da się obejść, jest brak możliwości używania systemu
GPS w zamkniętych pomieszczeniach, gdyż do prawidłowego działania wymagana jest
otwarta droga od satelity do odbiornika. Można przyjąć, że dane GPS uzyskamy bez
problemu w miejscach, gdzie niebo jest bezpośrednio widoczne. Oprócz
najpopularniejszego systemu pozycjonowania – amerykańskiego GPS, rozwijane są
również m. in. rosyjski GLONASS, europejski Galileo oraz chiński Compass.
11
Rysunek 2. Trilateracja [4]
Punkt przecięcia sfer, uproszczonych na rysunku do postaci okręgów, wyznacza lokalizację odbiornika.
Barometr
Barometr służy do pomiaru ciśnienia atmosferycznego. Oprócz funkcji
informacyjnej, wykorzystywany jest do wspomagania modułu GPS. Na podstawie
wartości ciśnienia można oszacować wysokość i dzięki tej informacji lokalizacja
urządzenia przez GPS odbywa się szybciej.
Mikrofon
Mikrofon to stały element każdego urządzenia mobilnego. Jego podstawowym
zadaniem jest rejestrowanie mowy rozmówcy i przetwarzanie jej na postać cyfrową.
W celu udoskonalenia działania stosuje się dodatkowe mikrofony, które nagrywają
dźwięki otoczenia, co pozwala uzyskać głos pozbawiony zakłóceń. Oprócz oczywistych
zastosowań w telefonii, mikrofony wykorzystuje się również do rozpoznawania mowy
i przekształcania jej na tekst. W ten sposób można wprowadzać dane do urządzenia bez
użycia klawiatury. Co więcej, istnieje również możliwość sterowania podstawowymi
funkcjami urządzenia bez użycia rąk. Wystarczy jedynie wydawać polecenia głosowe,
a telefon rozpozna je i wykona odpowiednie operacje.
Czujnik obrazu
Cyfrowy aparat fotograficzny, którego głównym elementem jest czujnik obrazu,
zadomowił się w telefonach komórkowych na dobre w ciągu ostatniego dziesięciolecia.
Na początku, rozdzielczość obrazu rejestrowanego przez aparat była bardzo niska
(160 na 120 pikseli), co bardzo negatywnie wpływało na jego jakość. Jednak wraz
z rozwojem technologii, stosowane matryce CCD (Charge Coupled Device) oraz CMOS
(Complementary Metal Oxide Semiconductor) charakteryzowały się coraz wyższą
rozdzielczością, a urządzenia przenośne zostały wyposażone w funkcję nagrywania
12
filmów. Obecnie niektóre telefony mogą śmiało konkurować z kompaktowymi aparatami
i kamerami – robią zdjęcia z rozdzielczością kilkunastu milionów pikseli (nawet 41 Mpix
w modelu Nokia Lumia 1020) i nagrywają filmy w standardzie UltraHD (3840 na 2160
pikseli). Droższe modele posiadają funkcję stabilizacji obrazu lub zbliżenia optycznego.
Oprócz zastosowań fotograficznych, czujniki obrazu wykorzystywane są również do
skanowania kodów kreskowych (lub QR), wykrywania twarzy (np. w celu odblokowania
ekranu tylko przez właściciela) lub rozpoznawania obiektów.
Pozostałe czujniki:
Magnetometr – mierzy natężenie pola magnetycznego, w szczególności pola
magnetycznego Ziemi, co pozwala określić kierunek północny (cyfrowy
kompas). Bardziej nietypowym zastosowaniem jest wykrywanie metali.
Termometr – pozwala określić temperaturę podzespołów, dzięki czemu układy
sterujące są w stanie zapobiec przegrzaniu urządzenia. Wówczas obniżane jest
taktowanie podzespołów, bądź też telefon jest awaryjnie wyłączany. Coraz
częściej montowane są również termometry, które odczytują temperaturę
otoczenia.
Czujnik wilgotności – pozwala zmierzyć wilgotność otoczenia.
Czujnik promieniowania ultrafioletowego – jeden z najnowszych sensorów
w urządzeniach przenośnych. Przestrzega użytkownika przed szkodliwym
działaniem promieni słonecznych, a odpowiednie aplikacje mogą doradzić jak się
chronić przed takimi warunkami.
Czujnik gestów – działa z wykorzystaniem promieniowania podczerwonego.
Dzięki niemu można sterować urządzeniem bez kontaktu z nim, z odległości
kilku, kilkunastu centymetrów.
Czytnik linii papilarnych – stosunkowo popularny w komputerach przenośnych,
w telefonach jest nowością. Można go wykorzystać do odblokowywania ekranu
lub autoryzacji transakcji bankowych przeprowadzanych przez telefon/tablet.
Jest to skuteczny typ zabezpieczeń, mogący zastąpić lub wspomóc zabezpieczenie
hasłem.
Czujnik tętna – inaczej pulsometr, służy do pomiaru pulsu. Co ciekawe, nie jest
on niezbędny, gdyż możliwe jest zmierzenie tętna ze zbliżoną dokładnością za
pomocą praktycznie dowolnego urządzenia wyposażonego w aparat, diodę LED
i odpowiednią aplikację.
13
1.3 Publikacje naukowe
W ciągu ostatnich lat pojawiło się wiele publikacji naukowych na temat
monitorowania stanu dróg z wykorzystaniem sensorów. Badania w tym zakresie
prowadzone są w wielu krajach, co świadczy o tym, że opisywany problem jest globalnie
istotny i na czasie. Nie powinna dziwić znaczna liczba publikacji pochodzących z krajów
rozwijających się, takich jak Indie, gdyż zwłaszcza tam stan nawierzchni pozostawia
wiele do życzenia. Poniżej opisuję wybrane prace.
Naukowcy z Uniwersytetu Łotewskiego [5] zaproponowali system wykrywający
wyboje w czasie rzeczywistym, z wykorzystaniem urządzenia mobilnego z systemem
Android. System działa w oparciu o akcelerometr i moduł GPS. Badacze opisali cztery
różne algorytmy stosowane do wykrywania nierówności, przeprowadzili ich analizę
i starali się dobrać parametry w taki sposób, aby procent wykrywanych nierówności był
jak największy, a przy tym było jak najmniej fałszywych zgłoszeń. Dwa spośród
wymienionych algorytmów były w stanie analizować dane na bieżąco, a dwa pozostałe
po zakończeniu pomiarów.
Przeprowadzone zostały szczegółowe testy każdej z metod w różnych konfiguracjach.
Polegały na wielokrotnym przejechaniu tej samej trasy w jak najbardziej zbliżonych do
siebie warunkach ze zmienianymi ustawieniami. Trasa została uprzednio zbadana
empirycznie, a uszkodzenia nawierzchni zostały opisane i sklasyfikowane pod względem
wielkości na podstawie obserwacji wzrokowych. Wyniki testów były bardzo obiecujące,
gdyż przy odpowiedniej konfiguracji, wskaźnik wykrywalności wybojów wynosił od
73% do 92%, w zależności od wybranego algorytmu. Naukowcy w swojej pracy
zajmowali się przede wszystkim opracowaniem algorytmów wykrywania nierówności
i testowaniem ich skuteczności, natomiast nie przygotowywali aplikacji, która mogłaby
trafić do użytkowników.
Badacze z włoskiego Uniwersytetu Kalabrii [6] również wykrywali wyboje z użyciem
akcelerometru i modułu GPS. Analizowali odczyty przyspieszenia pod kątem zdarzeń
emitujących wysokie wartości energii. Podczas przetwarzania danych zastosowali trzy
filtry, które eliminowały niepożądane wartości odczytów. Testując aplikację, naukowcy
skupili się na rozpoznawaniu progów zwalniających. Wyznaczyli trasę testową, na której
znajduje się wiele progów i przejechali ją w określonych, stabilnych warunkach,
z urządzeniem przymocowanym wewnątrz samochodu. Wykryte wyboje naniesione na
mapę zestawili w sposób manualny ze zdjęciami satelitarnymi przebytej trasy, na których
da się zlokalizować spowalniacze. W wyniku analizy rezultatów uzyskano poziom
wykrywalności progów powyżej 90%. Warto zauważyć, że nie odnotowano przy tym
zgłoszeń fałszywych.
14
Autorzy z indyjskiego V.E.S. Institute of Technology [7] postanowili wykorzystać
metody sztucznej inteligencji do wykrywania nierówności. Ich system działa na
urządzeniach mobilnych z systemem Android w oparciu o pomiary akcelerometru
i modułu GPS. Wykorzystuje sieci neuronowe do implementacji uczenia maszynowego.
Wyboje są wykrywane na podstawie przyjętych wartości progowych, a sztuczna
inteligencja pomaga ocenić ich trafność. W czasie testów, które nie są niestety opisane
w pracy, osiągnięto precyzję wykrywania nierówności na poziomie 95%.
1.4 Istniejące rozwiązania
W tym rozdziale przedstawię cztery programy o tematyce zbliżonej do poruszanej
przeze mnie: Accelerometer Monitor, Measurement of acceleration, Moje trasy oraz
Yanosik. Pierwszy z nich skoncentrowany jest wokół akcelerometru, wyświetla wyniki
pomiarów w przystępnej formie – graficznej i liczbowej, a także potrafi zareagować na
przekroczenie ustawionej wartości progowej przyspieszenia. Druga aplikacja również
korzysta z akcelerometru, a jego odczyty służą do pomiaru parametrów samochodu.
Kolejna wykorzystuje głównie moduł GPS do rejestracji aktualnego położenia,
a następnie prezentuje przebytą trasę na mapie oraz różnorodne statystyki na bazie
zebranych danych. Ostatni program spośród przytoczonych śledzi lokalizację
użytkownika-kierowcy (za pomocą GPS) i ostrzega go przed radarami oraz innymi
zdarzeniami na drodze posługując się informacjami dostarczanymi przez innych
użytkowników.
15
Accelerometer Monitor
Accelerometer Monitor [8] to aplikacja, która wyświetla na wykresie aktualne
wartości przyspieszenia w trzech osiach. Posiada funkcję zapisu danych z akcelerometru
do pliku w pamięci zewnętrznej urządzenia. Umożliwia wybór częstotliwości
próbkowania pomiaru oraz wyzwolenie alarmu w przypadku przekroczenia ustawionej
wartości przyspieszenia. Jest dostępna dla użytkowników systemu Android, do pobrania
bezpłatnie ze sklepu Google Play. Program polskiego producenta, Mobile Tools, ma
niezbyt rozbudowane funkcje, jednak bardzo dobrze nadaje się do wizualizacji oraz
zapisu surowych danych z akcelerometru.
Rysunek 3. Aplikacja Accelerometer Monitor [8]
16
Measurement of acceleration
Measurement of acceleration [9] to program służący do pomiaru parametrów
samochodu takich jak: przyspieszenie, moc oraz maksymalny moment obrotowy silnika.
Korzysta jedynie z akcelerometru i danych dostarczonych przez użytkownika. Aplikacja
umożliwia przeglądanie wykresów, a także wyeksportowanie wyników do postaci plików
xls. Program stworzył Sergey Vorobyev i umieścił go bezpłatnie w sklepie Google Play.
Rysunek 4. Aplikacja Measurement of
acceleration, pomiar przyspieszenia [9]
Rysunek 5. Aplikacja Measurement of
acceleration, wykres przyspieszenia [9]
17
Moje trasy
Aplikacja Moje trasy [10] rejestruje drogę, prędkość, odległość i wysokość podczas
aktywności użytkownika na świeżym powietrzu, a także pozwala oszacować liczbę
spalonych kalorii, itp. Do swojego działania wykorzystuje przede wszystkim odczyty
z modułu GPS, a przetworzone dane wyświetla na bieżąco w formie statystyk lub
wykresów, nanosi na mapę i umożliwia ich eksport do usług internetowych lub pamięci
zewnętrznej. Produkt od firmy Google Inc. jest dostępny do pobrania bezpłatnie ze sklepu
Google Play.
Rysunek 6. Aplikacja Moje trasy, widok trasy
[10]
Rysunek 7. Aplikacja Moje trasy, widok statystyk
[10]
18
Yanosik
Yanosik [11] to aplikacja pełniąca funkcję asystenta kierowcy, która informuje m. in.
o fotoradarach, kontrolach drogowych, patrolach policji czy wypadkach. Korzysta
z modułu GPS w celu określenia lokalizacji samochodu i powiadamia o najbliższym
zdarzeniu. Informacje z bazy danych pochodzą od innych użytkowników programu.
System zbiera trasy przejazdu kierowców i ich zgłoszenia dotyczące sytuacji na drodze,
które mogą dostarczać poprzez wybranie jednej z dostępnych na ekranie opcji. Program
oferuje również funkcję nawigacji opartej o aktualne informacje o natężeniu ruchu.
Produkt polskiej firmy Neptis SA jest darmowy i można go pobrać ze sklepu Google
Play.
Rysunek 8. Aplikacja Yanosik, widok zgłaszania
[11]
Rysunek 9. Aplikacja Yanosik, widok nawigacji
[11]
19
Opisane przeze mnie aplikacje korzystają z akcelerometru i modułu GPS, ale żadna
nie używa obu jednocześnie. Każda z nich oferuje pewne ciekawe funkcje, które można
wykorzystać w opracowywanym projekcie. Dwa pierwsze programy rejestrują pomiary
przyspieszeń i interpretują je, trzeci prezentuje na mapie ostatnio odwiedzane miejsca,
a ostatni z wymienionych umożliwia użytkownikowi zgłoszenie sytuacji na drodze
w obecnej lokalizacji. Tworząc aplikację mogę wzorować się na Accelerometer Monitor
w kwestii zapisu danych z akcelerometru do pliku i reagowania na przekroczenie
ustawionej wartości. Natomiast przebyta trasa może być zaznaczana linią na mapie,
w sposób zbliżony, jak w aplikacji Moje trasy, z uwzględnieniem szczególnych miejsc
wyróżnianych oddzielnie.
20
2. Projekt rozwiązania
2.1 Przeznaczenie aplikacji
Projektowana aplikacja przeznaczona jest dla kierowców pojazdów silnikowych,
w szczególności samochodów osobowych, ale także ciężarówek, autobusów, itp. Może
być również obsługiwana przez pasażerów. Służy przede wszystkim do zbierania
i gromadzenia danych dotyczących przyspieszeń, którym podlega pojazd podczas jazdy.
Efektem analizy rejestrowanych wartości powinno być automatyczne rozpoznawanie
wstrząsów, które można zakwalifikować jako nierówności drogi. Rezultaty powinny
zostać zaprezentowane na mapie i zapisane do pliku.
2.2 Wymagania funkcjonalne
Rejestrowanie przyspieszeń i położenia
Aplikacja powinna rejestrować i zapisywać w bazie danych odczyty
z akcelerometru w trzech osiach i wartość wypadkową przyspieszenia, a także
informacje o aktualnej lokalizacji w postaci współrzędnych geograficznych.
Wspomniane informacje powinny być powiązane ze sobą oraz z czasem pomiaru.
Dodatkowo, powyższe dane mogą być wyświetlane na bieżąco, aby potwierdzić
prawidłowe działanie aplikacji.
Automatyczne wykrywanie nierówności
Aplikacja powinna rozpoznawać i klasyfikować nierówności w czasie
rzeczywistym na podstawie wartości pionowej składowej przyspieszenia.
Wartość progowa, powyżej której wstrząsy będą traktowane jako znaczące, może
być wprowadzana przez użytkownika w ustawieniach, bądź też pozostać na
poziomie domyślnym. Współrzędne miejsca wystąpienia sytuacji wyjątkowej
powinny być zapisywane.
Zgłaszanie wybojów przez użytkownika
Aplikacja powinna umożliwiać użytkownikowi sygnalizowanie natrafienia na
nierówność w prosty sposób (na przykład głosowo), tak aby był w stanie
zareagować możliwie szybko po zdarzeniu. Ręczne zgłaszanie wybojów pozwala
na weryfikację wykrywalności za pomocą urządzenia oraz subiektywną
klasyfikację nierówności.
21
Wyświetlanie przebytej trasy na mapie
Aplikacja powinna prezentować pokonaną drogę ze szczególnym wyróżnieniem
miejsc, w których odczuwalne były największe wstrząsy. Takie miejsca można
rozróżnić pod względem siły wstrząsów i przypisać do odrębnych kategorii,
zaznaczając je w odmienny sposób. Wyświetlane powinny być zarówno wyboje
rozpoznane automatycznie przez program, jak i te zgłoszone przez użytkownika.
Dodatkowo, na mapie ma być wyświetlona aktualna lokalizacja.
Zapis trasy do pliku
Aplikacja powinna zapisywać w pamięci urządzenia trasę wraz z naniesionymi
wybojami w formacie powszechnie używanym do prezentacji informacji
geograficznych, KML (Keyhole Markup Language), łatwym do otwarcia za
pomocą, na przykład, programu Google Earth.
Prezentowanie ekranu pomocy
Aplikacja powinna oferować ekran pomocy, w którym w sposób przystępny
objaśnione są poszczególne funkcje oraz zaprezentowane informacje o programie
i o autorze.
2.3 Wymagania niefunkcjonalne
Aplikacja może funkcjonować w podobny sposób jak istniejące systemy nawigacji
samochodowej. W ich przypadku oszczędność baterii nie ma najwyższego priorytetu,
gdyż niemal w każdym samochodzie znajduje się gniazdko elektryczne, do którego
w razie potrzeby można podłączyć ładowarkę. Dlatego aspekt energooszczędności,
tak istotny dla wielu aplikacji mobilnych, w moim projekcie nie jest kluczowy.
Aplikacja powinna być zbudowana ze standardowych komponentów dostarczanych
przez platformę, a jej interfejs graficzny powinien być zaprojektowany zgodnie
z wytycznymi przygotowanymi przez zespół specjalistów [12].
Wymagania dotyczące platformy:
Urządzenie mobilne (telefon komórkowy, tablet) z systemem Android w wersji
2.3 lub wyższej – powyższe wymaganie spełnia ponad 90% androidowych
urządzeń na rynku [13].
Wbudowane czujniki: akcelerometr, moduł GPS – występują na pokładzie
zdecydowanej większości urządzeń mobilnych.
Dostęp do internetu (za pośrednictwem sieci komórkowej lub Wi-Fi) –
do przyspieszenia określania położenia i do wczytania zawartości Map Google.
Dostęp do usług lokalizacyjnych – wymagany w celu określenia położenia.
Zainstalowane Usługi Google Play – potrzebne do wyświetlenia Map Google.
22
2.4 Koncepcja rozwiązania
Głównym zadaniem projektowanej aplikacji jest rejestrowanie przeciążeń podczas
jazdy. W tym celu wykorzystywany jest wbudowany w urządzenie mobilne akcelerometr.
Jego odczyty pozwalają określić siłę i kierunek oddziaływania przeciążeń. Korzystając
z metod dostarczanych przez platformę Android, można otrzymać wartości
przyspieszenia w każdej z trzech osi układu współrzędnych. Są one wyrażone
w jednostkach fizycznych – m/s2.
Układ współrzędnych używany przez system definiuje osie w następujący sposób
w odniesieniu do urządzenia: oś x przebiega poziomo i jest skierowana w prawo,
oś y pionowo do góry, a oś z w stronę patrzącego na ekran. Zostało to zaprezentowane na
rys. 10. Należy pamiętać, że odczyty z akcelerometru obejmują przyspieszenie ziemskie,
którego wartość wynosi 9,81 m/s2. W związku z tym aplikacja stosuje algorytm, który
eliminuje wpływ grawitacji na wynik pomiaru, bez względu na położenie urządzenia
względem osi. Wówczas, wartość każdej składowej przyspieszenia powinna być równa
zero, gdy urządzenie leży nieruchomo.
Rysunek 10. Układ współrzędnych w systemie Android [14]
Analiza zmian przyspieszenia w rozbiciu na składowe umożliwia wykrywanie
różnych zdarzeń w kontekście ruchu pojazdów. Przyjmijmy, że telefon jest ułożony
pionowo, przymocowany do samochodu, a jego ekran skierowany w kierunku
przeciwnym do kierunku jazdy. W tej sytuacji, niezerowe wyniki pomiarów wzdłuż osi x
mogą oznaczać, że samochód pokonuje zakręt, gwałtowna zmiana w osi y może
sygnalizować najechanie na nierówność, natomiast w przypadku osi z – przyspieszanie
lub hamowanie. W celu zapewnienia wiarygodnych rezultatów, urządzenie podczas
pomiarów powinno być umieszczone w taki sposób, aby jedna z jego osi była prostopadła
do powierzchni Ziemi.
23
Dane akcelerometru mogą być aktualizowane z różną częstotliwością. System daje
możliwość wyboru jednej z czterech domyślnych wartości, jednak nie jest możliwe
precyzyjne ustawienie próbkowania. Czasy rzędu 200 ms, 60 ms lub 20 ms to tylko
sugestie interwałów pomiędzy sąsiednimi pomiarami, które nie zawsze są uwzględniane
przez urządzenie. Ostatnia z opcji to najmniejsze możliwe opóźnienie, które całkowicie
zależy od konkretnego modelu.
Częstsze odczyty zwiększają obciążenie procesora i zużycie energii, natomiast zbyt
rzadkie zmniejszają precyzję odwzorowania wstrząsów. Dodatkowo, im częściej
rejestrujemy dane, tym większe są pliki, na których operujemy, a ich przetwarzanie trwa
dłużej. Dlatego, decydując się na rozwiązanie będące kompromisem, wybrałem
częstotliwość, która na urządzeniu testowym kształtowała się na poziomie 15 Hz.
W przypadku rejestrowania zdarzeń dotyczących pojazdów, większa częstotliwość nie
jest wymagana, chociażby z uwagi na ich dużą bezwładność.
Informacje o przeciążeniach w kontekście transportu staną się o wiele bardziej
przydatne, jeśli zostaną powiązane z miejscem, w którym występują. W wyniku
gromadzenia i analizy takich danych możliwe jest na przykład stworzenie mapy
nierówności drogowych. Aplikacja wykorzystuje moduł GPS w celu określenia
aktualnego położenia. W związku z tym, że pierwsze obliczenie lokalizacji wyłącznie na
podstawie sygnału GPS trwa stosunkowo długo, aplikacja wspomaga się również
metodami bazującymi na sieciach bezprzewodowych i komórkowych. Jednak na ogół są
one znacznie mniej dokładne, dlatego po początkowym ustaleniu pozycji nie są już
wykorzystywane.
Dane o lokalizacji odbierane są z największą dostępną częstotliwością, która zależy
od sprzętu oraz warunków zewnętrznych, aby możliwe było jak najdokładniejsze
przypisanie współrzędnych geograficznych do pomiarów przyspieszenia. Mimo to,
przyspieszenie jest próbkowane znacznie częściej niż lokalizacja, wobec czego jedno
miejsce może być opisane co najmniej kilkoma wartościami przyspieszenia. W praktyce,
moduły GPS stosowane we współczesnych urządzeniach mobilnych ograniczone są do
częstotliwości od jednego do kilku herców. Nie jest to jednak istotny problem,
gdyż precyzja umiejscowienia, np. nierówności, na poziomie kilku-kilkunastu metrów
powinna być wystarczająca dla większości zastosowań.
Jak już wcześniej uzasadniałem, dane akcelerometru są znaczące praktycznie jedynie
w powiązaniu z lokalizacją odczytaną na podstawie sygnału GPS. Dlatego w przypadku,
gdy aktualne współrzędne nie są dostępne, dane nie zostaną zapisane, a zdarzenia
drogowe nie będą wykrywane. Taka sytuacja występuje na początku, przez pewien czas
po rozpoczęciu pomiaru, ponieważ wartości przyspieszenia są dostępne w każdej chwili,
a informacje o dokładnej lokalizacji z opóźnieniem, które wynika z czasu określania jej
po raz pierwszy. Wszystkie odczytywane wyniki wyświetlane są na ekranie na bieżąco,
pochodzące z akcelerometru – cały czas, natomiast te z modułu GPS – odkąd zostaną
obliczone. Dzięki temu, użytkownik jest w stanie przynajmniej pobieżnie zweryfikować,
czy aplikacja działa poprawnie.
24
Pomiary czujników zapisywane są na bieżąco w bazie danych. Do jej utworzenia
i obsługi wykorzystywany jest silnik bazodanowy SQLite, dostarczany przez system.
Baza znajduje się w pamięci urządzenia, w obszarze chronionym, do którego dostęp ma
wyłącznie opisywana aplikacja. Umożliwia łatwy dostęp do danych z poziomu programu.
Przy każdej aktualizacji odczytu z akcelerometru dodawany jest jeden rekord zawierający
czas pomiaru, informacje o przyspieszeniu i ostatnio odebranej lokalizacji.
W bazie danych gromadzone są pełne wyniki pomiarów dostarczanych przez
akcelerometr. Mogą one służyć do wykrywania rozmaitych sytuacji drogowych, badania
ruchu, itp. Opisywana aplikacja skupia się jednak na rezultatach dotyczących pionowej
składowej przyspieszenia i wartości wypadkowej przyspieszenia. Analiza powyższych
parametrów pozwala rozpoznać w sposób automatyczny nierówności drogi. Wstrząsy,
dla których składowa przyspieszenia przekracza wartość progową zdefiniowaną
w ustawieniach, traktowane są jako wykryte anomalie.
Dodatkowo, istnieje możliwość zgłaszania wybojów przez użytkownika, będąca
rozszerzeniem trybu automatycznego o opcję. Kierowca/pasażer może zasygnalizować
przejechanie szczególnie uciążliwej nierówności poprzez wciśnięcie odpowiedniego
przycisku na ekranie. Jest on dostępny przez cały czas w trybie pomiaru, aby odnalezienie
go było intuicyjne i nie absorbowało uwagi podczas jazdy. Wówczas, następuje zapis
lokalizacji i czasu, w którym sytuacja została zarejestrowana. Oznaczenie będzie zawsze
obarczone pewnym opóźnieniem i przesunięciem w przestrzeni, jednak nie da się ich
w prosty sposób wyeliminować, gdyż zależą od działań użytkownika. Z założenia, taka
funkcjonalność powinna służyć użytkownikowi, dlatego należy uwierzyć w dobre
intencje korzystającego i nie ograniczać możliwości zgłoszenia wybojów w dowolnym
miejscu i czasie.
Efekt analizy zgromadzonych danych prezentowany jest w postaci mapy
z zaznaczoną trasą oraz nierównościami. Wykorzystywany jest mechanizm Google
Maps, standardowy element systemu Android. Umożliwia on wyświetlanie aktualnej
pozycji, dowolne przybliżanie, oddalanie i przesuwanie widoku. Korzystając z danych
zgromadzonych w bazie podczas pomiaru, aplikacja wyświetla przebytą trasę. Kolejne
zapisane współrzędne łączone są ze sobą linią, a miejsca, w których zostały wykryte lub
zgłoszone wstrząsy, oznaczane punktami w dwóch różnych kolorach, w zależności od
źródła informacji. Zobrazowana w ten sposób trasa może być dodatkowo
wyeksportowana do pliku, co pozwala zaprezentować ją w przeglądarce internetowej lub
za pomocą zewnętrznej aplikacji. Plik .kml jest tworzony na żądanie użytkownika,
zgodnie z opisem standardu Keyhole Markup Language, tak aby był z nim w pełni
kompatybilny. Zapisywany jest w pamięci zewnętrznej urządzenia.
25
2.5 Architektura rozwiązania
Aplikacje tworzone na platformę Android, z wykorzystaniem bibliotek systemowych
mają ściśle określoną strukturę. Zbudowane są z czterech rodzajów komponentów,
a każdy program musi zawierać co najmniej jeden z nich [15]:
Aktywność (ang. Activity) – ekran interfejsu użytkownika
Usługa (ang. Service) – komponent działający w tle
Dostawca treści (ang. BroadcastProvider) – komponent służący do
współdzielenia danych pomiędzy aplikacjami
Odbiornik komunikatów (ang. ContentProvider) – komponent reagujący na
globalne zdarzenia
Oprócz klas, które zawierają kod programu i są napisane w języku Java, aplikacje
posiadają również zbiór zasobów i plik manifestu. Zasoby wpływają na to, jak wygląda
interfejs użytkownika, natomiast AndroidManifest.xml to najważniejszy plik projektu.
Tworzona przeze mnie aplikacja została nazwana Sense (z ang. wyczuwać, wykrywać,
również zmysł, sens). Jest ona podzielona na kilka aktywności, co prezentuje poniższy
schemat.
Pierwsza, uruchamiana zawsze przy włączeniu programu to MainActivity. Obejmuje
ona menu główne, z którego można nawigować do innych części programu. Głównym
jej elementem są opcje, po wybraniu których uruchamiane są pozostałe komponenty:
widok pomiaru, ustawienia oraz pomoc.
Rysunek 11. Aktywności aplikacji
Start MainActivity SensingActivity MapsActivity
SettingsActivity HelpActivity
26
Widok pomiaru reprezentowany jest przez aktywność SensingActivity. Po przejściu
do tego widoku rozpoczynają się odczyty przyspieszenia z akcelerometru oraz położenia
z modułu GPS. Nawiązywane jest połączenie z bazą danych i każdy zestaw
zarejestrowanych wartości zostaje do niej zapisany. Na tym ekranie wyświetlane są
aktualne wartości przyspieszenia jako każda składowa oddzielnie oraz wartość
wypadkowa, a także współrzędne geograficzne. Opisywana aktywność oferuje
możliwość manualnego zgłaszania nierówności. Dostępny w tym widoku pasek akcji
(ang. ActionBar), standardowy element platformy Android, umożliwia cofnięcie się do
menu głównego, ale również bezpośrednie przejście do ekranu pomocy lub ustawień.
Natomiast po zakończeniu pomiaru, tworzona jest nowa aktywność z widokiem mapy.
MapsActivity ładuje widok mapy Google Maps i konfiguruje wyświetlane elementy.
Odczytuje informacje z bazy danych i na ich podstawie nanosi przebytą trasę
i nierówności. Opisywana aktywność oferuje możliwość zapisu naniesionych danych do
pliku.
Widok ustawień, za który odpowiada aktywność SettingsActivity, umożliwia
użytkownikowi dostosowanie działania aplikacji do własnych potrzeb. Pozwala na
wprowadzenie pożądanego progu czułości wykrywania nierówności. Odbywa się to
poprzez wpisanie wartości liczbowej za pomocą klawiatury. Preferencje użytkownika są
zapamiętywane pomiędzy uruchomieniami aplikacji, zatem nie ma potrzeby
wprowadzania na nowo własnych ustawień po restarcie.
Ekran pomocy – HelpActivity przedstawia w skrócie poszczególne funkcje programu,
objaśnia stosowane nazewnictwo i symbole. W tym miejscu prezentowane są również
informacje o autorze aplikacji.
Klasa Database ułatwia dostęp do bazy danych. Dostarcza metody, które pozwalają
zapisywać i odczytywać informacje w prosty sposób. Odpowiedzialna jest za to, aby
poprawnie utworzyć bazę danych, jeśli jeszcze nie istnieje oraz ją aktualizować. Zamyka
w swojej strukturze działania, które wymagają wykorzystania języka SQL, aby na
zewnątrz klasy nie było konieczne jego użycie.
Baza danych zawiera jedną tabelę, w której przechowywane są wszystkie
rejestrowane informacje. Tabela sensor_values składa się z siedmiu kolumn. Atrybut time
zawiera informację o czasie pomiaru, reprezentowaną w postaci liczby milisekund, które
upłynęły od 1 stycznia 1970 roku. Liczba ta jest całkowita, dlatego zapisywana jest jako
bazodanowy typ danych INTEGER. Atrybuty x, y, z oraz result dotyczą przyspieszenia,
a ich wartości wyrażane są w metrach na sekundę do kwadratu, jako liczba rzeczywista
z częścią ułamkową. Kolumny longitude i latitude przechowują współrzędne w postaci
stopni dziesiętnych, zatem również są typu REAL.
Klasa SensorData zawiera pola przechowujące wyniki pomiaru oraz metody służące
do otrzymania każdego z nich z poziomu kodu programu. Zmienne są nazwane
analogicznie jak atrybuty tabeli sensor_values bazy danych. Zmienna time jest liczbą
całkowitą typu long, natomiast pozostałe to liczby zmiennoprzecinkowe: x, y, z, result –
typu float, natomiast longitude i latitude – typu double.
27
Tabela sensor_values
Opis Czas
pomiaru
Wartości przyspieszenia Współrzędne
geograficzne
Oś X Oś Y Oś Z Łącznie Długość Szerokość
Nazwa
kolumny time x y z result longitude latitude
Typ
danych INTEGER REAL REAL REAL REAL REAL REAL
Tabela 2. Schemat tabeli sensor_values
28
3. Realizacja
3.1 Stosowane narzędzia
Android Studio
Od pewnego czasu, oficjalnym środowiskiem programistycznym do tworzenia
aplikacji na platformę Android jest Android Studio. Program zbudowany na bazie IntelliJ
IDEA firmy JetBrains zastąpił w tej roli popularne środowisko Eclipse z wtyczką ADT.
Mimo iż do tej pory miałem większe doświadczenie w pracy z Eclipse, postanowiłem
pójść z duchem czasu i wybrałem Android Studio. Uznałem, że jest to doskonała okazja,
aby poznać narzędzie, które zbiera pochlebne opinie wśród użytkowników.
Nowe środowisko gromadzi wszystkie potrzebne komponenty w jednym
miejscu – oferuje zaawansowany edytor kodu, wygodny graficzny edytor interfejsu,
a także pozwala zbudować i uruchomić aplikację za pomocą jednego kliknięcia.
Do uruchomienia tworzonej aplikacji potrzebny jest emulator lub urządzenie docelowe
z systemem Android. Z uwagi na łatwą dostępność takiego urządzenia – jestem
posiadaczem jednego z nich – oraz szybsze działanie platformy i, co bardzo ważne,
fizyczną obecność wbudowanych czujników, zdecydowałem się rozwijać aplikację
z wykorzystaniem telefonu Samsung Galaxy S4 Mini (GT-I9195) z Androidem w wersji
4.4.2 (KitKat).
Git
Rozwijając swój projekt, korzystałem z systemu kontroli wersji Git, a repozytorium
umieściłem w serwisie Bitbucket. Git pozwala zarządzać kodem w prosty sposób na
różnych etapach projektu, dodawać nowe funkcjonalności lub rezygnować z nich bez
wpływu na pozostałe. Można śledzić historię zmian i w dowolnym momencie bez
problemu wrócić do którejś z poprzednich wersji. W stosunku do konkurencyjnych
rozwiązań (np. SVN, CVS, Mercurial) posiada wiele zalet: jest szybki, zaawansowany
funkcjonalnie i jednocześnie prosty w obsłudze, a także bardzo popularny wśród
programistów.
Dzięki temu, że kod znajduje się w prywatnym repozytorium w internecie, mam do
niego dostęp z dowolnego urządzenia podłączonego do sieci i nie muszę dodatkowo
martwić się o kopię zapasową. Wybór serwisu hostingowego padł na Bitbucket, gdyż
w przeciwieństwie do konkurencyjnego GitHuba, oferuje przechowywanie prywatnych
repozytoriów bezpłatnie.
29
SQLite
Aby gromadzić dane rejestrowane przez czujniki, korzystam z bazy danych SQLite,
która jest dostarczana przez system Android [16]. Jest to najpowszechniej stosowany
silnik bazodanowy na świecie. Jego popularność wynika m. in. z ogromnych możliwości
przy zachowaniu niewielkiego rozmiaru, a także szybkości działania, dzięki czemu
doskonale nadaje się do zastosowania w urządzeniach mobilnych. Warto podkreślić,
że silnik SQLite jest darmowy, a jego kod źródłowy jest dostępny publicznie,
do dowolnego wykorzystania, również komercyjnego. Programista tworzy tabele bazy
danych, wprowadza do niej wartości oraz uzyskuje do nich dostęp przy użyciu instrukcji
języka SQL. Baza danych SQLite przyjmuje postać jednego pliku, który można w łatwy
sposób przenieść na inne urządzenie i nadal z niego korzystać. Uznałem, że jest to
najbardziej odpowiednie narzędzie do składowania odczytów z akcelerometru i modułu
GPS wraz z czasem ich rejestracji.
Google Maps Android API v2
Google Maps Android API v2 to narzędzie, które pozwala programiście umieścić
mapę jako element jego aplikacji. Jest częścią platformy usług Google Play, a zatem
wymaga posiadania tego komponentu na urządzeniu docelowym, aby prawidłowo
wyświetlać mapę oraz odpowiedniego zestawu narzędzi dla programistów w celu
zbudowania aplikacji. Mapy Google są w stanie wyświetlać różne rodzaje map, m. in.
drogową, satelitarną czy terenową, umożliwiają nanoszenie na powierzchnię własnych
linii, kształtów, obiektów i innych informacji. Ich zaletą jest duża dokładność i aktualność
danych, zwłaszcza, że społeczność użytkowników internetu może przyczyniać się do
współtworzenia projektu.
Narzędzie dostarczane przez firmę Google pozwala w stosunkowo dużym stopniu
dostosować sposób prezentacji map do potrzeb twórcy oprogramowania. Moim zamiarem
było zwizualizowanie rozmieszczenia nierówności dróg, co zrealizowałem poprzez
umieszczanie kolorowych punktów w miejscu ich występowania. Proces odbywa się
automatycznie, z wykorzystaniem możliwości dostępnych bibliotek.
Wadą wybranego narzędzia jest konieczność połączenia z internetem w celu pobrania
map. Istnieją co prawda konkurencyjne rozwiązania (np. Sygic, HERE, OsmAnd), które
korzystają z danych zapisanych w pamięci wewnętrznej lub zewnętrznej urządzenia i nie
wymagają dostępu do sieci, jednak takie podejście również nie jest pozbawione
niedoskonałości, gdyż aplikacja zajmuje znacznie więcej miejsca i dostarcza nie zawsze
najbardziej aktualne informacje. Ostatecznie, uważam, że zastosowanie Google Maps
API było rozsądnym wyborem.
30
3.2 Stosowane algorytmy
Wartości przyspieszenia mierzone za pomocą akcelerometru są podstawą działania
opisywanej aplikacji. Otrzymane dane powinny jednak zostać poddane przetwarzaniu,
aby można było z nich skorzystać w większym stopniu. W tym celu warto zastosować
algorytmy służące kalibracji i filtracji.
Wbudowany akcelerometr dostarcza odczyty, na które wpływ mają siły grawitacji,
dlatego wartość pionowej składowej przyspieszenia jest zawsze powiększona o około
9,81 m/s2. Na potrzeby projektowanego systemu, istotne jest, aby ten wpływ
wyeliminować, a co za tym idzie, urządzenie pozostające w spoczynku wskazywało
zerową wartość przyspieszenia. Sposobem na uzyskanie pożądanego efektu może być
zastosowanie filtrów górno- i dolnoprzepustowych [3].
Algorytm filtrujący w pierwszym etapie stosuje filtr dolnoprzepustowy w celu
wydzielenia wpływu sił grawitacji. Nowa wartość przyspieszenia wynikająca z grawitacji
jest wynikiem dodawania poprzedniej wartości przyspieszenia ziemskiego, pomnożonej
przez pewną stałą ALPHA i nowej wartości przyspieszenia zmierzonej przez
akcelerometr, pomnożonej przez (1 – ALPHA). Stała ALPHA określa, w jakich
proporcjach zaktualizowana wartość grawitacji zależy od każdego ze składników. Stała
może przyjmować wartości w zakresie od 0 do 1. Im jest mniejsza, tym bardziej nowy
pomiar zmienia starą wartość grawitacji, a gdy stała zmierza do 1, nowy odczyt ma coraz
mniejszy wpływ. Może być dobrana w sposób eksperymentalny.
Następnie, mając już obliczony wpływ każdej składowej sił grawitacji, wystarczy
odjąć ich wartości od odpowiednich składowych aktualnego pomiaru akcelerometru, aby
otrzymać poszukiwane rezultaty. Poniżej znajduje się fragment kodu odpowiedzialny za
wykonanie algorytmu. Metoda highPassFilter przyjmuje jako argumenty wartości
poszczególnych składowych przyspieszenia, stosuje filtrację i w wyniku zwraca nowe
wartości składowych. Wywoływana jest za każdym razem, gdy aplikacja odbiera
aktualizację pomiarów.
private float[] highPassFilter(float x, float y, float z)
{
float[] filtered = new float[3];
// Filtr dolnoprzepustowy
gravity[0] = ALPHA * gravity[0] + (1 - ALPHA) * x;
gravity[1] = ALPHA * gravity[1] + (1 - ALPHA) * y;
gravity[2] = ALPHA * gravity[2] + (1 - ALPHA) * z;
// Filtr górnoprzepustowy
filtered[0] = x - gravity[0];
filtered[1] = y - gravity[1];
filtered[2] = z - gravity[2];
return filtered;
}
31
Poniższa ilustracja prezentuje wpływ dwóch różnych wartości stałej (w tym
przypadku nazwanej a) na otrzymane wyniki filtracji. Surowe dane oscylują wokół
wartości pomiaru 1, natomiast po zastosowaniu filtru, przesunięcie zostało
wyeliminowane i sygnał oscyluje wokół 0. Przy uwzględnieniu stałej na poziomie 0,95
różnice między wartością minimalną i maksymalną zostają w przybliżeniu zachowane,
natomiast stała wynosząca 0,1 w bardzo dużym stopniu zniekształca dane wejściowe.
Rysunek 12. Filtr górnoprzepustowy z użyciem dwóch różnych wartości stałej a [3]
Rozpoznawanie wybojów polega na analizie pionowej składowej przyspieszenia.
Osie układu współrzędnych są zdefiniowane w odniesieniu do urządzenia, zatem po
obróceniu telefonu o 90°, inna oś odpowiada kierunkowi pionowemu. Aby możliwe było
wykrywanie nierówności niezależnie od tego, czy urządzenie jest ułożone pionowo, czy
poziomo, należy przedefiniować osie układu współrzędnych przed rozpoczęciem
pomiaru. Przy tym zakładam, że urządzenie umieszczone jest nieruchomo, w taki sposób,
że któraś z jego osi jest w przybliżeniu prostopadła do powierzchni ziemi.
Nieprzetworzone dane z akcelerometru zawierają wpływ sił grawitacji, zatem wartość
jednej ze składowych jest znacznie większa niż pozostałych. Na tej podstawie można
określić, która z osi urządzenia jest pionowa. Aby ograniczyć prawdopodobieństwo
błędnego rozpoznania, sumowane są wartości kilkunastu kolejnych odczytów, dla każdej
składowej oddzielnie i porównywane ze sobą. Do dalszej analizy pod kątem wykrywania
nierówności brana jest pod uwagę oś, dla której suma kolejnych wartości przyspieszenia
okazała się największa.
Gdyby urządzenie było wyraźnie przechylone, żadna z jego osi nie odpowiadałaby
kierunkowi działania grawitacji. Wówczas detekcja wstrząsów byłaby nieprecyzyjna,
ponieważ nawet gwałtowne hamowanie mogłoby być uznane za wybój. Jednak
w sytuacji, gdy oś jest nieznacznie odchylona od pionu (w zakresie do kilkunastu stopni),
wystarczy skorygować wartość progową stosowaną przy wykrywaniu nierówności.
32
W tym celu, podczas kalibracji obliczane są średnie wartości przyspieszenia dla osi
zbliżonej do pionu i przyspieszenia wypadkowego. Stosunek pierwszej miary do drugiej
daje w rezultacie wartość współczynnika korekcyjnego, przez który należy pomnożyć
wartość progową ustawioną przez użytkownika, aby otrzymać wiarygodne wyniki
detekcji.
Istnieją różne algorytmy, których zadaniem jest wykrywanie nierówności. Cztery
odmienne podejścia zostały zaprezentowane w publikacji naukowców z Uniwersytetu
Łotewskiego [5].
Pierwszy algorytm wykorzystuje wartość bezwzględną pionowej składowej
przyspieszenia. Porównuje ją z przyjętym progiem, powyżej którego zdarzenie zostaje
zidentyfikowane jako wybój. Detekcja może się odbywać już w chwili odebrania pomiaru
z akcelerometru. Poniższy rysunek obrazuje działanie opisanej metody. Nierówność
rozpoznawana jest wówczas, gdy przyspieszenie przekroczy próg oznaczony na wykresie
przerywaną linią.
Rysunek 13. Algorytm rozpoznawania nierówności nr 1 [5]
Kolejny sposób polega na obliczaniu różnicy dwóch kolejnych pomiarów. Kiedy
rezultat przekracza określoną wartość progową, oznacza to wykrycie szarpnięcia,
co może świadczyć o nierówności.
Rysunek 14. Algorytm rozpoznawania nierówności nr 2 [5]
33
Trzeci algorytm wykorzystuje właściwości odchylenia standardowego pionowej
składowej przyspieszenia. To podejście wymaga przetwarzania danych już po
zakończeniu pomiaru. Rozpoznawanie nierówności na bieżąco nie jest możliwe.
Szerokość okna oraz próg wykrywania muszą być podane.
Rysunek 15. Algorytm rozpoznawania nierówności nr 3 [5]
Ostatnia metoda polega na wykrywaniu sytuacji, dla których pomiary akcelerometru
we wszystkich trzech osiach wskazują wartości poniżej pewnego określonego progu.
Ten algorytm zakłada operowanie na wynikach z uwzględnieniem wpływu grawitacji
oraz nie wymaga znajomości ułożenia osi układu współrzędnych, jednak ma najniższą
skuteczność.
Rysunek 16. Algorytm rozpoznawania nierówności nr 4 [5]
W swoim projekcie zastosowałem pierwszy algorytm rozpoznawania nierówności.
Wydaje się on intuicyjny, stwarza możliwość zdefiniowania progu wykrywania wybojów
w prosty sposób, przystępny dla użytkownika bez specjalistycznej wiedzy. Co istotne, nie
wymaga skomplikowanych obliczeń, co pozytywnie wpływa na obciążenie urządzenia.
34
3.3 Opis implementacji
AndroidManifest.xml
Plik AndroidManifest.xml jest obowiązkowym elementem każdego programu
tworzonego na platformę Android. Znajduje się w głównym katalogu aplikacji i zawiera
informacje o niej prezentowane na potrzeby systemu.
Rejestruje wszystkie komponenty, z których zbudowana jest aplikacja, takie jak:
Activity, Service, BroadcastProvider oraz ContentProvider.
Określa, która spośród aktywności jest główną, czyli taką, która zostaje wyświetlona
po uruchomieniu z menu systemowego. W przypadku tej aplikacji jest to
MainActivity, czyli ekran zawierający menu główne.
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
Definiuje nazwę, pod jaką aplikacja występuje w systemie i ikonę, która jej
towarzyszy. Wartości tych parametrów są zapisane w zasobach. Nazwa to Sense,
a ikona umieszczona jest w katalogu drawable.
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
Wymienia uprawnienia, których program potrzebuje do prawidłowego działania
i zaprezentowania pełni możliwości. Dostęp do niektórych elementów systemu jest
ograniczony ze względu na bezpieczeństwo i ochronę prywatności, dlatego
programista musi zadeklarować w manifeście chęć korzystania z nich. Następnie,
przy instalacji programu użytkownik jest pytany, czy wyraża zgodę na użycie tych
komponentów.
Aplikacja Sense wymaga następujących uprawnień:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
Dostęp do internetu oraz informacji o stanie sieci wymagany jest w celu pobrania
i wyświetlenia aktualnych map danego obszaru za pomocą usług Google Maps.
35
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
/>
Powyższe uprawnienia są konieczne, aby uzyskać dane o aktualnej lokalizacji.
ACCESS_COARSE_LOCATION odpowiada za określanie przybliżonego położenia na
bazie sieci komórkowych i Wi-Fi, natomiast z ACCESS_FINE_LOCATION można
odczytać dokładną lokalizację korzystając również z danych GPS.
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Dzięki tej linijce, możliwy jest zapis plików w pamięci zewnętrznej urządzenia,
co wykorzystywane jest przy eksporcie trasy do pliku KML.
<uses-permission
android:name="com.google.android.providers.gsf.permission.READ_GSERVIC
ES" />
Ostatnie z uprawnień umożliwia dostęp do usług Google, m. in. wykorzystanie
mechanizmu map w tworzonej aplikacji.
Aby móc korzystać z Google Maps Android API, trzeba uzyskać unikalny klucz,
rejestrując swój projekt za pomocą internetowego narzędzia Google APIs Console,
a następnie umieścić go w pliku manifestu w następujący sposób (wprowadzając klucz
w miejsce API_KEY):
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="API_KEY"/>
Cykl życia aktywności
Aktywności są charakterystycznymi komponentami systemu Android, które
posiadają swój własny cykl życia. W danym momencie aktywność znajduje się w jednym
ze stanów: utworzona (created), uruchomiona (started), przywrócona (resumed),
wstrzymana (paused), zatrzymana (stopped) lub zniszczona (destroyed). W trakcie
działania aplikacji aktywność przechodzi z jednego stanu do następnego. Zmianami
stanów zarządza system, wywołując przy tym odpowiednie metody:
onCreate() – wywoływana podczas pierwszego uruchomienia aplikacji
onStart() – wywoływana tuż przed wyświetleniem aktywności
onResume() – wywoływana po wyświetleniu aktywności, gdy ta jest gotowa do
interakcji z użytkownikiem
36
onPause() – wywoływana, gdy aktywność zostaje przesunięta na drugi plan, staje
się nieaktywna, choć częściowo widoczna
onStop() – wywoływana, gdy aktywność staje się niewidoczna dla użytkownika
onRestart() – wywoływana przed ponownym wyświetleniem aktywności, po
wyjściu ze stanu zatrzymana
onDestroy() – wywoływana przed zniszczeniem aktywności
Rysunek 17. Cykl życia aktywności w Androidzie [17]
Każda z implementowanych aktywności musi dziedziczyć po klasie Activity.
W przypadku prostszych aktywności wystarczy zaimplementować jedynie metodę
onCreate(), inicjując wewnątrz niej wymagane elementy. Natomiast w tych bardziej
złożonych należy przesłonić pozostałe metody według potrzeb.
Zgodnie z tym, co zostało zadeklarowane w pliku manifestu, po uruchomieniu
aplikacji wyświetlana jest aktywność MainActivity. W czasie jej tworzenia budowany jest
interfejs użytkownika w oparciu o odpowiedni plik xml, który definiuje jej wygląd. Plik
activity_main.xml opisuje ułożenie trzech przycisków na środku ekranu, ich etykiety oraz
działania związane z naciśnięciem każdego z nich. Ponadto, na początku ładowane są
wartości ustawień użytkownika. Klasa MainActivity rozszerza wbudowany komponent
ActionBarActivity, co oznacza, że u góry ekranu znajduje się pasek akcji, standardowy
element interfejsu Androida, który zawiera nazwę widoku i listę innych widoków. Klasa
zawiera metody wywoływane w reakcji na wybranie przycisków, które uruchamiają
odpowiadające im aktywności SensingActivity, SettingsActivity i HelpActivity. Ostatnie
dwie można wyświetlić przechodząc do nich również z listy paska akcji. Uruchomienie
nowej aktywności wiąże się z przejściem ostatnio aktywnej do stanu zatrzymana.
37
Wybierając pierwszą opcję w menu głównym programu otworzymy widok
SensingActivity. Aktywność rozszerza ActionBarActivity, a z poziomu jej paska akcji
mamy dostęp do ustawień i pomocy. W dolnej części ekranu znajduje się duży, wyraźny
przycisk do manualnego zgłaszania nierówności. W związku z tym, że musi on być łatwo
dostępny, w trybie pomiaru wyświetlacz nie może być automatycznie wygaszany ani
blokowany. Przed wyświetleniem aktywności tworzony jest interfejs użytkownika, a pola
tekstowe są łączone z widokiem. Tworzony jest również obiekt do zarządzania bazą
danych, odczytywane są wartości ustawień oraz uzyskiwany jest dostęp do akcelerometru
i usług lokalizacyjnych.
Przed rozpoczęciem interakcji z użytkownikiem inicjowane jest odbieranie
aktualizacji wartości akcelerometru z częstotliwością około piętnaście razy na sekundę
oraz aktualizacji położenia na podstawie zarówno metod bazujących na sieci, jak i na
module GPS. Dane o lokalizacji uzyskiwane mają być możliwie jak najczęściej, bez
określania minimalnego odstępu czasu ani odległości pomiędzy aktualizacjami. Taki
sposób konfiguracji i wykorzystanie wszystkich dostępnych dostawców położenia
gwarantują najszybsze obliczenie współrzędnych i najświeższe dane. W przypadku
wstrzymania aktywności, w metodzie onPause() zatrzymywane jest odbieranie
aktualizacji pomiarów akcelerometru i danych GPS.
Gdy informacje o lokalizacji zostają zaktualizowane, wywoływana jest metoda
onLocationChanged. Przyjęto, że informacje pochodzące od dostawców sieciowych
służą jedynie do przyspieszenia określania lokalizacji, gdyż na ogół położenie na bazie
sygnału GPS jest określane precyzyjniej. Dlatego dane od NETWORK_PROVIDER są
ignorowane, a współrzędne zmierzone przez moduł GPS zapisywane jako aktualna
lokalizacja i wyświetlane na ekranie.
Jeśli natomiast zmienia się wartość pomiaru akcelerometru, wywoływana jest metoda
onSensorChanged. Najpierw, odczytane dane podlegają filtracji w celu wyeliminowania
wpływu sił grawitacji na wynik pomiaru przyspieszenia. Następnie, obliczana jest
wartość wypadkowa przyspieszenia i rezultaty pojawiają się na wyświetlaczu. Program
pobiera z systemu aktualny czas i na koniec zapisuje najnowsze pomiary przyspieszenia
w bazie danych. Gdy użytkownik zgłosi nierówność poprzez naciśnięcie przycisku,
w bazie danych zapisywane jest to zdarzenie powiązane z ostatnią lokalizacją i czasem
ostatniego odczytu przyspieszenia powiększonego o jedną milisekundę. Po naciśnięciu
przycisku kończącego pomiar aktywność zostaje zatrzymana na rzecz uruchomienia
widoku wyświetlającego przebytą trasę na mapie – MapsActivity.
Aktywność MapsActivity tworzy interfejs użytkownika, obiekt do zarządzania bazą
danych oraz inicjuje widok mapy. Niektóre elementy mapy mogą być ustawiane
programowo. Włączono wyświetlanie aktualnej lokalizacji oraz przycisków do
sterowania poziomem zbliżenia. Inne opcje, takie jak przesuwanie wyświetlanego
widoku czy obracanie ekranu za pomocą gestów są domyślnie dostępne. Ostatnim etapem
inicjalizacji mapy jest zaznaczenie zarejestrowanej trasy przejazdu i nierówności drogi.
38
W tym celu posłużono się oferowanymi przez biblioteki metodami do rysowania linii
i punktów na mapie. Z bazy danych pobierane są wszystkie wyniki, a następnie
współrzędne geograficzne łączone są odcinkami, w kolejności występowania.
Równocześnie, stawiane są odpowiednie oznaczenia w miejscach, gdzie zarejestrowano
wstrząsy. Innym kolorem oznaczane są te wykryte automatycznie, a innym zgłoszone
przez użytkownika.
U dołu ekranu znajduje się przycisk, który pozwala zapisać zaznaczoną trasę do pliku
w pamięci zewnętrznej urządzenia. Wybrałem format KML, gdyż jest on obsługiwany
m. in. przez popularną aplikację Google Earth oraz internetowe usługi służące do
wyświetlania informacji geograficznych. Najpierw, sprawdzana jest dostępność pamięci
zewnętrznej do zapisu. Jeśli pamięć jest dostępna, tworzony jest nowy plik w domyślnej
lokalizacji. Zapisywane są do niego w postaci tekstu nagłówki konfigurujące
wyświetlanie pliku, a następnie wprowadzane są współrzędne w odpowiednim formacie.
Plik jest zakończony odpowiednimi znacznikami, a po jego pomyślnym zapisie
wyświetlane jest powiadomienie.
Klasa SettingsActivity rozszerza wbudowany komponent służący do wyświetlania
ekranu ustawień – PreferenceActivity. Aktywność jest praktycznie całkowicie
definiowana przez plik zasobów preferences.xml. Oferuje możliwość ustawienia wartości
progowej przyspieszenia, powyżej której wstrząsy są traktowane jako istotne nierówności
drogi. Po wybraniu tej opcji, wyświetla się okno dialogowe i klawiatura numeryczna.
Domyślną wartością jest 2.0, a użytkownik może wprowadzić dowolną dodatnią liczbę
jako ułamek dziesiętny. Z perspektywy programisty, wartości ustawień są dostępne
z każdego miejsca w programie. Są one automatycznie zachowywane pomiędzy
uruchomieniami programu, więc nie trzeba dodatkowo martwić się o zapis stanu aplikacji
przy zamykaniu jej.
Aktywność HelpActivity opisuje działanie programu, objaśnia poszczególne funkcje
i dostarcza informacje o autorze. Jej struktura i wygląd określone są w pliku
activity_help.xml, a treść wypełniana jest wewnątrz klasy. Aktywność nie oferuje
interakcji z użytkownikiem, a służy do zaprezentowania treści.
Klasa Database zarządza połączeniem z bazą danych SQLite. Rozszerza klasę
SQLiteOpenHelper, która jest dostarczana przez platformę Android i służy do obsługi
bazy danych. Przy implementacji tej klasy wykorzystałem wzorzec projektowy singleton,
aby obiekt Database był właściwie inicjalizowany. Klasa posiada statyczną metodę, która
służy do uzyskiwania jej instancji. Metoda sprawdza, czy instancja już istnieje, a jeśli nie,
to wywołuje prywatny konstruktor. Dzięki takiemu rozwiązaniu może istnieć tylko jedna
instancja omawianej klasy, co zapobiega występowaniu błędów przy połączeniu z bazą
danych.
39
Tabela bazy danych jest tworzona przy użyciu instrukcji języka SQL, gdy plik bazy
danych wcześniej nie istniał. Dane są wstawiane do tabeli przy pomocy metody, która
przyjmuje jako argument obiekt zawierający wszystkie wyniki jednego pomiaru. Można
otrzymać listę wszystkich pomiarów znajdujących się w bazie danych, wywołując
odpowiednią metodę.
Zasoby
Wygląd interfejsu użytkownika zdefiniowany jest za pomocą plików znajdujących się
w specjalnym katalogu zasobów. Folder res podzielony jest na podkatalogi: drawable,
layout, menu, values i xml.
Katalog drawable zawiera pliki graficzne wykorzystywane w aplikacji. W moim
przypadku są to: ikona programu i obrazki służące do oznaczania
zarejestrowanych nierówności na mapie.
Katalog layout zawiera pliki XML, z których każdy odpowiada jednej aktywności
i służy do opisu jej układu, wyglądu i w pewnym stopniu też zachowania.
Android oferuje trzy podstawowe typy układów: LinearLayout, RelativeLayout
oraz FrameLayout, a ja w większości przypadków zdecydowałem się na
wykorzystanie pierwszego z nich. Wewnątrz układów umieszczane są różne
elementy, takie jak przyciski, etykiety, pola tekstowe. Ich wielkość, położenie
i inne właściwości definiowane są właśnie w takich plikach.
Katalog menu zawiera pliki, które opisują zawartość menu aplikacji (menu
kontekstowego lub opcji).
Katalog values zawiera pliki przechowujące różne wartości liczbowe, tekstowe,
ustawienia. Dzięki takiej koncepcji możliwe jest proste wprowadzanie zmian bez
zagłębiania się w kod programu. W moim projekcie znajdują się tu wymiary
różnych elementów widoku (w pliku dimens.xml) i zawartość wszystkich
stosowanych etykiet tekstowych, zatem przetłumaczenie aplikacji do innej wersji
językowej nie stanowiłoby problemu.
W folderze xml znajduje się tylko jeden plik – preferences.xml, który definiuje
zawartość menu ustawień.
40
4. Testowanie
W celu weryfikacji poprawnego działania aplikacji zostały przeprowadzone ręczne
testy. Testowanie musi się odbywać w sposób manualny, ponieważ działanie aplikacji
wymaga interakcji z użytkownikiem, a także zależy od zewnętrznych czynników.
Program wykorzystuje fizyczne sensory, których nie da się symulować, dlatego należy
przeprowadzić testy na urządzeniu docelowym.
Wyświetlanie przebytej trasy na mapie
Warunki początkowe:
Aktywny dostęp do internetu.
Włączone usługi lokalizacyjne (GPS + sieciowe).
Urządzenie ułożone stabilnie.
Kolejne kroki:
1. Uruchomienie aplikacji.
2. Rozpoczęcie pomiaru.
3. Przejechanie trasy.
4. Zakończenie pomiaru.
Oczekiwany rezultat:
Wyświetlona mapa z zaznaczoną trasą, która zgadza się z rzeczywistością.
Dostępna opcja zapisu trasy do pliku.
Przebieg testu:
Jako trasę testową do prezentacji działania tej funkcjonalności wybrałem fragment
alei Armii Ludowej w Warszawie na odcinku Główny Urząd Statystyczny – Metro
Politechnika. Przejechałem ją autobusem komunikacji miejskiej, a telefon spoczywał na
półce przy szybie. Na załączonym zrzucie ekranu widać, że zaznaczona czarną linią trasa
pokrywa się z przebiegiem ulicy, a więc odpowiada rzeczywistości.
41
Rysunek 18. Wyświetlanie trasy – widok mapy
Rysunek 19. Wyświetlanie trasy – Google Earth
Zapis trasy do pliku
Warunki początkowe oraz kolejno wykonywane kroki są takie same, jak w przypadku
wyświetlania trasy na mapie. Dochodzi jedynie piąty krok:
1.-4. Tak jak w scenariuszu Wyświetlanie przebytej trasy na mapie.
5. Zapisanie pliku KML.
Oczekiwany rezultat:
Wyświetlone powiadomienie o poprawnym zapisie pliku.
Plik track.kml w pamięci urządzenia, w katalogu Download.
Przebieg testu:
Po pokonaniu trasy opisanej w poprzednim punkcie zapisałem ją do pliku KML.
W celu sprawdzenia poprawności tej operacji przeszedłem do odpowiedniego katalogu
i otworzyłem plik za pomocą programu Google Earth. Jak widać na załączonym obrazku
naniesiona linia pokrywa się z jezdnią i wygląda bardzo podobnie do tej wyświetlonej
w widoku aplikacji.
42
Plik track.kml można otworzyć również za pomocą edytora tekstu, aby zobaczyć jego
strukturę i zawartość:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>Track</name>
<Style>
<LineStyle><color>ff00ffff</color><width>4</width></LineStyle>
<PolyStyle><color>7f00ff00</color></PolyStyle>
</Style>
<LineString><extrude>1</extrude><altitudeMode>clampToGround
</altitudeMode>
<coordinates>
21.006017684936523,52.217166900634766,0.36093304
……………………………………………………
</coordinates>
</Placemark>
</Document>
</kml>
Automatyczne wykrywanie nierówności
Warunki początkowe oraz kolejno wykonywane kroki są takie same, jak w przypadku
wyświetlania trasy na mapie. Trasa przejazdu testowego powinna jednak uwzględniać
pokonanie znanej nierówności.
Oczekiwany rezultat:
Zaznaczone na mapie miejsce, w którym odczuwalny był wstrząs.
Przebieg testu:
W celu zarejestrowania nierówności na drodze wybrałem trasę prowadzącą przez
torowisko tramwajowe. Przejazdy tramwajowe lub kolejowe to typowe przykłady miejsc,
w których często występują wyboje. Za pomocą aplikacji monitorowałem odcinek ulicy
Waryńskiego w Warszawie, od Ronda Jazdy Polskiej w stronę placu Konstytucji.
Wybraną trasę przecinają tory tramwajowe w ciągu ulicy Nowowiejskiej.
Po zakończeniu pomiaru wyświetlona została mapa z zaznaczonym na czerwono
punktem, który oznacza wykrytą nierówność. Jak widać na rysunku poniżej, wspomniany
punkt znajduje się w bezpośrednim sąsiedztwie skrzyżowania, przez które biegną tory.
Wyboje zostały zatem wykryte w sposób prawidłowy.
43
Rysunek 20. Rejestrowanie nierówności – automatyczne i manualne
Zgłaszanie wybojów przez użytkownika
Warunki początkowe oraz kolejno wykonywane kroki są bardzo zbliżone do
przypadku Automatyczne wykrywanie nierówności. Jedyną różnicą jest dodatkowe
wciśnięcie przycisku do zgłaszania nierówności po przejechaniu przez nią.
Oczekiwany rezultat:
Wyświetlone powiadomienie o zgłoszeniu nierówności.
Zaznaczone na mapie miejsce nieopodal miejsca wystąpienia wyboju.
44
Przebieg testu:
Do zobrazowania manualnego zgłaszania wybojów został wykorzystany przejazd
opisany w poprzednim punkcie. Po przejechaniu torowiska, kiedy odczułem wstrząsy,
zgłosiłem nierówność wybierając odpowiednią opcję. Zdarzenie to zostało przedstawione
na mapie jako niebieski punkt w pobliżu skrzyżowania – widnieje na rysunku 20.
Znacznik jest nieco oddalony od torów, a wynika to z opóźnienia, z jakim wstrząs został
zgłoszony przez użytkownika. Obsługujący aplikację może dokonać zgłoszenia
w dowolnym momencie, a odległość znacznika od miejsca rzeczywistego wystąpienia
wyboju zależy od niego. Zaprezentowany przypadek potwierdza, że zgłaszanie
nierówności działa prawidłowo.
Zachowywanie wartości ustawień
Warunki początkowe – brak szczególnych.
Kolejne kroki:
1. Uruchomienie aplikacji.
2. Wyświetlenie widoku ustawień.
3. Zmiana parametru.
4. Wyłączenie aplikacji.
5. Ponowne włączenie aplikacji.
6. Wyświetlenie widoku ustawień.
7. Sprawdzenie wartości parametru.
Oczekiwany rezultat:
Wartość parametru po ponownym uruchomieniu aplikacji taka sama jak przed
wyłączeniem.
Test został przeprowadzony według podanych kroków i rezultat był zgodny
z oczekiwanym.
45
Podsumowanie
Celem pracy było stworzenie aplikacji służącej do monitorowania i rejestrowania
parametrów jazdy pojazdów, działającej na urządzeniach mobilnych pod kontrolą
systemu Android. Aplikacja miała wykorzystywać do pomiarów wbudowane czujniki.
W ramach pracy zaimplementowano program, który odczytuje i gromadzi dane
z akcelerometru i modułu GPS. Niosą one informacje na temat przyspieszeń, jakim
podlega pojazd w ruchu drogowym. Zostały one wykorzystane do automatycznego
wykrywania nierówności nawierzchni. Efekty działania aplikacji prezentowane są
użytkownikowi w przystępny sposób oraz zapisywane, w celu umożliwienia dalszej ich
analizy.
Przegląd dostępnych publikacji naukowych dotyczących monitorowania stanu dróg
za pomocą urządzeń mobilnych umożliwił zapoznanie się z prowadzonymi dotychczas
badaniami na ten temat. Wymienione w nim artykuły opisują stosowane algorytmy
filtrowania danych i wykrywania nierówności, które można było wykorzystać w moim
projekcie. Natomiast przegląd istniejących aplikacji pozwolił zorientować się, jak
wygląda obecna sytuacja na rynku programów wykorzystujących sensory, jakie
technologie są stosowane i jakie funkcje oferują.
Sformułowane zostały wymagania stawiane tworzonemu rozwiązaniu. W wyniku ich
analizy powstała koncepcja rozwiązania, następnie zaproponowana została architektura,
po czym wykonano prace nad częścią implementacyjną. Przeprowadzone testy wykazały,
że aplikacja spełnia w satysfakcjonującym stopniu stawiane przed nią wymagania:
Rejestruje przyspieszenie i położenie, czego dowodem mogą być aktualne
wartości obu wielkości wyświetlane na bieżąco na ekranie. Dane są również
zapisywane w bazie danych.
Wykrywa nierówności w sposób automatyczny, stosując przy tym opisane
algorytmy i uwzględniając wartość progową ustawioną przez użytkownika.
Oferuje użytkownikowi możliwość manualnego zgłoszenia wybojów poprzez
naciśnięcie dużego przycisku na ekranie. Wówczas zdarzenie zostaje zapisywane
do bazy danych.
Wyświetla zarejestrowaną trasę i wyboje na mapie, rozróżniając te wykryte
automatycznie od zgłoszonych ręcznie. Umożliwia zapis nanoszonych na mapę
informacji do pliku KML, który da się otworzyć w programie Google Earth
i wyświetlić w prawidłowy sposób.
Prezentuje ekran pomocy, który jest dostępny z menu głównego oraz z widoku
pomiaru. Interfejs graficzny aplikacji jest przejrzysty, stworzony zgodnie
z zaleceniami zawartymi w przewodniku programisty/projektanta. Aplikacja
obsługuje urządzenia z systemem Android w wersji 2.3 oraz każdej nowszej.
46
Efekty działania stworzonej aplikacji potwierdzają możliwość pomyślnego
zastosowania sensorów w urządzeniu mobilnym w celu wykrywania nierówności.
Ponadto, zostawiają otwartą furtkę dla rozwoju projektu. W obecnej formie aplikacja
może służyć pojedynczemu kierowcy, jako ciekawostka, aby mógł zobaczyć, w którym
miejscu były największe wstrząsy i porównać z własnymi odczuciami.
Dalsze prace
W ramach kolejnego etapu, wykraczającego poza ramy czasowe projektu
inżynierskiego, mogą być prowadzone dalsze prace nad rozwinięciem projektu. Można
pomyśleć o stworzeniu części serwerowej, która będzie gromadziła dane spływające
od wielu użytkowników. Na jej podstawie możliwe byłoby, m. in. utworzenie dokładnej
mapy nierówności drogowych. Po stronie urządzenia mobilnego należałoby opracować
metodę oszczędnej synchronizacji danych z serwerem. Dodatkowo, można rozszerzyć
działanie systemu o analizę także pozostałych osi, w celu wykrywania różnych innych
sytuacji drogowych. Wreszcie, warte uwagi byłoby, moim zdaniem, zintegrowanie
pomiarów przyspieszenia z istniejącymi systemami nawigacji samochodowej. Wówczas,
nawigacja działałaby w standardowy sposób, aktualizując co pewien czas lokalizację,
natomiast w tle, niemal niepostrzeżenie zbierane by były pomiary z akcelerometru
i cyklicznie przesyłane do serwera.
47
Dodatek
Podręcznik użytkownika
Instalacja
Aby zainstalować aplikację Sense, na urządzeniu docelowym należy włączyć opcję
Nieznane źródła dostępną w ustawieniach (najczęściej Ustawienia – Zabezpieczenia lub
Ustawienia – Bezpieczeństwo). Następnie, należy przejść do folderu, w którym znajduje
się plik instalacyjny z rozszerzeniem .apk i go uruchomić. Po wyświetleniu się okna
z pytaniem o chęć instalacji i listą uprawnień (rys. 22), należy wybrać Instaluj. Po krótkiej
chwili aplikacja zostanie zainstalowana.
Rysunek 21. Instalacja – nieznane źródła
Rysunek 22. Instalacja – uprawnienia
48
Uruchomienie
Aplikację można uruchomić z poziomu menu głównego wybierając ikonę
przedstawioną na rysunku 24, podpisaną nazwą Sense. Po uruchomieniu wyświetlone jest
menu główne, składające się z trzech pozycji: Start, Ustawienia i Pomoc.
Wybranie opcji Start powoduje wyświetlenie nowego ekranu i rozpoczęcie pomiaru.
Naciśnięcie przycisku Ustawienia przenosi do widoku ustawień aplikacji, a wybranie
opcji Pomoc wyświetla ekran pomocy z informacjami o aplikacji i o autorze. Przejście
do ustawień i pomocy możliwe jest też poprzez menu wyświetlane po naciśnięciu
symbolu trzech kropek, znajdującego się po prawej stronie górnego paska akcji (rys. 23).
Rysunek 23. Menu aplikacji Sense
Rysunek 24. Ikona aplikacji Sense [18]
Przed przystąpieniem do rozpoczęcia pomiarów należy się upewnić, że urządzenie
posiada aktywny dostęp do internetu oraz usługi lokalizacyjne są włączone.
Aby odczyty były wiarygodne, urządzenie musi spoczywać nieruchomo względem
samochodu, np. może być umieszczone w uchwycie na telefon. Usytuowanie urządzenia
pod przednią szybą pozwoli uzyskać możliwie najlepszy sygnał GPS, gdyż na drodze od
nadajnika do odbiornika nie znajdą się wówczas metalowe przeszkody w postaci
elementów konstrukcji pojazdu, co będzie skutkować precyzyjniej określoną lokalizacją.
49
Zalecane jest również podłączenie urządzenia do ładowania, ponieważ działający bez
przerwy moduł GPS i stale włączony ekran mogą w stosunkowo krótkim czasie
rozładować baterię.
Widok pomiaru
W tym trybie na ekranie wyświetlane są odczyty z akcelerometru oraz dane GPS.
Na pasku akcji w górnej części ekranu, po lewej stronie znajduje się symbol strzałki, która
pozwala wrócić do głównego menu, a po prawej wysuwane menu, takie jak w głównym
widoku, umożliwiające przejście do ustawień i pomocy. W dolnej części jest większy
przycisk służący do zgłaszania nierówności oraz mniejszy do zakończenia pomiaru.
Na początku, aplikacja przeprowadza kalibrację pomiarów akcelerometru (przez 2-3
sekundy) i w tym czasie w sekcji Odczyty z akcelerometru wyświetlany jest stosowny
komunikat. Równocześnie odbywa się wyszukiwanie sygnału GPS i dopóki lokalizacja
nie zostanie obliczona, w części Dane GPS zamiast współrzędnych wyświetlana jest
odpowiednia informacja. W tej sytuacji, przycisk Zgłoś nierówność jest nieaktywny.
Po poprawnym zainicjowaniu pomiaru na ekranie widoczne są aktualne wartości
przyspieszenia, w rozbiciu na trzy składowe: x, y, z, a także wartość wypadkowa
przyspieszenia, wyświetlane w m/s2. Poniżej widnieją współrzędne geograficzne:
szerokość i długość, wyświetlone w formacie stopni dziesiętnych.
W trakcie pomiaru nie jest wymagana żadna aktywność użytkownika – program może
automatycznie rejestrować dane. Jednak aplikacja oferuje również możliwość
manualnego sygnalizowania nierówności. W tym celu wystarczy nacisnąć duży przycisk
Zgłoś nierówność, najlepiej możliwie szybko po przejechaniu wyboju, który użytkownik
postanowi zgłosić. Wówczas zapisane zostanie miejsce rejestracji, aby mogło być później
wyświetlone na mapie. Czynności towarzyszy wyświetlany komunikat o zgłoszeniu.
Po przejechaniu trasy, należy wybrać opcję Koniec pomiaru jeszcze, gdy urządzenie
spoczywa stabilnie, aby nie wprowadzać błędnych odczytów. Po zakończeniu pomiaru
wyświetlany jest nowy ekran z mapą.
50
Rysunek 25. Aplikacja Sense – widok pomiaru
Rysunek 26. Aplikacja Sense – widok mapy
Widok mapy
Ekran zawiera mapę z typowymi elementami służącymi do zbliżania i oddalania
widoku oraz wyświetlania aktualnej pozycji. Ponadto, z dołu znajduje się przycisk
służący do zapisywania trasy do pliku KML. Przebyta trasa zaznaczona jest czarną linią,
wykryte automatycznie nierówności – czerwonym punktem, a zgłoszone przez
użytkownika – niebieskim. Po pomyślnym zapisaniu pliku wyświetlany jest stosowny
komunikat.
Ustawienia
W ustawieniach można zmienić wartość progową wykrywania nierówności. Jest to
wielkość przyspieszenia w osi pionowej, powyżej której wstrząs traktowany jest jako
wybój. Może przyjmować wartości dodatnie w postaci ułamków dziesiętnych. Parametr
może być dobierany eksperymentalnie, a sensowne wydają się wartości z przedziału od
1 do 5 m/s2.
51
Spis ilustracji
Rysunek 1. Udział poszczególnych systemów operacyjnych na smartfony w rynku [1] . 8
Rysunek 2. Trilateracja [4] ............................................................................................. 11
Rysunek 3. Aplikacja Accelerometer Monitor [8] .......................................................... 15
Rysunek 4. Aplikacja Measurement of acceleration, pomiar przyspieszenia [9] .......... 16
Rysunek 5. Aplikacja Measurement of acceleration, wykres przyspieszenia [9] .......... 16
Rysunek 6. Aplikacja Moje trasy, widok trasy [10] ....................................................... 17
Rysunek 7. Aplikacja Moje trasy, widok statystyk [10] ................................................. 17
Rysunek 8. Aplikacja Yanosik, widok zgłaszania [11] ................................................... 18
Rysunek 9. Aplikacja Yanosik, widok nawigacji [11] .................................................... 18
Rysunek 10. Układ współrzędnych w systemie Android [14]........................................ 22
Rysunek 11. Aktywności aplikacji ................................................................................. 25
Rysunek 12. Filtr górnoprzepustowy z użyciem dwóch różnych wartości stałej a [3] .. 31
Rysunek 13. Algorytm rozpoznawania nierówności nr 1 [5] ......................................... 32
Rysunek 14. Algorytm rozpoznawania nierówności nr 2 [5] ......................................... 32
Rysunek 15. Algorytm rozpoznawania nierówności nr 3 [5] ......................................... 33
Rysunek 16. Algorytm rozpoznawania nierówności nr 4 [5] ......................................... 33
Rysunek 17. Cykl życia aktywności w Androidzie [17] ................................................ 36
Rysunek 18. Wyświetlanie trasy – widok mapy ............................................................. 41
Rysunek 19. Wyświetlanie trasy – Google Earth ........................................................... 41
Rysunek 20. Rejestrowanie nierówności – automatyczne i manualne ........................... 43
Rysunek 21. Instalacja – nieznane źródła ....................................................................... 47
Rysunek 22. Instalacja – uprawnienia ............................................................................ 47
Rysunek 23. Menu aplikacji Sense ................................................................................. 48
Rysunek 24. Ikona aplikacji Sense [18] .......................................................................... 48
Rysunek 25. Aplikacja Sense – widok pomiaru ............................................................. 50
Rysunek 26. Aplikacja Sense – widok mapy .................................................................. 50
Spis tabel
Tabela 1. Udział poszczególnych systemów operacyjnych na smartfony w rynku [1] .... 7
Tabela 2. Schemat tabeli sensor_values ......................................................................... 27
52
Bibliografia
[1] http://www.idc.com/prodserv/smartphone-os-market-share.jsp.
[Data uzyskania dostępu: 17.12.2014].
[2] http://encyklopedia.pwn.pl/haslo/czujnik;3889920.html.
[Data uzyskania dostępu: 17.12.2014].
[3] G. Milette i A. Stroud, Professional Android Sensor Programming, 2012.
[4] http://www.physics.org/article-questions.asp?id=55.
[Data uzyskania dostępu: 18.01.2015].
[5] A. Mednis, G. Strazdins, R. Zviedris, G. Kanonirs i L. Selavo, „Real time pothole
detection using Android smartphones with accelerometers” w International
Conference on Distributed Computing in Sensor Systems and Workshops
(DCOSS), 2011.
[6] V. Astarita, M. Caruso, G. Danieli, D. Festa, V. Giofrè, T. Iuele i R. Vaiana,
„A mobile application for road surface quality control: UNIquALroad”,
Procedia - Social and Behavioral Sciences, tom 54, pp. 1135-1144, 2012.
[7] A. Kulkarni, N. Mhalgi, D. Sagar Gurnani i N. Giri, „Pothole Detection System
using Machine Learning on Android”, International Journal of Emerging
Technology and Advanced Engineering, tom 4, nr 7, 2014.
[8] https://play.google.com/store/apps/details?id=com.lul.accelerometer.
[Data uzyskania dostępu: 17.12.2014].
[9] https://play.google.com/store/apps/details?id=ru.autotest.acceleration.
[Data uzyskania dostępu: 17.12.2014].
[10] https://play.google.com/store/apps/details?id=com.google.android.maps.mytracks.
[Data uzyskania dostępu: 17.12.2014].
[11] https://play.google.com/store/apps/details?id=pl.neptis.yanosik.mobi.android.
[Data uzyskania dostępu: 15.01.2015].
[12] http://developer.android.com/design/get-started/principles.html.
[Data uzyskania dostępu: 22.01.2015].
[13] http://developer.android.com/about/dashboards/index.html.
[Data uzyskania dostępu: 17.12.2014].
[14] http://developer.android.com/reference/android/hardware/SensorEvent.html.
[Data uzyskania dostępu: 15.01.2015].
[15] W. F. Ableson, Android w akcji, 2011.
[16] E. Burnette, Hello, Android, 2011.
[17] http://developer.android.com/training/basics/activity-lifecycle/starting.html.
[Data uzyskania dostępu: 20.01.2015].
[18] http://www.telegraph.co.uk/motoring/road-safety/8605892/New-road-sign-makes-
a-hole-lot-of-sense-for-motorists.html. [Data uzyskania dostępu: 25.01.2015].