Tweet

GPS で遊ぶ

PC カード接続の GPS を手に入れたので遊んでみる.

Linux からは

単純にシリアルのカードとして見えるようだ

# cardctl ident
Socket 0:
  product info: "SEIKO EPSON", "GPS Card E9840B", "V01.001"
  manfid: 0xc007, 0x0101
  function: 2 (serial)

cat /dev/ttyS0 で

延々と位置情報が出力される. こんなかんじ.

$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

NMEA-0183 フォーマットと言うそうである.

ドライブ

位置情報の取得はできるようなので,GPS とノート PC をクルマに載せて林道を走ってみる. 位置情報は

$ tee foo.nmea < /dev/ttyS0

で,画面上でデータを確認しつつファイルに保存.

プロット

取得したデータを加工してみる. まずは,位置情報を抜き出す. ここでは安易に 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
x.gif

todo

  • 実は位置情報が南東方向に数100m ぐらいずれていたりする.
    • GPS をリセットしてやらないといけないらしいが,Linux 上からやる方法が不明.Windows からやるかな.
  • 緯度 / 経度のアスペクト比がいい加減
    • ちゃんと長さの比率をあわせてプロットしたいところではある
  • 地図との連携
    • google map を使う?

本日のツッコミ

  • 位置情報のずれは測地系の設定の違い(日本測地系/世界測地系)だったようだ.google map 上で確認していたので. -- BAK 2007-07-01 (日) 19:32:01

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-01 (日) 19:32:01 (3819d)