SM-08-LAB-WIKI

From Studia Informatyczne

Spis treści

Temat ćwiczenia

Stworzenie modułu do parsowania danych odebranych z odbiornika GPS w standardzie NMEA-0183 i wyświetlenie na ich podstawie aktualnej pozycji użytkownika. Po wykonaniu ćwiczenia student powinien również umieć określić listę widocznych z modułu GPS satelitów, wraz z satelitami na podstawie, których zostało określone położenie, jak i określić błąd wyznaczonego w ten sposób położenia.

Wymagania

Ćwiczenie

Wstęp teoretyczny

Większość stosowanych obecnie odbiorników GPS jest samodzielnymi urządzeniami, które automatycznie (bez konieczności ingerencji użytkownika) potrafią na podstawie sygnału odbieranych z satelitów określić pozycję użytkownika. Dostęp do danych określających pozycję, z punktu widzenia programisty, jest więc prosty i polega głównie na połączeniu się z danym urządzeniem za pomocą dostępnego interfejsu (najczęściej port COM lub port USB mapowany w systemie na port COM) i odczytaniu wysyłanych przez urządzenie danych.

Odbiornik GPS określa pozycję użytkownika nie tylko na podstawie odbieranych satelitów, lecz również czasami (droższe odbiorniki) na podstawie sygnału odbieranego od stacji naziemnej (co poprawie dokładność pomiaru). Z uwagi na to, iż z odbiornika GPS możemy odczytać nie tylko pozycję użytkownika (długość geograficzną, szerokość geograficzną, wysokość), lecz również dodatkowe informacje dotyczące aktualnego czasu (satelity GPS mają kilka zegarów atomowych), mocy odbieranych sygnałów z satelitów, ich aktualnej pozycji na orbicie około ziemskiej, ilości widocznych w danym momencie satelitów na których podstawie wyznaczony był pomiar, błędy pomiaru oraz inne dodatkowe informacje, do komunikacji z odbiornikiem GPS wykorzystywany jest specjalny protokół NMEA.

NMEA (National Marine Electronics Association) stworzyła jednoznaczną specyfikację interfejsu komunikacyjnego i opis protokołu, który umożliwia komunikację między różnego rodzaju urządzeniami pomiarowymi i prostą integrację zakupionego modułu GPS z innymi urządzeniami. Standard jest standardem otwartym ale nie darmowym. Pełną specyfikację standardu NMEA można kupić bezpośrednio ze strony WWW organizacji. Poniższe opracowanie bazuję na danych dostępnych na stronie: http://home.mira.net/~gnb/gps/nmea.html (2)

Standard cały czas ewoluuje, gdyż tworzone są coraz to nowe urządzenia. Aktualnie obowiązującym numerem standardu jest 3.01. Jednakże wszystkie późniejsze zmiany są jedynie dodatkami do wyjściowego (i najpowszechniej stosowanego obecnie) standardu 0183 (wersja 2.0) (NMEA-0183). Każdy odbiornik GPS obsługujący nowszy standard musi być również zgodny ze standardem NMEA-0183.

Ideą standardu NMEA jest wysyłanie linii danych, w których każda linia zaczyna się od określonego nagłówka i zawiera jakieś informacje wysyłane przez urządzenie. O czym warto wspomnieć to to, iż:

  • dane wysyłane są w sposób tekstowy,
  • nagłówek (odpowiedni ciąg znaków) określa jakie informację znajdują się w danej linii danych,
  • każda linia danych jest niezależna od innych.

Powyższe ustalenia sprawiają, iż jest to standard bardzo uniwersalny. Interpretując dane wysyłane nam przez odbiornik GPS nie musimy się wiec martwić, iż omijając jakąś linie stracimy możliwość odczytania danych dotyczących naszej pozycji z następnych linii, gdyż każda linia jest od siebie niezależna. Nie ma również problemów z interpretacją późniejszych standardów, gdyż jeżeli dany nagłówek nie jest interpretowany przez naszą aplikację, daną linie możemy po prostu pominąć, bez skutków negatywnych dla działania naszej aplikacji.

