GPS logger to odbiornik GPS wyposażony w pamięć pozwalającą na rejestrację przebytej drogi (śladu). Ślad z GPSa jest mi potrzebny do dodania współrzędnych geograficznych do zdjęć. Do tej pory do tego celu wykorzystywałem odbiornik Geko 301 firmy Garmin. Geko jednakże jest urządzeniem starszego typu i generalnie nie działa jeżeli nie widzi ,,czystego nieba''. Nie działa w lesie, często są duże problemy w terenie mocno zabudowanym, itp.
Postanowiłem kupić lepszy odbiornik. Czytając fora i blogi poświęcone GPS najpierw dowiedziałem się, że jest coś takiego jak SIRF. Już chciałem takiego SIRFa kupić ale doczytałem o chipsecie MTK. Według niektórych doniesień jest on lepszy niż SIRF 3 (są też tacy co twierdzą, że tak nie jest; głosów w stylu X to syf a ja jestem wielkim znafcom nie biorę pod uwagę).
Ceny loggerów na allegro zaczynają się od 300 zł (styczeń 2008) a ja znalazłem coś chwalonego, podobno działającego z Linuksem co jest dla mnie bardzo ważne i (okazało się) tańszego pn. i-Blue 747 Dziwne, ale w Polsce nikt tego nie sprzedaje, przynajmniej w Internecie. Znalazłem i-Blue na ebay za mniej niż 200 zł przy czym 30% tej kwoty stanowiły koszty wysyłki.
BTW opis na e-bay był w języku włoskim, sklep w Niemczech, sklepowy (sądząc po imieniu i nazwisku, Turek) po angielsku słabo pisał, ale się dogadaliśmy i paczka doszła.
Do obsługi loggera jest dołączony CDrom z programem. Program jest
of course na system MSW,
ale podobno działa z wine. Dokładnie postępując według instrukcji
stąd dało się go uruchomić:
należy zainstalować wine
, uruchomić winecfg
,
a następnie:
cd ~/.wine/dosdevices ln -s /dev/ttyUSB0 com1
Teraz należy skopiować
plik instalacyjny
i uruchomić wine DataLog.exe
.
Program zostanie zaistalowany tyle, że u mnie nie działa.
Ściąga ślad całkiem dziarsko
ale nie do końca bo zwisa.
Próbowałem dwa razy raz zawisł gdy wskaźnik był na 49%
drugi raz na 89%.
W google znalazłem opinie użytkowników
Ubuntu utrzymujących, że w ich systemie wszystko
działa (like a charm).
BTW w MS Windows też były problemy, zarówno z instalacją,
jak i z uruchomieniem, ale jak w końcu poszło, ale
co z tego przecież nie będę go używał w systemie W.
Uwaga: Aby ściągnąć ślad albo zmienić konfigurację urządzenia przełącznik musi być w pozycji LOG. Po uruchomieniu programu pierwsze co trzeba zrobić to zatrzymać zapis śladu (można to zrobić tylko programowo), bo inaczej logger cały czas zapisuje dane.
Zainstalowałem też w bólach bt747 (aplikacja Javy).
Zresztą autor ostrzega, że dokumentacja jest niedoskonała. Po
rozpakowaniu zipa, zainstalowałem zawartość katalogu
rxtx-2.1-7-bins-r2
,
zgodnie z tym co jest napisane
w pliku INSTALL
, umieszczonym w tym katalogu. Następnie
uruchomiłem skrypt run_rxtx.sh
, zmieniając wartość
zmiennej MYROOTPATH=/usr/local/bt747
.
Żby użytkownik
miał dostęp do /dev/ttyUSB0
musi być w grupie
uucp
, to już ustaliłem wcześniej. Dalej jednak nie
działało (check_group_uucp(): error testing lock file creation
Error details: Permission denied check_lock_status:
No permission to create lock file.).
Kluczowa okazała się zmiana praw dostępu do
/var/log
:
chmod 777 /var/lock
Aplikacja, jak widać obok, wygląda okropnie, ale funkcjonalnie jest OK: ściąga
dane i kasuje LOG. Więcej nie potrzebuję. Żeby skrypt run_rxtx.sh
działał uruchamiany z dowolnego katalogu musiałem jeszcze zmienić wartości
zmiennej CLASSPATH
(albo wstawić zawartość CLASSPATH
jako wartość opcji -cp
przy uruchamianiu javy):
CLASSPATH=${RXTXJAR}:$MYROOTPATH/webstart/Waba_only.jar:\ $MYROOTPATH/dist/BT747_rxtx.jar:.:$CLASSPATH
Wreszcie jest też aplikacja pn. MTKbabel (skrypt Perla), działająca podobnie do programu GPSbabel, czyli z wiersza poleceń. Do działania wymaga zainstalowania modułu Device::SerialPort. Ten sposób działania podoba mi się najbardziej. Pobranie danych sprowadza się do wydania następującego polecenia:
mtkbabel -f nazwa-pliku-bez-rozszerzenia -t
Powstaną dwa pliki (dlatego nie podaje się rozszerzenia): jeden w formacie binarnym, drugi w fomacie GPX. Jedno wielkie ale -- transmisja jest bardzo wolna: plik binarny o wielkości ca 650 kB (czyli ca 30% pamięci) był ściągany z loggera 9 minut 47 sekund. Czyli cała pamięć byłaby ściągana 30 min. Hmm... Dla porównania obie wcześniej wymienione aplikacje ściągały te 650 kB w circa 2 minuty. Różnica jest.
Wykonałem już dwa eksperymenty porównujące iblue z moim Garminem 301. Pierwsza trasa to las, w wielu miejscach gęsty i wysoki. Do tego też w wielu miejscach jary o stromych zboczach. Trasa zapisana przez geko oraz trasa zapisana przez iblue. Nie ma porównania, bo geko w zasadzie w lesie nie działał.
Druga trasa to teren zabudowany, a konkretnie Sopot. Zabudowa w większości 3--4 kondygnacyjna. Dwa razy wszedłem do sklepu (Geko zgubił w pierwszym ślad, ale poczekałem po wyjściu aż znajdzie, a za drugim razem sam szybko się odnalazł). Oba ślady wyglądają nieźle (cf. geko iblue). Iblue pogubił się w okolicach skrzyżowania 1-go Maja z Aleją Niepodległości, gdzie wszedłem do sklepu (na dłużej). Nie zgubił satelity, tak jak geko, ale trasa w tym miejscu jest nieprawidłowa (wielki `tik' od 1-go Maja wzdłuż Al. Niepodległości w stronę Gdańska. Na mapie od szpilki oznaczonej jako `sklep' do szpilki `tik'. W rzeczywistości od sklepu poszedłem do szpilki oznaczonej `tunel' i dalej wzdłuż ul. Bohaterów Monte Cassino, co zresztą też jest zaznaczone). Nie ma różnicy pomiędzy śladami zredukowanymi do 500 punktów i dużo większym -- 2500 punktów.
Reasumując: wszystkie zdjęcia zrobione na obu trasach zostały (z zadowalającą precyzją) oznakowane współrzędnymi geograficznymi na podstawie śladu z Iblue, a po to go kupiłem.
Ślad iblue zredukowałem za pomocą gpsbabela, bo oryginalny ślad
składa się z tysięcy punktów. Iblue zapisuje ślad co sekundę, Garmin
w trybie auto (Iblue nie ma czegoś takiego jak auto).
Kiedyś eksperymentowałem z Garminem i też go przestawiłem
na zapis sekundowy, ale nie zaobserwowałem różnicy pomiędzy takim trybem
a trybem auto. Polecenie uproszczenia śladu wygląda
następująco (Log.nma
zawiera dane zapisane jako
NMEA):
gpsbabel -i nmea -f Log.nma -x simplify,count=450 \ -o gpx -F 2008-01-23BT_x.gpx
Poniżej bardziej zaawansowane polecenie: zapisz jako GPX, ślad od 2008-01-24T13:40
od 2008-01-24T14:50, następnie upraszczając go do 500 punktów.
Uwaga: opcje
-x
nie są przemienne, tj. ich zamiana skutkowałaby najpierw
uproszczeniem do 500 punktów, a potem wycięciem od-do, dając w rezultacie
ślad dużo bardziej uproszczony:
gpsbabel -i nmea -f GPSDATA-20080123.nmea \ -x track,start=200801241340,stop=200801241450 -x simplify,count=2500 \ -o gpx -F 20080124BT_x.gpx
Kończąc, trochę mnie zastanawia/niepokoi trwałość tego urządzenia, bo jakość wykonania jest taka sobie (100% chińszczyzna). Jakby mi, np. wypadł z ręki, to chyba byłby to jego ostatni lot. Nawet nie próbuję tego sprawdzać. Poza tym logger wydaje się całkiem, całkiem...
Dopisane 16 marca 2008: Dioda GPS: pomarańczowa -- szuka satelitów; pomarańczowa/miga -- nawiguje; niebieska/miga -- mało pamięci (mniej niż 20%); niebieska -- pamięć jest zapełniona, stop (cokolwiek to znaczy); trzykrotny błysk -- zarejestrowanie POI. Dioda baterii: czerwona -- bateria prawie wyczerpana; zielona -- ładowanie; zielona/miga -- naładowana. Dioda BT: niebieska -- BT włączone, ale nie połączony; wolno miga -- połączony w sleeping mode; szybko miga -- połączony i gotowy.
Dopisane 16 marca 2008: projekt formularzy
w aplikacji bt747
jest daleki od ergonomicznego, stąd
poniżej krótka rekapitulacja.
Aby usunąć plik: Fmt/Erase (albo Fmr/Set&erase).
Pobranie pliku i zapis na dysk: Log/Get Log i inne przyciski z tej karty.
Karta File: konfiguracja. Karta Con: połączenie z urządzeniem.
Innych kart w zasadzie nie używam.
Dopisane 19 marca 2008:
Poniżej skrypt do zamiany pliku NMEA pobranego z bt747
na
plik GPX. Skrypt upraszcza uruchomienie gpsbabela. Ponadto
uruchomiony z opcją -U
wycina niepotrzebne znaczniki (np. <ele>
, czyli
wysokość, która w moim przypadku zawsze wynosi zero. Dodatkowo
liczy długość wyciętego śladu. Pełny skrypt jest
tutaj.
# !/bin/bash # # Skrypt ułatwiający uruchomienie programu gpsbabel # Wycina fragment ścieżki + upraszcza ślad do zadanej liczby punktów # Na koniec plik podaje długość wyciętego śladu. # OUT='' FORMAT=nmea ROK=`date +"%Y"` XREDUCE="NO" while test $# -gt 0; do case "$1" in -help|--help) echo "$USAGE"; exit 0;; -od) shift; START="$1";; -od*) START="`echo :$1 | sed 's/^:-od//'`";; -do) shift; STOP="$1";; -do*) STOP="`echo :$1 | sed 's/^:-do//'`";; -max) shift; COUNT="$1";; -max*) COUNT="`echo :$1 | sed 's/^:-max//'`";; -rok) shift; ROK="$1";; -rok*) ROK="`echo :$1 | sed 's/^:-rok//'`";; -format) shift; FORMAT="$1";; -format*) FORMAT="`echo :$1 | sed 's/^:-format//'`";; -U) XREDUCE="YES";; -out) shift; OUT="$1";; -out*) OUT="`echo :$1 | sed 's/^:-out//'`";; -h) echo usage; exit;; -h*) echo usage; exit;; *) FILE="$1";; esac shift done if [ "$XREDUCE" = "YES" ] ; then echo "** Tracks will be simplified! (Option -U)" ; fi EXTENSION=${FILE##*.} BASE=`basename $FILE .$EXTENSION` if [ "$OUT" = "" ] ; then OUTFILE="$BASE.gpx" ; else OUTFILE="$OUT" ; fi if [ "$START" != "" -a "$STOP" != "" ] ; then PERIOD="-x track,start=$ROK$START,stop=$ROK$STOP" ; elif [ "$START" != "" ] ; then PERIOD="-x track,start=$ROK$START" ; elif [ "$STOP" != "" ] ; then PERIOD="-x track,stop=$ROK$STOP" ; fi if [ "$COUNT" != "" ] ; then SIMPLIFY="-x simplify,count=$COUNT" ; fi if [ -f "$BASE.$EXTENSION" ] ; then gpsbabel -i $FORMAT -f $BASE.$EXTENSION $PERIOD $SIMPLIFY -o gpx -F $OUTFILE if [ -f "$OUTFILE" -a "$XREDUCE" = "YES" ] ; then extension=${OUTFILE##*.} simname="`basename $OUTFILE .$extension`_s.$extension" echo "** File $OUTFILE simplified to $simname" ; # perl -e 'while ( <> ) { unless(/<ele|fix|course|speed>/) ... to błąd !! perl -e 'while ( <> ) { unless(/<(ele|fix|course|speed)>/) { print $_ }} ' $OUTFILE > $simname OUTFILE=$simname fi else echo "File $BASE.$EXTENSION found!" ; echo "$USAGE" fi if [ -f "$OUTFILE" ] ; then ## Oblicz dystans: echo "** Counting distance covered in: $OUTFILE " perl -e 'use Geo::Distance; my $geo = new Geo::Distance; my $qchars = "\042\047"; # znaki cytowania pojedynczy i podwojny while (<>) { if (/<trkpt\s+lat\s*=\s*([$qchars])([^$qchars]+)\1\s+lon\s*=\s*([$qchars])([^$qchars]+)\3/) { $lat=$2; $lon=$4; unless ($trkpt < 1) { $dist += $geo->distance( "meter", $plon, $plat => $lon, $lat ); } $trkpt++; $plat=$lat; $plon=$lon; } } print "** Distance covered (meters): $dist\n"; ' $OUTFILE fi
W okresie świątecznym i na przełomie roku wykonałem kilka eksperymentów weryfikujących jakość dodawania współrzędnych za pomocą synchronizacji czasu odbiornika GPS i aparatu. Dokładnie siedem prób (odpowiednio data: zdjęcia ogółem/zdjęcia oznaczone): 20071226: 61/61, 20071228: 11/11, 20071229: 29/29, 20071230: 71/71, 20071230: 48/48, 20080101: 30/30, 20080102: 8/22. Łącznie zdjęć było zatem 260 z czego 16 (6,1%) nie zostało zsynchronizowanych. Większość zdjęć została oznakowana z zadowalającą albo nawet dobrą dokładnością. Niektóre trasy były łatwe: płaski teren. Ale trasa z 31.12 prowadziła w sporej części przez gęsty las a GPS się nie pogubił. Dziś poszedłem jeszcze dalej do lasu, no i GPS tym razem odmówił kooperacji. A GPSa -- zgodnie z zaleceniem, żeby był jak najwyżej -- noszę pod czapką!
Przerobiłem swoje skrypty, oraz bibliotekę dla Emacsa. Aby odróżnić zdjęcia zawierające zdefiniowane tagi EXIF ze współrzędnymi geograficznymi od tych, które tej informacji nie zawierają, generowana miniatura zdjęcia zawiera czerwony prostokąt w lewym górnym rogu (jeżeli zdjęcie jest już geotagowane). No tak to sobie wymyśliłem.
Niektóre ślady GPS na mojej stronie zawierają teraz miniatury zdjęć. Publikuję też dane w formacie KML. Uaktualniony opis jest tutaj. Detaliczna instrukcja jak używać GPSphoto. jest zaś tutaj.
Dopisane 8 maja 2008/Zmodyfikowane 27 sierpnia 2008: Podsumowanie procedury pobrania śladu z urządzenia GPS i ich zamiany na ślad w formacie GPX/KML:
Ślad z urządzenia jest pobierany albo za pomocą gpsbabela albo programu bt747.
Skrypt nmea2gpx
zamienia dane w formacie NMEA na GPS w razie potrzeby
wycinając fragment śladu i upraszczając go (opcja -max liczba-punktów
).
Skrypt akceptuje także inne formaty danych wejściowych (opcja -format
):
nmea2gpx -od czas -do czas -max liczba [-format format ] [-U ] [-out plik.gpx] plik
Skrypt My-photo-sync.sh
(wykorzystujący gpsPhoto.pl
)
,,synchronizuje'' ślad ze zdjęciami i generuje plik w formacie KML:
My-photo-sync.sh -d katalog-zdjęć -f plik.gpx -t różnica-czasów
różnica czasów jest obliczana za pomocą skryptu exif_datetime.pl
exif_datetime -b czas_z_GPSa -f zdjęcie -o GMT_offset_in_seconds
gdzie: zdjęcie, to nazwa pliku ze zdjęciem ekranu GPSa;
czas_z_GPS, to czas wyświetlany przez GPSa na ww. zdjęciu;
GMT_offset_in_seconds, różnica między czasem lokalnym a GMT (niektóry GPSy to wyświetlają,
a jak nie to łatwo jest to obliczyć).
Ponieważ uruchamianie exif_datetime
w ww. sposób dla każdej sesji zdjęciowej
jest pracochłonne można też napisać:
exif_datetime
Powyższe wyświetli przesunięcia czasowe zapisywane w pliku ~/.time_offset
. Ponieważ
czas w aparatach rozsynchronizowuje się w miarę
wolno, wystarczy co kilka tygodni aktualizować ~/.time_offset
.
Można też napisać:
My-photo-sync.sh -d katalog-zdjęć -f plik.gpx -a
Przesunięcie zostanie pobrane automatycznie z pliku ~/.time_offset
. [Nie trzeba
uruchamiać exif_datetime
.]
W wyniku wykonania My-photo-sync.sh
powstaje także plik .kml
.
Skrypt perlowy kml-adjust-urls
zamienia linki do zdjęć
w pliku KML, tak aby wskazywały na zdjęcia umieszczone w serwisie
flickr.com (skrypt My-photo-sync.sh
oryginalnie wstawia linki lokalne). Przed wykonaniem kml-adjust-urls
należy wykonać flickr_update_kb
bo kml-adjust-urls
pobiera
informacje nt. zdjęć lokalnie z bazy utworzonej przez flickr_update_kb
.
kml-adjust-urls plik.kml
Ubocznym efektem działania kml-adjust-urls
jest plik plik.wpts
zawierający elementy <wpt>
określające linki do zdjęć umieszczonych na flickr.com.
Zawartość tego pliku można dodać do pliku plik.gpx
uzskanego w kroku #2.
Ślad -- wyświetlony w googlemaps
-- będzie wtedy zawierał ,,pinezki'' z minaturami zdjęć.
Niektóre zdjęcia z lokalnego katalogu nie są umieszczone na
flickr.com. Skrypt kml-skip-deadlinks
usuwa takie
zdjęcia z pliku KML. Mało eleganckie rozwiązanie -- jeden skrypt by wystarczył, ale
nie mam czasu w tej chwili poprawiać skryptu kml-adjust-urls
:
Skrypt kml-adjust-urls
usuwa takie zdjęcia z pliku .kml
.