* GPS で遊ぶ [#maccd222] PC カード接続の GPS を手に入れたので遊んでみる. ** Linux からは [#q73045ce] 単純にシリアルのカードとして見えるようだ # cardctl ident Socket 0: product info: "SEIKO EPSON", "GPS Card E9840B", "V01.001" manfid: 0xc007, 0x0101 function: 2 (serial) ** cat /dev/ttyS0 で [#d26ff5f1] 延々と位置情報が出力される. こんなかんじ. $GPGGA,135311.4,3625.5091,N,13638.0179,E,1,4,3.10,,M,,M,,*65 $GPGSA,A,2,25,19,27,03,,,,,,,,,3.10,3.10,0.03*09 $GPGSV,2,1,8,25,44,245,47,19,65,014,45,27,42,278,44,03,45,059,47*49 $GPGSV,2,2,8,08,00,000,46,10,00,000,00,11,00,000,47,12,00,000,00*4A $GPRMC,135311.4,A,3625.5091,N,13638.0179,E,0000.1,320,300607,,E*65 [http://bg66.soc.i.kyoto-u.ac.jp/forestgps/nmea.html NMEA-0183 フォーマット]と言うそうである. ** ドライブ [#a8c596c2] 位置情報の取得はできるようなので,GPS とノート PC をクルマに載せて林道を走ってみる. 位置情報は $ tee foo.nmea < /dev/ttyS0 で,画面上でデータを確認しつつファイルに保存. ** プロット [#fad59e6e] 取得したデータを加工してみる. まずは,位置情報を抜き出す. ここでは安易に perl を使う. やってることは - 緯度・経度・高度フィールドを抽出し - 緯度・経度は 10 進数に変換 - 高度情報が欠測になっているところは前の値で補間 #!/usr/bin/perl # # hhhmm.mmmm -> hh.dddd 形式への変換 # sub gps2dec { my ( $hm, $dire ) = @_; my $sign = ( $dire eq 'S' or $dire eq 'W' ) ? -1 : 1; my $h = int ( $hm/100 ); my $dec = ( $hm - 100*$h ) / 60; $sign * ( $h + $dec ); } $h_prev = 0; while ( <> ) { next if !/^\$GPGGA/; s/\*[0-9A-Fa-f]{2}[\r\n]*$//; #print "$_\n"; ( undef, $time, $lat, $ns, $alt, $we, $qual, $nsat, $hdop, $hight_sea, $m ) = split ','; if ( $hight_sea eq '' ) { $hight_sea = $h_prev; } else { $h_prev = $hight_sea; } $l = gps2dec ( $lat, $ns ); $a = gps2dec ( $alt, $we ); print "$l\t$a\t$hight_sea\n"; } このデータを使って gnuplot でプロットする. - gif ファイルに出力 - 高度軸を中心に 360 度回転させたファイルを別々に作成 で,gifsicle でアニメーション gif を作成 $ gifsicle --delay=10 --loopcount road*.gif > road.gif で作成. #ref (x.gif) #ref(x.gif,center,320x240) ** todo [#r509c21c] - 実は位置情報が南東方向に数100m ぐらいずれていたりする. -- GPS をリセットしてやらないといけないらしいが,Linux 上からやる方法が不明.Windows からやるかな. - 緯度 / 経度のアスペクト比がいい加減 -- ちゃんと長さの比率をあわせてプロットしたいところではある - 地図との連携 -- google map を使う?