Dla pewności dane wysyłane przez odbiornik GPS mogą (ale nie muszą) być uzupełnione o sumę kontrolną, która pozwala sprawdzić czy podczas przesyłania nie uległy przekłamaniu i odrzucić daną linię.

Połączenie sprzętowe

Standard komunikacyjny zaproponowany przez NMEA musi być zgodny z EIA-422. Jest on na szczęście w ogólności kompatybilny ze standardem RS232, dlatego do komunikacji z urządzeniami GPS możemy użyć zwykłego portu COM obecnego w komputerze.

Ważne jest ustawienie interfejsu zgodnie z przyjętym standardem:

  • prędkość – 4800 bodów,
  • 8 bitów danych,
  • brak kontroli parzystości,
  • 1 bit stopu.

Wszystkie urządzenia obsługujące zgodne ze standardem NMEA powinny obsługiwać tą prędkość. Na rynku można również spotkać urządzenia działające z prędkością 9600 bodów (ale nie jest to standard).

Głównie więc z powodu ograniczeń na prędkość, odbiorniki GPS wysyłają więc uaktualnienia pozycji co 2 sekundy. Co jest wystarczające w przypadku ogólnych zastosowań.

Przy prędkości 4800 bodów, odbiornik GPS może wysyłać tylko 480 znaków. Ponieważ każda linia NMEA jest ograniczona do 82 znaków, umożliwia to przesłanie do 6 linii tekstu.

Przykładowe dane generowane przez odbiornik GPS wyglądają następująco:

$GPRMC,183729,A,3907.356,N,12102.482,W,000.0,360.0,080301,015.5,E*6F
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,183730,3907.356,N,12102.482,W,1,05,1.6,646.4,M,-24.1,M,,*75
$GPGSA,A,3,02,,,07,,09,24,26,,,,,1.6,1.6,1.0*3D
$GPGSV,2,1,08,02,43,088,38,04,42,145,00,05,11,291,00,07,60,043,35*71
$GPGSV,2,2,08,08,02,145,00,09,46,303,47,24,16,178,32,26,18,231,43*77
$PGRME,22.0,M,52.9,M,51.0,M*14
$GPGLL,3907.360,N,12102.481,W,183730,A*33
$PGRMZ,2062,f,3*2D
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
$GPRMC,183731,A,3907.482,N,12102.436,W,000.0,360.0,080301,015.5,E*67
$GPRMB,A,,,,,,,,,,,,V*71

Opis standardu NMEA

Każda linia tekstu musi spełniać następujące wymagania:

  • każda linia MUSI zaczynać się od znaku $ i kończyć znakiem nowej linii (\r),
  • długość linii nie może przekraczać 80 znaków (+znak początku linii i znak nowej linii),
  • dane wysyłane przez odbiornik GPS są w danej linii podzielone znakami przecinka (,),
  • dane liczbowe mogą posiadać miejsca ułamkowe (po kropce),
  • nie ma z góry ustalonej liczby znaków po kropce (różne urządzenia GPS charakteryzują się różną precyzją pomiaru),
  • na końcu linii może znajdować się suma kontrolna w postaci (gwiazdka + 2 znaki HEX), nie ma obowiązku jej sprawdzania przez aplikację (może zostać pominięta lecz powoduję to możliwość powstania przekłamań),
  • każda linia posiada nagłówek (od znaku $ do pierwszego znaku przecinka).

Nagłówek linii

Każdy nagłówek rozpoczyna się od znaku $ i kończy na pierwszym znaku , i składa się zawsze z kilku liter.

Pierwsze litery określają kod urządzenia, natomiast kolejne określają zastosowanie danego nagłówka i informację które dana linia z sobą niesie.

