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