2011年5月7日土曜日

デジカメの写真とGPSロガーの情報を合致させてみた

最近,GPSの経路ログ表示にGoogle Maps API V3 を使う (その1:KML 形式ファイルを作る)から8回ほどにわたって,GPS ロガーで取得したバイクでの走行ログを Google Maps API v3 を使って地図にする,というのを書いた。その際,写真を撮った停留点(WayPoints,個人的には Photo Point と呼んでいる)に表示したアイコンをクリックするとInfoWindow が現れ,その中に写真が表示されるようにしている。その作業での注意点について書こう。

 デジカメで撮った写真に GPS ロガーで取得した位置情報を当てはめるには,時刻情報を用いる。まず,事前に時刻を合わせておく必要がある。そして実際に車やバイクで移動しながら,デジカメで写真を撮る。家に帰ってきてから,コンピュータにデジカメの写真と GPS ロガーのデータを取り込んだらいよいよ位置情報の当てはめを行う。

 デジカメで撮った写真には時刻情報が入ってる。普通は CreateDateModifyDate などの情報が記録されている。それを ExifTool などを使って取り出す(詳しくは以前かいたPerl+ExifTool で写真の日付をいじるを見て欲しい)。その時刻を,GPS ロガーの記録の時刻と照合して,一致する時刻の位置にいた,として,位置情報を当てはめる。実際には写真の時刻とピタリと一致する GPS のログの時刻がない場合があるので,写真の時刻に一番近い前後の時刻の位置情報を使い,2つの位置の平均の緯度経度をその写真の位置情報としている。(GPS のログは通常世界標準時を使うので,日本だと9時間の時差があるので注意が必要

 そのようにして処理した例が国道439号線を走る・後半:ルートマップである。これは四国にある国道439号線を走った時のもので,国道439号線の後半部分のものである。実は,この時(2011年のGW),デジカメの時刻と GPS ロガーの時刻(GPS ロガーは衛星からの情報で時刻を得るので,いつも時刻は正しい)が 10 秒程度だけずれていた。デジカメの時刻が 10 秒ほど進んでいた。たかが 10 秒なのだが,されど 10 秒なのであった。なぜそんなに細かいことに気づいたかというと,地図上にカメラアイコンを表示させ,InfoWindow に写真を張り付けたのだが,最初に処理をした時,トンネルの直前に撮った写真が複数のケースでトンネルの出口に表示されていた,からである(今はこの下に書いた補正をしたのでずれてはいない)。GPS の位置情報にはある程度の誤差があるので,少しぐらいずれていても仕方ない,と思っていたが,さすがにトンネル入口で撮った写真がトンネル出口に位置づけられていると少し気になる。そこで,なんでそうなるかを考えた結果,デジカメの時刻が少しズレてる,という結論に至った。

 私が普段使っているコンパクトデジカメには GPS 機能が付いているのだが,GPS 情報で時刻を合わせるには,メニューで「自動で時刻を合わせる」という項目を選ばないといけない。普段は,自宅の位置などの情報漏洩を避けるため,写真に GPS 情報が載らないように GPS 機能をオフにしている。そのため,GPS 情報で自動で時刻を合わせる機能もオフになっている。機能を復活させるためには「自動で時刻を合わせる」というのを選ばないといけないのだが,四国を走った時にはその作業をしてなかった。デジカメと GPS ロガーの画面で時刻をみて,「分」の精度で合ってるから「OK」としてしまっていた。ところが,実際には先ほど書いた「トンネル前後問題」が生じてしまった。そこで,どれぐらいズレているかを調べてみた。そのためには 10 MB 程度あるログを検索して,当該の時刻前後のデータを見ないといけない。今持っている GPS ロガーは,衛星からの電波が得られないとログに「invalid」という情報が残る(実際には,とある項目が「A」か「V」かの違いだけだが)。トンネルの中では衛星が捕捉できないので,トンネルの中を走っているデータは「invalid」として記録されている。そこからトンネルの位置の記録がどれかがわかるのだが,複数のケースで見てみると,どうやらデジカメの時刻と GPS のログの時刻が 5 ~ 10 秒程度ずれている,というのがわかった。バイクでトンネル手前で道の横に停まり,バイクにまたがったまま写真を撮り,速攻で走りだすと5秒以内には走りだしている(デジカメをうまく持つとこれぐらいで走り出せる。そうしないと 500 枚~ 600 枚の写真を撮りながら R439 を走るのは無限に時間がかかってしまう)。そしてそのままトンネルを通過すると,時速 60 km で走れば1分で 1 km 進むから,時刻が 10 秒違うと 100 m 程度走れる可能性がある。となると,トンネル手前で写真を撮っても,GPS の位置情報ではその 100 m ほど後の点に位置づけられることになる。場合によっては,トンネルの出口付近のデータに位置づけられてしまう(私は invalid のデータを処理から除外しているというのも影響している)。つまりされど 10 秒なのである。

 そうとわかれば,写真の時刻を全部 10 秒手前に戻してから処理をやりなおせばうまくいくはず。以前書いたPerl+ExifTool で写真の日付をいじるがまさにそのための処理。結果は(当然だが)うまくいった。国道439号線を走る・後半:ルートマップではトンネルの手前にちゃんと写真が表示される(東から西に向かって走ったので,トンネルの写真は基本的に東側にないといけない。たまに振り返って写真を撮っているが…)

 今回のことで,ちゃんと秒の精度で時刻を合わせないとバイクなどで移動する時には位置のズレが大きいことがわかった。皆さんも,時刻合わせには気をつけてください。といっても,全てのデジカメで秒までちゃんと合わせれるのかどうか知らないけど…。

追記):この間ナイスな作戦を思いついた。私が持っている GPS ロガー(Tripmate850)は,緯度経度の表示や時刻の表示をしてくれる。そこで,時刻を表示させておき,その写真をデジカメで撮れば,写真に記録された情報からデジカメとGPSロガーの時刻差をしっかり把握できる。GPS のログを取る行程のどこかでこの作業をしておけば(どうしてもなら数日後でもいいかも)時刻の補正ができる。我ながらいい思いつきかもしれない!!
追記2):上記の後,いろいろ作戦を考えたが,現在(2014/5)は,バイクにつけているナビの時計(国際時計を表示させると秒までわかる)の写真を撮る,という作戦を使っている。ナビは GPS や GNSS を基準にして時刻を得ているので,位置情報が捕捉できた時点で,時刻は正しい時刻になっているはず。となれば,その写真を撮っておき,デジカメの記録した時刻情報と,写真に写っている時刻の差を補正すれば,写真の時刻のズレを1秒以内に抑えることができる。実際,この作業をするようにしてからは GNSS/GPS ロガーのツーリング記録を使った写真の位置情報の割り当てに問題は起こっていない。もしナビ作戦が使えなければ,家にある電波時計で秒までわかるものの写真を撮っても同じ作業ができる。

0 件のコメント: