SONY GPS-CS1K 付属の GPS Image Tracker を他社のGPSロガーで使う
***今日はバイク日記じゃないよー!***
ツーリングのお供GPSの話です。
SONY GPS-CS1K(GPS-CS1KSP) に付属の GPS ImageTracker (デジカメJPGのEXIFにGPS情報を付加するだけのシンプルなアプリ) は、単純な造りでなかなか使い勝手がよろしい。geotaggingしたい画像ファイルだけをドラッグ&ドロップ出来たり、画像自体にはノータッチだったりそんな細かいところが良いです。他のフリーウェアだと、地図ソフトに統合されていて多機能すぎたり、画像ファイル単位でなくフォルダ指定だったりして、いまいち。俺はただgeotaggingしたいだけなんだ。
でも正直、GPS-CS1K は感度が悪すぎてもう使いたくない。そこで、他社のまともな GPS 受信機のログを gpsbabel*1 にて変換して使用したくなります。GPS-CS1Kは NMEA-0183*2 の生ログを記録するタイプのロガーなので、他社のGPSロガーでもNMEA-0183に変換すれば使えるんじゃないかな?
ってことで試したんだけど、一筋縄にはいかなかった。のでメモ。
そのまま GPS ImageTracker に gpsbabel を使って変換した nmea ファイルを読み込もうとすると「フォーマットが適切でないログファイルは一覧に追加できませんでした。」とエラーが出ます。では、両者のログを比較してみます。
@Sonygps/ver1.0/wgs-84 $GPGGA,115131,3541.8711,N,13939.2704,E,1,05,03.2,00027.0,M,039.1,M,,*42 $GPGSA,A,3,02,08,24,26,29,,,,,,,,04.4,03.2,03.1*02 $GPGSV,3,1,10,02,63,155,50,04,23,142,46,06,19,293,00,07,10,310,28*71 $GPGSV,3,2,10,08,40,082,50,10,63,351,52,24,85,225,52,26,39,234,49*71 $GPGSV,3,3,10,27,26,052,38,29,54,241,51,,,,,,,,*7C $GPRMC,115131,A,3541.8711,N,13939.2704,E,015.2,089.9,271206,,,A*74 $GPVTG,089.9,T,,M,015.2,N,028.2,K,A*0B $GPGGA,115146,3541.8848,N,13939.4014,E,1,06,02.1,00045.5,M,039.1,M,,*41 $GPGSA,A,3,02,04,08,24,26,29,,,,,,,03.5,02.1,02.8*0A $GPGSV,3,1,10,02,63,155,51,04,23,143,35,06,19,293,00,07,10,310,00*7F $GPGSV,3,2,10,08,40,082,50,10,63,351,47,24,85,224,52,26,39,234,52*7E $GPGSV,3,3,10,27,26,052,31,29,54,241,52,,,,,,,,*76 $GPRMC,115146,A,3541.8848,N,13939.4014,E,029.8,089.1,271206,,,A*7A $GPVTG,089.1,T,,M,029.8,N,055.3,K,A*0D $GPGGA,115201,3541.8814,N,13939.4688,E,1,06,02.1,00040.8,M,039.1,M,,*43 $GPGSA,A,3,02,04,08,24,26,29,,,,,,,03.5,02.1,02.8*0A $GPGSV,3,1,10,02,63,155,48,04,23,143,48,06,19,293,00,07,10,310,00*7D $GPGSV,3,2,10,08,40,082,50,10,63,351,49,24,85,223,52,26,39,234,49*7D $GPGSV,3,3,10,27,26,051,00,29,54,241,52,,,,,,,,*77 $GPRMC,115201,A,3541.8814,N,13939.4688,E,002.6,108.4,271206,,,A*7A $GPVTG,108.4,T,,M,002.6,N,004.9,K,A*09
Holux M-241, Transystem i-blue747 (MTK chip) から gpsbabel で変換した nmea ファイルは以下。元は何の機種でもいいと思う。
% gpsbabel -t -w -i gpx -f foobar.gpx -o nmea,gpgga=1,gprmc=1,gpvtg=1,gpgsa=1 -F foobar.nmea.log
$GPRMC,093001,A,3542.303,N,13938.098,E,0.32,214.23,070508,,*1A $GPGGA,093001,3542.303,N,13938.098,E,1,09,0.9,87.709,M,0.0,M,,*49 $GPVTG,214.230,T,0,M,0.317,N,0.587,K*69 $GPGSA,A,3,,,,,,,,,,,,,1.3,0.9,0.8*31 $GPRMC,093016,A,3542.301,N,13938.103,E,0.86,214.23,070508,,*12 $GPGGA,093016,3542.301,N,13938.103,E,1,09,0.9,88.966,M,0.0,M,,*46 $GPVTG,214.230,T,0,M,0.857,N,1.588,K*68 $GPGSA,A,3,,,,,,,,,,,,,1.3,0.9,0.8*31 $GPRMC,093031,A,3542.301,N,13938.107,E,1.36,214.23,070508,,*19 $GPGGA,093031,3542.301,N,13938.107,E,1,09,0.9,91.141,M,0.0,M,,*42 $GPVTG,214.230,T,0,M,1.359,N,2.517,K*69 $GPGSA,A,3,,,,,,,,,,,,,1.3,0.9,0.8*31 $GPRMC,093046,A,3542.300,N,13938.111,E,1.18,214.23,070508,,*13 $GPGGA,093046,3542.300,N,13938.111,E,1,08,1.0,94.130,M,0.0,M,,*4E $GPVTG,214.230,T,0,M,1.176,N,2.178,K*6B $GPGSA,A,3,,,,,,,,,,,,,1.4,1.0,0.9*3F
注:空行は読みやすくするためのもので、実際にはありません。NMEA-0183はもともとリアルタイム垂れ流し用フォーマットのため、ファイルに保存すると時刻情報のないセンテンスはいつの情報か判別しにくくなるので、便宜的に空行を入れています。
これらの違い::
- SONY は1行目に @Sonygps/ver1.0/wgs-84 と書かれている
- gpsbabel はGSVセンテンスがない(そもそもログに記録されてないから。設定すれば出るかも)
- gpsbabel はGSAセンテンスに衛星情報がない(これもログに記録してない)
- 各センテンスの順序が違う。SONY: GGA,GSA,GSV,RMC,VTG。 gpsbabel: RMC,GGA,VTG,GSA
- 0 の表現が違う。gpsbabelは 0 を 0.0 と書いてる。
- VTGセンテンス中の"磁北に対する進行方向"が、SONY は空白。gpsbabelは 0
これらを同じようにできれば GPS ImageTracker でも読み込めるはず。
1.の通り @Sonygps/ver1.0/wgs-84 と書き込んだら GPS ImageTracker はログを認識してくれたようです。なんだ簡単じゃん。ってあれ? 位置情報が出てこない。「利用したログファイルのタイトル」の表示は出てるから、ログファイル自体は読み込まれているっぽい。けど位置情報が出てこない。もちろん該当時刻のログも存在する。
これは思ったより面倒そうだから今日は寝よう。
翌日 2.以降を検討してみます。まず手書きで NMEAファイルを書いて読み込ませて、というのを繰り返してテスト。チェックサム計算がめんどくさくなって gpsbabel の nmea.c を変更しながらテスト。
で、センテンスの順序を変えていたりしたら、JPGファイルを読み込ませるとき「対応していない形式の画像ファイルは一覧に追加できませんでした」というエラーが出るようになりました。なんだこれ? さっきまで読めてたんだけどな。該当範囲のGPSログファイルを削除すれば、その画像ファイルは読み込めるようになるので、明らかにGPSログファイルのエラーで、ただ単にエラーメッセージがおかしい模様。
2,3 の GSV, GSA センテンスに関しては問題ないみたい。たぶん使ってない。
4. はいかにも問題ありそうだけど、順序を変えてみてもNG。
5. は多分問題無さそうな気がするけど、やっぱり関係ないな。
6. が正解! これが問題でした。
というわけで、gpsbabel の nmea.c の VTGセンテンス中の 0 を 空白に変更することで対処。
--- ../nmea.c 2007-07-19 04:05:32.000000000 +0900 +++ nmea.c 2008-05-08 02:44:22.218625000 +0900 @@ -1222,7 +1222,7 @@ gbfprintf(file_out, "$%s*%02X\n", obuf, cksum); } if ((opt_gpvtg) && (WAYPT_HAS(wpt, course) || WAYPT_HAS(wpt, speed))) { - snprintf(obuf,sizeof(obuf),"GPVTG,%.3f,T,0,M,%.3f,N,%.3f,K", + snprintf(obuf,sizeof(obuf),"GPVTG,%.3f,T,,M,%.3f,N,%.3f,K", WAYPT_HAS(wpt, course) ? (wpt->course):(0), WAYPT_HAS(wpt, speed) ? MPS_TO_KNOTS(wpt->speed):(0), WAYPT_HAS(wpt, speed) ? MPS_TO_KPH(wpt->speed):(0) );
これで無事読み込めたよ!
0を空白にするってどういう罠だよ。(ソニーに文句は言えんが)
使用したのは gpsbabel-1.3.4 です。1.3.5 が出ていますが、nmea 出力が壊れているのでだめです。
コンパイル済みバイナリ(Windows, Linux)が欲しい方はコメントでお知らせください。