garlog改造への道 5

ていうか個人的なメモです。(H13.11.13)



 今回は新たなデータの表示について考えてみます。

 パラグライダーなどのスカイスポーツでは、風がどの方向からどの位吹いてるか把握するのが飛行中においても重要なことだと思います。そこで、garlogにこれを表示させたいなあと思い付きました。

 フライト中におけるその場の風向風速を知る方法としては、例えばGPSの速度(対地速度)と対気速度計(風圧差を利用したものや風車式などいくつか種類があります)から求める方法があります。
 これは例えば対地速度が30km/h、対気速度が40km/hなら、向かい風10km/hである、と求めます。 風向については違う方向に飛びながらこの計算をすれば分かってくるし、たとえ計算しなくてもおおよその方向は飛んでりゃ感覚でわかります。(とはいえ高度が上がるほど景色の変化が無くなるので、風の吹いてくる方向の感覚が鈍ってきますが...)

 しかし空中では計算能力が低下するというのは有名な話で、実際この程度の計算でも意外と手間取ってしまった経験があります。


 そこで自動でこれを表示させられれば便利かつ安全です。
 でもこの計算には、基本的に対気速度が必要です。しかしWonderSwanに対気速度計を付けるのは、私の技術ではとても無理だし、たとえ出来たにしても、これ以上機材を追加したくないのが本音です。(対気速度計は気流の乱れの影響を避けるために、多くの場合電線を延ばしてパイロットから吊り下げて使用します。これが面倒だし、よく壊したり失くしたりした話を聞きます。)


 だから何とかGPS情報だけのgarlogで表示させる方法はないものか。それも超貧弱な私のプログラミング技術で出来る範囲で... と、都合のいいことを考えてしまったわけです。

 幸い、パラは飛行する速度レンジが狭く、急旋回したりアクセル(翼の仰角を下げる加速用の仕掛け)などを使わなければ、それほど大きく飛行速度が変わることは無いと思うので、対気速度=一定とすれば何とかなるかもしれません。
 例えば南から一定の風が吹いていたとすると、360度旋回すれば全体的な軌跡が北方向へズレます。
 それだけでなく、全体的に南へ向かうときは(対地速度が)遅く、北へ向かうときは早くなるハズです。つまり、全体的な進行方向と対地速度の関係を合計というか積分というか累積というか、まあそれなりの処理をしてやれば、その場所に吹いている風の風向風速がわかると思うのです。
 ところで急旋回をかけると翼は遠心力との合力に見合うだけの揚力を発生させるため、速度が上がります。乱気流等によるピッチ変化やブレークコード操作で一時的に速度が変わることも考えられ、これが誤差の要因ともなります。そこでこれを防ぐため、上昇・下降速度が一定値(例えば2m/s)を越えた時のデータは使用しない、という対策をとっておきます。
