2013年10月30日水曜日

IGCファイルの解析

最近大会でGPSが使われだしたが、採点作業がやたら大変だった。
なのでC言語の勉強のついでにIGCファイルを解析するプログラムを書いてみることにした。
六大戦のGPSトラックもたくさんあるし、流行のビッグデータという奴だ。

IGCファイルの構造


ALXNNM9FLIGHT:1HFDTE130913HFFXA015HFPLTPILOTINCHARGE:MASAHIRO_HIBIHFGTYGLIDERTYPE:SZD_51HFGIDGLIDERID:JA2492HFDTM100GPSDATUM:WGS-1984HFRFWFIRMWAREVERSION:1.8HFRHWHARDWAREVERSION:2.2HFFTYFRTYPE:LXNAVIGATION,LX_Colibri_IIHFGPS:GlobalTopPA6B,66ch,max18000mHFPRSPRESSALTSENSOR:INTERSEMA,MS5607,max8000mHFCIDCOMPETITIONID:UTHFCCLCOMPETITIONCLASS:STANDARDI023638FXA3941ENLC1309130119451309130001-2C0000000N00000000EC0000000N00000000EF013052112306031619221307270118LLXNORIGIN0126163612972N13924756EB0126163612972N13924756EA-000900027006032B0126313612972N13924756EA-000900027006032B0126463612972N13924756EA-000900027006032B0127013612972N13924756EA-000900027006032B0127163612972N13924756EA-000900027006032........

実際にIGCファイルを開くとこのようになっている。
最初はパイロットや機体の情報等が載っている。
重要なのはBから始まる行で、Bから始まる行はフライトのログである。
コンマを入れてデータごとに区切る。

B,012716,3612972N,13924756E,A,-0009,00027,006032

B :フライトログの行であることを示す
012716 :UTCで01時27分16秒
3612972N :北緯36度12.972分
13924756E :東経139度24.756分
A :正しく高度が記録されていることを示す
-0009 :気圧高度
00027 :GPS高度

このフォーマットに従って行ごとに1つのプロットが記録される。読み出しは一行ごとに行い、分割してデータを取り出すことになる。

距離計算

GPSロガーはWGS84地球楕円体を用いた緯度経度を記録しているので、簡便に球座標で済まそうとすると誤差が避けられない。
計算した結果100m未満程度の違いが出るが問題になるほどではないので簡単な球座標を使うことにする。

計算式

同じページに方位計算式も載っているが、進路の方位を計算するには誤差が大きすぎて使えなさそうだ。

高度

気圧高度計の高度を使うので当然地上気圧に左右される。
大会でよく使われているのが離陸直前の高度を使って補正する方法なのでプロットの高度差分が一定値を超えたら離陸とし、その前の高度を地上高度とみなし離陸地点の標高を使って補正する。

聞く所によると昔、離脱後即旋回点に突撃して地面効果を使って帰ってくるようなフライトがあったため大会では最低高度が規定されている。滑空場上空100mから起算して1km当たり40mのすり鉢を割っていないかも判定する。

空域判定

いつも飛んでいる妻沼滑空場は、フライトプランを出さない場合の9km半径の空域だけでなく、(大会では)上限高度と飛行区域が定められている。普通はライセンスを持っている人はVFRで飛べば良い。

円が9km、A空域は上限4500FT、B空域は3500FT

普通の大会では面倒なのでフライトプランを出さない9km圏内のフライトがメインである。なのでAB空域かつ9km以内にプロットがないか、主に滑空場南西側を確認すれば良い。
空域判定アルゴリズムはエリアの外の点からプロットに引いた線分とエリア境界の交点の数で判定する。奇数ならエリア内、偶数ならエリア外なので判定ができる。

写真判定をしていた時代の名残からか旋回点クリア高度も決められている。
旋回点セクター内で600mを切ったら減点がつくことになっている。
これも同じようなアルゴリズムで判定する。今は90度の扇型だが将来は半径1kmのシリンダーになるらしい。

サーマル旋回の検出

一分の間300mの範囲内にとどまっていたら旋回しているものと見なすことにする。
一分ごとの位置と高度がわかるので、差分を取って旋回開始高度と終了高度を検出する。
これを利用して平均上昇率や風向風速を推定することができる。

GoogleMapで表示

このウェブサイトでアップロードして表示できる。
http://ctateha.webcrow.jp/work/igcparse/index.html

0 件のコメント:

コメントを投稿