GPSログと撮影時刻を元に移動経路と写真をGoogle mapへ表示

半年ほど前に、ハンディGPSのGarmin Oregon 300を買いました日本語版は高いので、英語版をYahooオークションで45,000円程度で買いました。Amazon.comが使えればもっと安く買えたのですが、日本から電気機器類を注文できないようです。
私の主な用途は旅行などの移動経路を記録することですが、地図情報をちゃんと入れておけば道に迷った時も重宝します。

今回は記録した移動経路と移動経路上で撮った写真をgoogle mapに表示する方法について説明します。
・・・といっても、フリーソフトの轍 Wadachiを使えば簡単に表示できますはWindows専用ソフトのようです。MacやLinuxの人はごめんなさい。

基本的な使い方は上のリンク先の「標準的な作業の流れ」を見てもらえればよいです。
ロンドン旅行したときの移動経路ログと写真を轍で編集してGoogle mapで表示したものを下記に貼りました表示時刻が日本時間になっているので注意。ロンドン時間では-9時間してください。。移動経路は日付ごとに色分けしてあります。

ロンドン移動経路[gpxview=all]

轍以外の移動経路ログ編集ツールとして使えるソフトとして下記があります。

個人的には、轍が一番使いやすいです。たぶん、写真の縮小画像を自動生成してWaypointとしてgoogle mapで表示する機能があるからだと思います。

この記事の残りで、轍のサイトに載っていない下記作業手順について書きます。

  • 移動経路ログファイルから一部のログを消す。
  • HTMLファイルを使わず、kmlのみでgoogle mapを表示する。上のgoogle mapはkmlのみを使用してます。

Oregon 300は、移動経路のログをGPX形式で保存しますOregon 300の設定にもよりますが、通常、10秒ごとに現在位置をtrkタグとして書き込むようになっています。。下記説明もGPX形式のログデータが対象です。まあ、他の形式でも同じだと思います。

移動経路ログファイルから一部のログを消す

ログファイル内の、ある地点のログからGoogle mapで表示したい場合などにこの作業が必要です。
表示を開始したい地点の時刻を調べるためにGoogle Earthを使い、その後、開始地点前のログデータを削除するためにGPSbabelを使いますGPXファイルはXMLで書かれてるので、テキストエディタで手作業で消してもいいですが、GPSBabelの方が楽だと思います。GPX以外のファイル形式にも対応してるし。
Google Earthを使う利点は、下記2点です。

  • 地図を表示しながら開始地点を探せる。
  • GPXファイルのtrkpt表示数に制限がないっぽい。Google mapだと、trkptやwptなど合わせて1000件(100件だったかな?規約に書いてある?)しか表示できませんが、Google Earthには制限がないようです。

一部ログを消す手順は下記の通りです。

  1. Google Earthを起動
  2. Google EarthのウインドウにGPXファイルをドラッグ&ドロップ
  3. 「トラック ポイントとルート ポイントにクリック可能なイメージを作成する」にチェックを付けてインポート。チェックしないと、各地点の時刻を調べることができません。
  4. 起点となるトラックポイントを探してクリック。すると下記ポップアップが出てくると思います。ここのtimeの値を後で使います。もうGoogle Earthは閉じてよいです。

popup

  1. GPSBabelのgui版を起動。InputとしてGPXファイルを指定し、Outputのファイル名は好きなのを付ける。FormatはInput, Outputともに「GPX XML (.gpx)」です。設定例は下記画像の通り。

gpsbabel

  1. Filterボタンを押して、Google Earthで調べた時刻をTracksのStart atに設定する。設定例は下記画像。

  1. 「let’s go」ボタンをクリックして変換すれば終了。後は、変換したGPXファイルを轍で読み込んで作業すればよいです。ちなみにコマンドラインでgpsbabelを実行する場合は下記のようにすればよい。
gpsbabel.exe -p "" -w -r -t -i gpx -f "MAR-17-09 062255 AM.gpx" -x track,start=20090316153053 -o gpx -F "MAR-17-09_in_london_test.gpx"

HTMLファイルを使わず、kmlのみでgoogle mapを表示する。