Ogólne informację zdefiniowane w standardzie NMEA i supportowane przez każde urządzenie GPS rozpoczynają się od liter „GP”.

Standard NMEA umożliwia definiowane specyficznych (dodatkowych) informacji wysyłanych przez inne urządzenia innych firm. Te informacje muszą zaczynać się od prefiksu (innego niż GP) określającego firmę (np. dane specyficzne firmy Magellan – jeden z producentów urządzeń GPS – rozpoczynają się od liter PMGN, natomiast firma Garmin rozpoczyna dodatkowe sentencje od liter PGRM).

Dodatkowe informacje zawierają najczęściej dodatkowe funkcje urządzenia (np. podają aktualny way point, który został zaprogramowany w urządzeniu itp.). Dla ogólnego zastosowania określania pozycji GPS mogą być więc ominięte.

Standardowe sekwencje nagłówków opisane w standardzie NMEA-0183 (wszystkie rozpoczynają się od znaków GP) są następujące:

  • AAM – Waypoint Arrival Alarm,
  • ALM – Almanac data,
  • APA – Auto Pilot A sentence,
  • APB – Auto Pilot B sentence,
  • BOD – Bearing Origin to Destination,
  • BWC – Bearing using Great Circle route,
  • DTM – Datum being used,
  • GGAFix information,
  • GLLLat/Lon data,
  • GSAOverall Satellite data,
  • GSVDetailed Satellite data,
  • MSK – Send control for a beacon receiver,
  • MSS – Beacon receiver status information,
  • RMA – Recommended Loran data,
  • RMB – Recommended navigation data for gps,
  • RMCRecommended minimum data for gps,
  • RTE – Route message,
  • VTGVector track an Speed over the Ground,
  • WCV – Waypoint closure velocity (Velocity Made Good),
  • WPL – Waypoint information,
  • XTC – Cross track error,
  • XTE – Measured cross track error,
  • ZTG – Zulu (UTC) time and time to go (to destination),
  • ZDA – Date and Time.

Dla naszych zastosowań omówimy tylko informację zaznaczoną symbolem pogrubienia. Jeżeli ktoś byłby zainteresowany implementacją dodatkowych nagłówków może zajrzeć do odpowiedniej (ogólno dostępnej dokumentacji [2]) lub zakupić najnowszy standard NMEA.

Warto zauważyć, iż nie wszystkie odbiorniki GPS obsługują wszystkie z przedstawionych powyżej nagłówków.

Stworzony interpreter NMEA-0183 powinien więc jedynie interpretować dane, które nadchodzą na bieżąco i na ich podstawie uaktualniać odpowiednie struktury danych (np. listę widocznych satelitów, aktualną pozycję GPS), nie natomiast oczekiwać konkretnych nagłówków, gdyż może się ich w ogóle nie doczekać!

Niektóre odbiorniki GPS obsługują także sekwencje wejściowe, które umożliwiają z poziomu aplikacji obsługę urządzenia GPS (np. ustalanie way pointów, ustalanie oczekiwanej dokładności itp.)

Sposób obliczania sumy kontrolnej

Obecność sumy kontrolnej na końcu linii jest opcjonalna (zależy od urządzenia i od rodzaju transmitowanych danych).

Sumę kontrolną stanowią zawsze dwie liczby (w systemie heksadecymalnym) poprzedzone znakiem gwiazdki.

Obecność znaku gwiazdki jednoznacznie wskazuję początek sumy kontrolnej.

Suma kontrolna wyznaczana jest za pomocą operacji XOR na wszystkich znakach od początku linii (za wyjątkiem znaku $) do samej sumy kontrolnej (bez sumy kontrolnej i znaku *):

np. linia:

$GPGLL,3907.360,N,12102.481,W,183730,A*33

ma sumę kontrolną równą 33 (51 w systemie dziesiętnym).
obliczoną na podstawie operacji XOR na znakach:

GPGLL,3907.360,N,12102.481,W,183730,A

