2008年10月09日

m-241のフォーマット

HOLUX m-241で計測した位置情報はtrlファイルに保存される。これをGoogle Earthで読み込めるkmzファイルに変換などして表示するが、変換前に計測失敗のポイントやほとんど動いてないポイントを自動で削除したいので、perlスクリプト作成してみることにする。

まずtrlファイルを解析してみる。trlファイルをBz(バイナリエディタ)で覗きつつ、trlファイルをNMEA2KMZでcsvファイルに変換したものと比べてみる。float型のサイズに迷ったり、チェックサムがあることに気づかなかったりしたがやっと以下とわかった。

1レコード(16バイト固定)
日時(4バイト固定)緯度(4バイト固定)経度(4バイト固定)高度(3バイト固定)チェックサム(1バイト固定)


日時は1970年1月1日 00:00:00 UTCからの秒数、緯度・経度はfloat型、高度は仮数部が8ビット少ない15ビットの、全体として3バイトのfloat型、でどれもリトルエンディアン。チェックサムは日時・緯度・経度・高度を1バイトずつexclusive orした値。

float型から考えると、緯度35°、経度139°付近での量子化誤差はそれぞれ0.42m、1.7mぐらい。高度10m付近での高度の量子化誤差は0.24mmぐらい。GPS自体の精度から考えると十分。ところで地球の半径は何kmとして計算しているのだろうか?

とりあえず、trlファイルを単に読み込んでcsvファイルに変換するperlスクリプトを作成してみた。これで満足してしまったので当初の目的はまた気が向いてからにする。

----------------------------------------------------------------------

# 読込ファイル
open(IN, $ARGV[0]);
binmode IN;

# 出力ファイル
open(OUT, "> $ARGV[0].csv");

while(read(IN, $buf, 16)){
  ($time, $latitude, $longitude, $height_tmp, $check)=unpack("VffH6C", $buf);

  # チェックサム計算
  $sum=0;
  @sum=unpack("C15", $buf);
  while($data=shift(@sum)){
    $sum^=$data;
  }

  # 日時
  ($sec, $min, $hour, $mday, $mon, $year)=localtime($time);
  $mon++;
  $year+=1900;

  # 高度(仮数部に8ビットを補う)
  $height_tmp="00" . $height_tmp;
  $height_tmp=pack("H8", $height_tmp);
  $height=unpack("f", $height_tmp);

  # 出力
  printf OUT "$year/%02d/%02d %02d:%02d:%02d,$latitude,$longitude,$height\n",
    $mon, $mday, $hour, $min, $sec
      if($check==$sum);
}

----------------------------------------------------------------------

ω通信:GPS logger - livedoor Blog(ブログ)



トラックバックURL

この記事へのトラックバック

1. m-241の量子化誤差  [ ω通信 ]   2008年10月11日 01:11
HOLUX m-241の量子化誤差は普段は気にならないが、見通しのいいところでゆっくり動くと視認できる。写真の地点だと縦(緯度)方向に0.053m、横(経度)方向に1.7mの量子化誤差があり、横方向はそれがよくわかる。 これを見ると、高度部24ビットから4ビット削って経度部を3...
2. Holux m-241のtrlファイルフォーマット  [ 雪羽の発火後忘失 ]   2009年11月04日 20:44
以前予告したとおり、trlファイルについて記述しようと思ったのだが、既に日本語でも解説されているサイトが複数あるようなので、繰り返し説明する必要がないと考え、解説サイトの紹介にとどめる。 M-241 1.13のトラックログフォーマット - GPSへの扉 ??FC2出張所?? HOLUX m-...

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