Ubuntu&GT-730FL-SでGPSロガー

提供: Akionux-wiki
Share/Save/Bookmark
移動先: 案内検索

概要

ここではGPSロガー「GT-730FL-S」で記録したGPSデータをGPSデータの変換ツールGPSBabelを用いてGoogle Earth等で読み込み可能なkml形式で出力する手順を記する。

確認した作業環境はLinux Mint 17 Qianaである。

[1]の情報を参考にさせていただいた。

GPSBabelのインストール

現時点で最新版のgpsbabel-1.5.1をgpsbabel-1.5.1からダウンロードする。

私の手元にあるGT-730FL-Sはskytraq形式で保存されているが、64bit環境でskytraq形式の緯度経度がおかしくなるようだ。 以下のpatchを当ててビルドする必要がある[2]。627行目あたりのunsigned intの部分をlongに変えるだけなのでテキストエディタで編集した方がいいかもしれない。

--- skytraq.c	2012-08-22 12:00:25.000000000 +0900
+++ skytraq.c	2013-12-29 01:08:21.313950830 +0900
@@ -627,7 +627,7 @@
 {
   int res = 0;
   double lat, lon, alt;
-  unsigned int ts;
+  long ts;
   int poi = 0;
   full_item f;
   compact_item c;

修正したらビルド&インストール。

$ ./configure
$ make
$ sudo make install

GT-730FL-Sの接続

GT-730FL-SをPCに接続し、本体の側面にあるスライド式のスイッチを●の方にしてONの状態にして、dmesgを確認。

$ dmesg | tail
[850092.338090] usb 9-1: new full-speed USB device number 45 using xhci_hcd
[850092.354975] usb 9-1: New USB device found, idVendor=0483, idProduct=5740
[850092.354981] usb 9-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[850092.354986] usb 9-1: Product: STM32 Virtual COM Port  
[850092.354989] usb 9-1: Manufacturer: STMicroelectronics
[850092.354992] usb 9-1: SerialNumber: 097232663636
[850092.355224] usb 9-1: ep 0x82 - rounding interval to 1024 microframes, ep desc says 2040 microframes
[850092.356205] cdc_acm 9-1:1.0: This device cannot do calls on its own. It is not a modem.
[850092.356247] cdc_acm 9-1:1.0: ttyACM0: USB ACM device

この場合、/dev/ttyACM0に割り当てられているようだ。

/dev/ttyACM0にユーザーのパーミッションがあるか確認しておこう。

ls -l /dev/ttyACM0

例えば次のような場合(Slackware 14.1)、

crw-rw---- 1 root dialout 166, 0  1月 31 14:02 /dev/ttyACM0

/dev/ttyACM0からGPSデータを得るにはユーザーがdialoutグループに属していなければならない。

GT-730FL-Sからkmlファイルへの出力

GT-730FL-Sに記録されている全GPSデータをtracksとして含んだKMLファイルoutput.kmlへ出力するには以下のようにする:

gpsbabel -t -i skytraq,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0 -o kml -F output.kml

/dev/ttyACM0の部分はGT-730FL-Sのデバイスファイルを指定するので、環境によって異なる可能性がある。

コマンド実行時の時刻を記録して保存

ファイル名にgpsbabelを実行した時刻を記録して保存する場合は

$ gpsbabel -t -i skytraq,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0 -o kml -F output_$(date +"%Y%m%d%I%M%S").kml

とする。

特定の日付時刻範囲のトラックポイントを出力する

gpsbabelコマンドでは-xオプションでデータに対するフィルタを設定できる(詳細はgpsbabel -hを参照。) trackフィルタを用いれば、特定の日付時刻範囲のトラックポイントのみを出力することができる。 例えば、2005年7月20日午前10時〜2005年7月20日午後6時までのトラックポイントのみを出力するには以下のようにする[3]:

$ gpsbabel -t -i skytraq,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0 -o kml -x track,start=2005072010,stop=2005072018 -F output_2005072010-2005072018.kml

時刻の指定はyyyymmddhhで、GT-730FL-Sは世界標準時で記録していることに注意する。

さらに、出力データにwaypointsはいらないという場合は次のように-x nuketypes,waypointsを入れる。

$ gpsbabel -t -i skytraq,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0 -o kml -x track,start=2005072010,stop=2005072018 -x nuketypes,waypoints -F output_2005072010-2005072018.kml

また、GPX形式として保存するには、以下のようにする:

$ gpsbabel -t -i skytraq,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0 -o gpx -x track,start=2005072010,stop=2005072018 -F output_2005072010-2005072018.gpx

gpsbabel Tips

GPSデータの要素

ある地点を示す点はwaypointsと呼ばれ、 ユーザーが指定した地点の集合からなるものはroutesと呼ばれる。 旅行中に記録されたGPSのような点列はtracksと呼ばれ、tracksを成す点はtrack pointsと呼ばれる。 routesとtracksは似ているが少し仕様がことなるようだ[4]

フィルタ

フィルタを用いることでデータを加工(e.g. 不要な部分を消去、リサンプリング)できる。

  • nuketypes[5]フィルタ

nuketypesフィルタはwaypointsまたはtracksまたはroutesをすべて消去する。

書式はnuketypesの後にコンマで消去したいものを列挙する。

-x nuketypes[,waypoints][,tracks][,routes]

例えば、bigfile.gpxのwaypointsとroutesをすべて消去し、tracksのみのデータを出力するには以下のようにする:

gpsbabel -i gpx -f bigfile.gpx -x nuketypes,waypoints,routes -o gpx -F tracksonly.gpx

細かく検証していないのだが、waypointsだけ消すために

-x nuketypes,waypoints

とすると、なぜかtrack pointsの時間情報:

<description><![CDATA[
<table>
<tr><td>Longitude: 139.269470 </td></tr>
<tr><td>Latitude: 35.632390 </td></tr>
<tr><td>Altitude: 250.783 ft </td></tr>
<tr><td>Speed: 2.5 mph </td></tr>
<tr><td>Heading: 198.8 </td></tr>
<tr><td>Time: 2014-11-16T02:17:01Z </td></tr>
</table>
]]></description>

Time: 2014-11-16T02:17:01Z

の部分がなくなっていた。これはバグなのかもしれない。

  • transformフィルタ[6]

transformフィルタは点列をwaypoints, tracks及びroutes間で変換する。 waypoints, tracks及びroutesのどの形式でも点列を記録できるのだが、 GPSデータによってはwaypoints, tracks及びroutesのうちの一部しかサポートしていなかったり、GPSデータを表示するアプリケーションがwaypoints, tracks及びroutesの中で相性が良い悪い場合があったりするので、そのようなときはtransformフィルタを使う。

書式はtransform,の後に<変換後の形式>=<変換前の形式>で指定する。waypointsはwpt、tracksはtrk、routesはrteで表される。

-x transform,[wpt][trk][rte]=[wpt][trk][rte]

例えば、waypts.txtのwaypointsをtracksにしてroute.gpxに出力するには次のようにする:

gpsbabel -i csv -f waypts.txt -x transform,rte=wpt -o gpx -F route.gpx
  • trackフィルタ[7]

trackフィルタはtracksに対するいろいろな操作を行うことができる。 ここでは、ある時刻間のデータのみを切り出すフィルタとしてtrackフィルタを使う例を紹介する。

track,の後にstartとstopでそれぞれ開始時刻と終了時刻をYYYYMMDDHHMMSSの形式で指定する。 例えば2014年5月29日12時00分〜2014年6月10日00時00分(GMT)のデータを切り出すには次のようにする:

-x track,start=201405291200,stop=201406100000
  • simplifyフィルタ[8]

simplifyフィルタはroutesやtracksの点数を制限するのに使われる。 routesやtracksの点数が大きすぎるときのリサンプリング

書式はsimplity,の後にcount=でroutesまたはtracksの最大点数を指定する。

-x simplify,count=<number of points>

例えば、入力ファイルhuge_data.kmlのtracksの点数を最大100点に制限してsimplified_data.kmlへ出力するには以下のようにする:

gpsbabel -t -i kml -f huge_data.kml -x simplify,count=100 -o kml -F simplified_data.kml
  • フィルタを併用した使用例

入力の巨大なGPSデータにはtracksとwaypointsに同じ点が入っているが、waypointsのみに時間が記録されていてtracksには時間が記録されていない一方で、Google Earthで表示したときにはtracksの時間データしか見えないという状況になった。 そこで、時間データを持ったtracksを作るために、元のtracksを消去し、waypointsをtracksへ変換し、waypointsをすべて消去、さらに必要な時間領域のみのデータを切り出して出力する次のようなコマンドを実行した:

gpsbabel -i kml -f gpsbabel_20140610084229.kml -x nuketypes,tracks -x transform,trk=wpt -x nuketypes,waypoints -x track,start=201405291200,stop=201406100000 -o kml -F 20140530_Nagoya.kml

KMZファイルについて

拡張子が.kmzのKMZファイルはKMLファイルをZIPで圧縮したものなので、解凍すればKMLファイルになる。

unzip gpsdata.kmz

GPSデータを連結する

以下のように、-iオプションで入力フォーマット、-oオプションで出力フォーマットを指定し、-fオプションで列挙していけば、データの連結ができる[9]

gpsbabel -i kml -f 1.kml -f 2.kml -f 3.kml -o kml -F merged.kml

unknown item type encountered

gpsbabelでskytraqのGPSデータをロガーから取り出そうとしたとき、

skytraq: Unknown item type encountered: 0x00

というようなエラーが出た場合の対策のメモ。

まず、skytraqのdump-fileオプションに出力先ファイル名を指定し、ひとまずバイナリデータを取る

gpsbabel -D 1 -t -i skytraq,dump-file=dump.log,erase=0,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0

バイナリデータを入力とし、デバッグレベルを上げて(-D 4)、skytraq-binで読取を試みる

gpsbabel -D 4 -t -i skytraq-bin -f dump.log -o kml -x track,start=20180211,stop=20180212 -x nuketypes,waypoints -F 20180211.kml 

すると、問題箇所で止まる

skytraq: Decoding sector #510...
skytraq: Unknown item type encountered: 0x00
skytraq: Error 0 while processing data item #259899 (starts at 0)

この場合、セクター510に何か問題があるとのことなので、last-sectorオプションを指定してセクター509まで読む

gpsbabel -D 3 -t -i skytraq-bin,last-sector=509 -f dump.log -o kml -x track,start=20180211,stop=20180212 -x nuketypes,waypoints -F 20180211.kml 
gpsbabel -D 3 -t -i skytraq-bin,last-sector=509 -f dump.log -o gpx -x track,start=20180211,stop=20180212 -F 20180211.gpx

私の場合はこれでもし必要なデータが取り出せたので良かった。

よく考えてみれば、しばらくロガー内の記録を消去しておらず、セクター509が最後の読み取れるセクターで、データが一杯になったということかもしれない。 erase=1を使って、ロガー内のデータをこまめに消去しておくのが良いのだろう。以下のようにすれば、ロガー内のデータを消去できる。

gpsbabel -D 3 -t -i skytraq,last-sector=509,erase=1,baud=38400,initbaud=38400,no-output=0 -f /dev/ttyACM0

References