Opis wybranych sekwencji GP

Sekwencja GGA (Fix information)

Dostarcza informacji na temat aktualnego położenia:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

Gdzie:

  • GGA – Identyfikator nagłówka,
  • 123519 – Aktualność danych - 12:35:19 UTC,
  • 4807.038,N – szerokość geograficzna (latitude) - 48 deg 07.038' N,
  • 01131.000,E – długość geograficzna (longitude) - 11 deg 31.000' E,
  • 1 – jakość pomiaru (opisana dalej),
  • 08 – ilość śledzonych satelitów,
  • 0.9 – horyzontalna dokładność pozycji (HDOP) (opisana dalej),
  • 545.4,M – wysokość w metrach nad poziom morza,
  • 46.9,M – wysokość geoid (powyżej elipsoidy WGS84),
  • (puste pole) – czas od czasu ostatniego uaktualnienia DGPS,
  • (puste pole) – numer ID stacji DGPS,
  • *47 – suma kontrolna.

DGPS (Differential GPS) są uaktualnieniami różnicowymi wysyłanymi przez stacje naziemne, które zwiększają dokładność wykonywanych pomiarów (nie wszystkie urządzenia obsługują sygnały odbierane od stacji naziemnych)

Jakość pomiaru, określa dokładność w wyniku której urządzenie GPS było w stanie zanalizować i określić aktualną pozycję urządzenia.

Jak wiadomo pomiar GPS wykonywany jest na podstawie pomiaru czasu wysyłanego przez znajdujące się na orbicie satelity. Sygnał docierający z satelitów rozchodzi się w postaci sferycznej. Środek (punkt wspólny) kilku sfer (generowanych przez różne satelity) określa naszą przybliżoną pozycję (szczegóły na rysunku poniżej).

Rysunek 1 – Określanie przybliżonej pozycji
Enlarge
Rysunek 1 – Określanie przybliżonej pozycji

Z uwagi na to, iż pomiar może być niedokładny, gdyż zależy od ilości widocznych satelitów, odbić sygnału od budynków, mostów, różnej szybkości przechodzenia sygnałów przez jonosferę, jest on obarczony błędem.

Jakość pomiaru jest szacowana za każdym razem przez odbiornik i określana za pomocą jednej z następujących wartości:

  • 0 – brak pozycji, lub bardzo duży błąd (takich wyników się nie interpretuje),
  • 1 – pozycja określona na podstawie GPS (SPS),
  • 2 – pozycja określona przy udziale DGPS,
  • 3 – pozycja PPS,
  • 4 – Real Time Kinematic,
  • 5 – Float RTK,
  • 6 – estimated (dead reconing),
  • 7 – Manual input mode,
  • 8 – tryb symulacji.

Horyzontalna dokładność pozycji – HDOP – określa szacunkową dokładność pomiaru.

Dokładną specyfikację tego współczynnika można znaleźć w odpowiednich opracowaniach. W ogólności przyjmuje się, iż dla dokonywania standardowych decyzji (np. skręć w lewo na skrzyżowaniu) wystarczy, jak wartość współczynnika HDOP jest < 6.

W przypadku większych wartości pomiar jest na tyle niedokładny, iż powinniśmy go ignorować.

Sekwencja GSA (Overall Satellite data)

Dostarcza informacji o satelitach.

$GPGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39

Gdzie:

  • GSA – nagłówek,
  • A – automatyczny wybór pozycji (2D lub 3D) /M – manualny/,
  • 3 – pozycja 3D. Możliwe wartości to:
    • 1 – brak ustalonej pozycji z tej satelity,
    • 2 – pozycja 2D,
    • 3 – pozycja 3D,
  • 04,05... – Numery satelitów wykorzystane do wyznaczenia pozycji (miejsce dla 12 satelitów),
  • 2.5 – DOP (dilution of precision) – precyzja wyznaczonej pozycji,
  • 1.3 – HDOP (horizontal dilution of precision) – horyzontalna precyzja,
  • 2.1 – VDOP (vertical dilution of precision) – precyzja wertykalna,
  • *39 – suma kontrolna.