基本的には、轍で編集したデータをKMLでエクスポートして、KMLと轍が生成した縮小画像をWebサーバにアップロードすればよいです。
ただし、kml内の縮小画像への相対パスをフルパス(例: http://www.ginriki.net/~)にする必要があります。
適当に、テキストエディタなどで置換してください。私は下記のようにsedでやりました。

$ sed 's/tour_images\//http:\/\/www.ginriki.net\/wd\/wp-content\/uploads\/maps\/tour_images\//g' tour.kml  > tour2.kml

あとは、アップロードしたkmlのURLをgoogle mapの検索欄に入れれば、kmlがgoogle mapで表示されます。
google map右端の「リンク」というリンクをクリックすれば、ブログ埋め込み用htmlタグが下記のように表示されるので、それをブログに貼りつければよいです。


ハンドルネームをginrikiに変えました

そういえば、書くのを忘れてましたがハンドルネームをginriki(「じんりき」と読みます)に変更しました。
大学院を出て働き始めたので、それに合わせてハンドルネームも変えました。

ginrikiの由来は、書く気が起きたら書きます。大した話ではないです。

kprobes – カーネルへ動的にプローブ挿入

Debug Hacksを読んでたら、kprobesっていうデバッグツールの話があった。
自分でモジュール作ってinsmodするだけで、カーネル再コンパイルなしで、ある実行地点でのカーネル内変数を調べるツールだそうで。

プロセスのユーザ空間(=デバッギのユーザ空間)に対してデバッガプロセスがプローブする場合は以前、デバッガについて書いた記事もどうぞ。

  1. デバッガプロセスがptrace辺りを使ってデバッギのメモリ空間上の指定アドレス上にあるアセンブリ命令をint 3に書き変えてint 3はIA-32とかIntel architectureの場合の話です
  2. デバッギプロセス実行中にそのint 3命令実行して発生したSIGTRAPをデバッガプロセスがフック(=これも事前にptraceで設定する)して
  3. デバッガプロセスがptraceでデバッギプロセスのメモリ空間から値をread

っていう流れが普通だと思う。kprobes.cのコメントを見てみると、kprobesの場合もカーネルの指定命令アドレスにint 3を入れてるらしい。

/*
 * Called after single-stepping.  p->addr is the address of the
 * instruction whose first byte has been replaced by the "int 3"
 * instruction.  To avoid the SMP problems that can occur when we
 * temporarily put back the original opcode to single-step, we
 * single-stepped a copy of the instruction.  The address of this
 * copy is p->ainsn.insn. ...
 * ...
 */

ただ、SMPの関係で色々対策が必要なんだねデバッギプロセスにプローブする場合に必要なマルチスレッド対策とどの程度一緒なのかは、まだよくわからない。。int 3を実行した後、例外ベクタにジャンプしてからどういう手順で処理してるかについてイメージがわかないから、今度ソース読んでみようかな。

あと、kprobesだと見たい変数(とくにローカル変数などCPUアーキテクチャとデバッグ情報からアドレスを割り出す必要のあるもの)のアドレスを探すのが大変だけど、
kprobes+GDBでそこを解決しようとしてるのがtracepointsってやつらしい。ふむふむ。

crashコマンド使ってみた

Kernelのコアダンプファイルを解析するのに、crashコマンドが便利だという話を聞いたので、練習として触ってみました。

手元にCentOS 5のマシンがあるので、それを使います。

解析にあたってkernelのデバッグ情報がいるので、debuginfoのRPMをインストールします最初、yumでinstallしたら、なぜか2.6.18-92.1.6.el5.centos.plusが入りました。kernelバージョンと合ってないので、rpmコマンドで入れなおし。

 $ uname -a
Linux localhost.localdomain 2.6.18-128.1.16.el5 #1 SMP Tue Jun 30 06:10:28 EDT 2009 i686 i686 i386 GNU/Linux

 $ wget http://debuginfo.centos.org/5/i386/kernel-debuginfo-2.6.18-128.1.16.el5.i686.rpm
 $ wget http://debuginfo.centos.org/5/i386/kernel-debuginfo-common-2.6.18-128.1.16.el5.i686.rpm
 $ rpm -ivh kernel-debuginfo-common-2.6.18-128.1.16.el5.i686.rpm kernel-debuginfo-2.6.18-128.1.16.el5.i686.rpm

んで、crashコマンド実行。
SVR4 UNIXのcrashコマンドをベースにGDBを統合したやつだそうでCrash WhitepaperのAbstract参照、GDBになじんでる私には結構使いやすいです。
[CODE]
$ crash
KERNEL: /usr/lib/debug/lib/modules/2.6.18-128.1.16.el5/vmlinux
DUMPFILE: /dev/crash
CPUS: 1
DATE: Mon Jul 13 02:17:05 2009
UPTIME: 06:52:42
LOAD AVERAGE: 0.16, 0.03, 0.01
TASKS: 86
NODENAME: localhost.localdomain
RELEASE: 2.6.18-128.1.16.el5
VERSION: #1 SMP Tue Jun 30 06:10:28 EDT 2009
MACHINE: i686 (1197 Mhz)
MEMORY: 758.9 MB
PID: 3848
COMMAND: “crash”
TASK: ef67c000 [THREAD_INFO: d9120000]
CPU: 0
STATE: TASK_RUNNING (ACTIVE)
crash> set 1
PID: 1
COMMAND: “init”
TASK: c16f5aa0 [THREAD_INFO: c16f6000]
CPU: 0
STATE: TASK_INTERRUPTIBLE
crash> p $tmp = jiffies
$1 = 24873000
crash> x modprobe_path
0xc0680be0 : das
crash> show convenience
$tmp = 24873000
$__ = void
$_ = (examine_i_type *) 0xc0680be0 “/sbin/modprobe”
crash> exit
[/CODE]
gdbスクリプトをsourceで読み込むこともできる。
まだ、まともな使い方は全然してないけど、Debug Hacksにいろいろ書いてあるので、それを読みながらやる予定。
[amazon ASIN=’4873114047′ TYPE=’banner’]