(あ、でもそうするとサーマルの中で連続旋回しての上昇中に風向風速の計算ができなくなってしまうので、やっぱりこの制限は無しにしといた方がいいかな? ま、これは実際にテストして試してみることとしましょう。)


 ...と、だいたいの原理を考えました。が、あまり(ていうか全然)自信がありませんし、精度も悪そうです。しかし何もないよりはマシだと思うし、何よりもこういうデータの応用は面白そうです。
 以下、それを表示するためのプログラム案です。

 まず風向は、だいたいの向きがわかれば良いので、北・北東・東・南東…の8分割もあればとりあえず十分です。まずはこの8つのゾーンに対応する変数を用意しておきます。
 garlogは進行方向のデータを0〜360度の数値で持っているので、それぞれのゾーンに入った時の速度を8つの変数に割り振っていきます。同じゾーン内の速度は、新しい速度データが来るたびに、平均値を出して更新していきます。
 で、8つのデータがそろったら、それぞれのx,y成分をベクトル合成してやればOK。
 これで風向と風速がわかるという寸法です。フライトを続ければ8つのゾーンの平均速度値が次々と更新されるので、誤差も少なくなってゆくことでしょう。 (後で北・北北東・北東・東北東・東…の16分割にしたくなっても、ちょっと変えるだけで対応できそう。)
 ウーン、我ながら安易かつテキトーな方法。(^^;;

 が、ベクトル計算をするためには、どうしてもsin,cosの計算が必要です。gigoさんの掲示板での発言によれば、WonderWitchではこの程度の関数ライブラリもない模様。
 まずは現在のgarlogでどうやって三角関数計算をしているか、解析することから始めることとします。





 追記 (11/14)

 と、思っていましたが、この問題は後に回しておいて、具体的なプログラムの流れを考えてみることにしました。

 まず進行方向によって8分割した変数を例えば zone(0),zone(1),zone(2)… zone(7)とします。 それぞれが北、北東、東… 北西の8つのゾーンに進行方向が向いたときの速度を表す変数です。

 garlogではgarlog改造への道2で書いたようにcnv.iHeadが進行方向を0〜360°で表しているので、この数字から8つのゾーンに速度データを割り振っていきます。速度はcnv.iSpdですね。

 もし cnv.iHead==338°以上 or   23°未満なら  zone(0)=cnv.iSpd  ←「北」の速度変数に現在の対地速度を代入
 もし cnv.iHead== 23°以上 and  68°未満なら  zone(1)=cnv.iSpd  ←「北東」の速度変数に現在の対地速度を代入
 もし cnv.iHead== 68°以上 and 113°未満なら  zone(2)=cnv.iSpd  ←「東」の速度変数に現在の対地速度を代入
            ・                           ・
            ・                           ・
 もし cnv.iHead==293°以上 and 338°未満なら  zone(7)=cnv.iSpd  ←「北西」の速度変数に現在の対地速度を代入

 と、8つのif文を並べます。(なんかもうちょっとスマートに書く方法があるような気がしますが…^^; )

 これで、その時の進行方向に応じた速度変数zone( )に速度が入ります。
 最初はみんな0ですが、しばらく飛んでれば一度くらい8つに分割された方向に向くでしょうから、zone(0)〜zone(7)にはそれなりの数値(対地速度)が入ります。
(逆に言うと、離陸して間もないうちの例えば北方向にしか飛んでない時は、zone(0)だけに速度が入り他は0だから、無風状態でも風向きは北で、風速はその時の対地速度が表示されてしまうという欠点があります。 が、とりあえずこれは放っておきます。(^^; )

 で、あとはこの8つの変数をベクトル合成します。
 風速のx成分(北南軸)とy成分(東西軸)に分けて、
  風速x分=zone(0)cos0° + zone(1)cos45° + zone(2)cos90°+ …… + zone(7)cos315°
  風速y分=zone(0)sin0° + zone(1)sin45° + zone(2)sin90°+ …… + zone(7)sin315°
 と、三角関数で小数点以下の計算を... と思ってよく見たら、cos45°とか90°とか、値が決まってますね! しめた!! これなら三角関数計算は不要です。予め計算しておいたものを定数として掛けてやればオッケーです。 少しだけ希望の光が見えてきました。

 これにより得られた風速のx分,y分の絶対値をとれば、それが風速になります。極座標表示にすればいいわけですね。
  風速=sqrt(風速x分^2 + 風速y分^2)
 (平方根のsqrtは、確かgarlogのライブラリにあったハズ..)

 風向は、単純に考えると、
  風向=tan-1(風速y分/風速x分)
 となります。ウーン、アークタンジェントかあ。そんな関数あるのかなあ? などと悩んでしまう超低レベルの私にはプログラムが難しそう。そこで何かいい案はないものか...
 例えば風速x分が+で、y分が+なら風向は 0〜89°の間だし、
    風速x分が−で、y分が+なら風向は90〜179°の間だし、
    風速x分が−で、y分が−なら風向は180〜269°の間だし、
    風速x分が+で、y分が−なら風向は270〜359°の間
 ということになります。
 あとはもうちょっと工夫すれば、四則演算だけで計算できそうな気配がしてきました。

 と、今回はここで頭のスタミナ切れ。
 うまくいくか、見通しは暗いけど、ボチボチやっていくつもりです。(^^;;


 続く...(かも)



目次に戻る