W przypadku precyzji DOP numer 1.0 jest określany jako pozycja IDEALNA przy pozycji 3D.

Sekwencja GSV (Detail Satellite data)

Dostarcza dokładnych informacji o każdej widocznej satelicie z osobna.

$GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75

Gdzie:

  • GSV – nagłówek,
  • 2 – ilość linii, które powinna aplikacja odczytać w celu posiadania pełnych danych o wszystkich satelitach (wynika z ograniczenia do 80 znaków na linie NMEA),
  • 1 – aktualny numer linii (odnosi się do powyższego punktu),
  • 08 – ilość aktualnie widocznych satelitów,
  • 01 – identyfikator PRN satelity,
  • 40 – wyniesienie satelity nad poziom równika (stopnie),
  • 083 – azymut satelity (stopnie),
  • 46 – SNR (signal to noise ratio) – poziom odbieranego sygnału,
  • Kolejne wartości określają informacje o kolejnych satelitach (max. 4 satelity na 1 linie NMEA),
  • *75 – suma kontrolna.

Sekwencja RMC (Recommended minimum of data)

Określane przez standard NMEA minimum danych, które musi wysyłać KAŻDY odbiornik GPS. Interpretacja tych danych również pozwala określić pozycję GPS urządzenia.

$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A

Gdzie:

  • RMC – nagłówek,
  • 123519 – Aktualność danych - 12:35:19 UTC,
  • A – status (A – aktywny; V – nieaktywny),
  • 4807.038,N – szerokość geograficzna (latitude) - 48 deg 07.038' N,
  • 01131.000,E – długość geograficzna (longitude) - 11 deg 31.000' E,
  • 022.4 – prędkość obiektu (liczona w węzłach),
  • 084.4 – kąt śledzenia/poruszania się obiektu (w stopniach) – przydatny w celu określenia kierunku poruszania się obiektu, jeżeli urządzenie GPS nie jest wyposażone w kompas,
  • 230394 – data (23 marca 1994),
  • 003.1,W – odchylenie magnetyczne ziemi,
  • *6A – suma kontrolna.

Sekwencja GLL (Lat/Lon data)

Określa aktualną pozycję (długość i szerokość geograficzną).

$GPGLL,4916.45,N,12311.12,W,225444,A,*31

Gdzie:

  • GLL – nagłówek,
  • 4916.45,N - szerokość geograficzna (latitude) – 49 deg 16.45 min N,
  • 12311.12,W – długość geograficzna (longitude) – 123 deg 11.12 min W,
  • 225444 – godzina ustalenia pozycji (22:54:44),
  • A – status (A – aktywny; V – nieaktywny),
  • *31 – suma kontrolna.

Sekwencja VTG (Vector track an Speed over the Ground)

Określa aktualną szybkość i wektor poruszania się.

$GPVTG,054.7,T,034.4,M,005.5,N,010.2,K*33

Gdzie:

  • VTG – nagłówek,
  • 054.7,T – ścieżka poruszania się (w stopniach),
  • 034.4,M – ścieżka poruszania się (na podstawię współrzędnych magnetycznych – w stopniach),
  • 005.5,N – prędkość w węzłach,
  • 010.2,K – prędkość w km/h,
  • *33 – suma kontrolna.

Zadanie

Zadanie polega na napisaniu w C# modułu (o nazwie GPS) i zaimplementowaniu w nim klasy NMEAParser, która utrzymywała by odpowiednie struktury danych przechowujące pozycję użytkownika, listę aktualnie widocznych satelitów (wraz z informacjami o danej satelicie), listę satelitów na podstawie których został określony fix (wyznaczona pozycja) i uaktualniała te dane na podstawie świeżo napływających danych z odbiornika GPS.

