- 追加された行はこの色です。
- 削除された行はこの色です。
* 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 を使う?