Moduł nie ma obsługiwać komunikacji między urządzeniem GPS, lecz tylko parsować dane podawane na wejście metody NMEAParser.Parse(string dane), i na ich podstawie uaktualniać odpowiednie struktury.

W przypadku natrafienia na dane, które nie są obsługiwane dana linie należy odrzucić (tylko linie!)

Ponieważ dane napływające z nadajnika GPS mogą w ogólności składać się z kilku linii, metoda Parse powinna najpierw podzielić otrzymane dane na poszczególne linie i każda z nich poddać parsowaniu osobno.

Linie, które nie przyjdą w całości (lub zaczynają się od innego znaku niż $ (taka sytuacja też się może zdarzyć, na skutek odczytania danych z odbiornika GPS w nieodpowiednim miejscu), linie te należy odrzucić. Parser należy przetestować na następującej sekwencji danych (wypisując potem dane które parser zdołał zinterpretować.

Do implementacji można wykorzystać dołączone do ćwiczenia klasy przykładowe.

Sekwencje testujące:

$GPRMC,183729,A,3907.356,N,12102.482,W,000.0,360.0,080301,015.5,E*6F
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,183730,3907.356,N,12102.482,W,1,05,1.6,646.4,M,-24.1,M,,*75
$GPGSA,A,3,02,,,07,,09,24,26,,,,,1.6,1.6,1.0*3D
$GPGSV,2,1,08,02,43,088,38,04,42,145,00,05,11,291,00,07,60,043,35*71
$GPGSV,2,2,08,08,02,145,00,09,46,303,47,24,16,178,32,26,18,231,43*77
$PGRME,22.0,M,52.9,M,51.0,M*14
$GPGLL,3907.360,N,12102.481,W,183730,A*33
$PGRMZ,2062,f,3*2D
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
$GPRMC,183731,A,3907.482,N,12102.436,W,000.0,360.0,080301,015.5,E*67
$GPRMB,A,,,,,,,,,,,,V*71
$GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,002454,3553.5295,N,13938.6570,E,1,05,2.2,18.3,M,39.0,M,,*7F
$GPGSA,A,3,01,04,07,16,20,,,,,,,,3.6,2.2,2.7*35
$GPGSV,3,1,09,01,38,103,37,02,23,215,00,04,38,297,37,05,00,328,00*70
$GPGSV,3,2,09,07,77,299,47,11,07,087,00,16,74,041,47,20,38,044,43*73
$GPGSV,3,3,09,24,12,282,00*4D
$GPGLL,3553.5295,N,13938.6570,E,002454,A,A*4F
$GPBOD,,T,,M,,*47
$PGRME,8.6,M,9.6,M,12.9,M*15
$PGRMZ,51,f*30
$HCHDG,101.1,,,7.1,W*3C
$GPRTE,1,1,c,*37
$GPRMC,002456,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3D
$GPRMC,023042,A,3907.3837,N,12102.4684,W,0.0,156.1,131102,15.3,E,A*36
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,023042,3907.3837,N,12102.4684,W,1,04,2.3,507.3,M,-24.1,M,,*75
$GPGSA,A,3,04,05,,,09,,,24,,,,,2.8,2.3,1.0*36
$GPGSV,3,2,11,09,47,229,42,10,04,157,00,14,00,305,00,24,70,154,33*79
$GPGLL,3907.3837,N,12102.4684,W,023042,A,A*5E
$GPBOD,,T,,M,,*47
$GPVTG,156.1,T,140.9,M,0.0,N,0.0,K*41
$PGRME,8.4,M,23.8,M,25.7,M*2B
$PGRMZ,1735,f*34
$PGRMM,WGS 84*06
$HCHDG,,,,15.3,E*30
$GPRTE,1,1,c,*37
$GPRMC,023044,A,3907.3840,N,12102.4692,W,0.0,156.1,131102,15.3,E,A*37