遺伝的アルゴリズムによる翼型最適化プログラム「XGAG」

XGAG  -XFOIL Genetic Algolithm Graphical user interface airfoil design tool

f:id:yuukivel:20190409110902p:plain

遺伝的アルゴリズム(GA:Genetic Algolithm)を用いて、指定した揚力係数と、指定値以上の翼厚を持つ翼型の中で、抗力やモーメントが最小となる翼型を求めるツールです。

 

2019年現在でも多くの方に使っていただけているようで、開発した身としては非常に嬉しく思います。

 

XGAGの特長は以下の通りです。

  • 最適化によって翼型を求めるため、境界層パラメータ等の翼型解析の専門知識がなくても新しい翼型が作れる。
  • 翼厚の指定ができるので、構造にあった空力の設計がしやすくなる。
  • 4つの基底翼型とキャンバーの足し合わせによって翼型を表現するため、スムースな翼型を作成しやすい。また出力される翼型の形をある程度コントロールできる。
  • GUIツールなので、初学者にもわかりやすい。

 

逆に使用する際に気を付けなければならない点は

  • 失速特性等は考慮できないため、解析点特化の翼型が生成されやすい。場合によっては失速特性が非常に悪い恐れがある。
  • 乱流遷移を後方にする(すなわち層流翼化)して抗力削減を狙う場合がある。この場合、製作精度の要求が高くなる。
  • 時々XFOIL生成ファイルである"xfoil_pwrt.dat"が正常に削除できず、解析がうまく回らないことがある。その場合再起動が必要。

プログラムは以下のgithubレポジトリからダウンロードしてください。

console版は裏でコンソールが出ますが、もし32bit版が動かないようでしたら使用してみてください。

github.com


 

以下、使い方です。はてなダイアリーからお引越し。

 

XGAGの使い方-設定編

まず翼型を集めましょう。以下のサイトをオススメします。

www.airfoildb.com


・欲しい翼型を検索して、そのページを表示。Other formatのDATの中身を保存しましょう。DATの中身をメモ帳とかに貼って.datの拡張子で(分からなかったら.txtでもよい)保存するのでも結構です。翼型ファイルの本質は、縦にダーっとならんだXY座標ですので、それがあれば大丈夫です。

上のサイトは時々アクセスできなくなったりするので、有名どころも載せておきます。

http://aerospace.illinois.edu/m-selig/ads/coord_database.html

余談ですがUIUCのM-Selig先生は翼型界の超大御所です。プロペラの人とか知っている人も多いでしょうSD7037とかはSelig先生とDonovan先生の開発です。

 

DAE-11 //// DAEシリーズのなかで最も太い翼型です。31、21と比べると空力的性能はちょっと微妙。。。
DAE-21 //// DAEシリーズのなかでよく使われる翼型です。太さと空力性能がちょうどいいです。
DAE-31 //// 言わずと知れた名作。細いですが空力的な性能が良いです。
DAE-41 //// 影に隠れてあまりぱっとしないですが、低揚力係数での抗力係数が小さく、翼端向けの翼型としてよい翼型です。
DAE-51 //// プロペラ向けの翼型です。低レイノルズ数で使いやすいです。細いですが。
FX76MP120 //// 高いレイノルズ数、高い揚力係数では、圧倒的な揚抗比を誇ります。1度解析して取り憑かれる人が多いですが、高すぎる揚力係数、凄まじい捻りモーメント係数など欠点も多いです。
FX76MP140 //// FX76MP120のとんでもない性能には劣りますが、その代わり翼型の中ではかなり太い部類に入ります。それでも十分に良い性能です。
FX76MP160 //// 太さがとんでもないです。太すぎて二段失速の傾向が見えていますが、性能はよいです。
SD7037 //// うちのチームでプロペラに使っていました。下面が直線で作りやすいです。性能は普通です。探せば風洞試験データが手に入るようです。
epper66 //// 低レイノルズ数での揚抗比がとんでもないです。ちょっと細いですが使いやすいです。

 

保存した翼型はXGAG内の「FOILS」に保存しておくと、後々選択が楽です。このデフォルトの翼型フォルダは、プログラム内で変更することができます。

ではソフトを起動しましょう。(画像は開発中のものです。レイアウト等は今後変わることがあります)

 

初回起動したらOptionタブからDefault Directory & Foilsを選択して翼型ディレクトリとデフォルト翼型を設定して下さい。次回起動時からその翼型が選択された状態で起動します。
(初回起動時でもFileタブでNewを選ぶと、デフォルトがすべてBase Airfoilに設定されます)

f:id:yuukivel:20190409111603p:plain

 

初めデフォルトに設定されているXGAG内のFOILSディレクトリには、サンプルとしていくつか翼型を入れてあります。このまま翼型ディレクトリとして使うのもいいと思います。

デフォルト設定が終わったら早速解析の設定を行います。翼型はデフォルトから変えることも簡単です。.datもしくは.txtの翼型座標ファイルを選択するだけです。

 

まずは目標値を設定します。

解析する迎角α(deg) : XFOILで解析する迎角を設定します。

Reynolds数 : 解析するレイノルズ数です。人力飛行機でしたら大体翼根のレイノルズ数=500000、翼端のレイノルズ数=200000ぐらいになるかと思います。定義はRe = Chord * Velocity / ν  ν : 動粘係数(空気だと1.512×10^(-5)くらい)

揚力係数 : 目標となる揚力係数を設定します。揚力係数とは、単位面積の板が発生する揚力が、その板を風に垂直に立てた時の何倍になるかを表す係数です。

翼厚 : 翼の厚さが翼弦長に対して何%になるかを表しています。13~15%くらいは太い翼型、8~9%くらいが細身の翼型と呼ばれます。

翼厚計算位置 : 翼の厚さをどこで計算するか指定します。翼にかかる捻りモーメントができるだけ0になるように設定します。(風圧中心:35~40%)。また、迎角が変わってもモーメントが変化しない点である空力中心(約25%)に設定する考え方もあります。非常に強いモーメントがかかりますが、翼がバタバタしにくくなると考えられます。

最小抗力係数 : 計算で現れる異常値を弾くために設定します。抗力係数がこれ以下になると計算しません。とりあえずデフォルト値で大丈夫です。

 

続いて、評価関数について。評価関数は解析に書けた翼型がどれだけ目標に近づいているかの”点数”を表しています。高ければ高いほどその評価関数の中でよい翼型です。
抗力を小さくする場合は1/Cdの係数を大きく、捻りモーメントを小さくするには1/Cmの係数を大きくして下さい。となりの指数関数項は目標値から離れれば離れるほど小さくなります。いわば”罰則”です。
きつい制限を加えたければ罰則の項を大きくして下さい。大きくしすぎると抗力やモーメントの低減効果も小さくなってしまいます。

これで設定が済んだので、早速実行してみましょう!

XGAGの使い方-実行編

f:id:yuukivel:20190409111732p:plain

実行は startボタンです。途中で止めるのはstopでできます。restartボタンはその設定のまま初めから計算し直します。

 

ある程度計算をすすめると、下のような画面になります。解析をすすめて、これはとっておきたい!という翼型ができたら、エクスポート(後述)するか、計算のセーブをしましょう。Ctrl+SもしくはファイルタブのSave,Save as で計算状況が.gagで保存されます (.gagの中身は基本的にCSVですが、エクセルで開いてしまうと壊れるので独自拡張子にしました。メモ帳で中身が見られます)

f:id:yuukivel:20190409111831p:plain

さて、計算をストップすると、以下のようなことができるようになります。

  • 新規プロジェクトの開始 (Fileタブ→New)
  • プロジェクトのオープン (Fileタブ→Open)
  • 翼型のエクスポート (翼型表示の下の世代選択ボタンとexprot foilボタン
  • 翼型のロールバック

技術的なこと

遺伝的アルゴリズムはもともと非効率な最適化手法です。少しでも効率を良くするためにXGAGは以下のような手法を取り入れています。

  • ルーレットルール (評価の低い翼型も生き残る可能性を残すことによって系の多様性を維持する)
  • 突然変異 (系の多様性を維持)
  • エリート戦略 
  • Gray coding
  • シェアリング手法
  • XFOILによる翼型の自動整理(翼型データを綺麗にする)

エリート戦略

エリート戦略とは今までで最も良い個体の遺伝子を毎世代必ず1つ投入することによって、系の収束を早める手法の事をいいます。すごく重要なのですがこれがちょっと困ったちゃんなのです。
つまり、解析に異常値がでて最良個体の更新が行われてしまった場合あまり良くない遺伝子が毎世代投入されることになり、収束に悪影響を与える、ということです。XFOILは時々とんでもないCDを吐いたりするので、これを防ぐ必要があります。

対策として、最小抗力の設定を行っていますが、これだけでは不十分です。最適化をかけて放っておいて、異常値がトップに来てるのは哀しいものがあります。

そこで、リバートを使います。この機能は、セーブされている最良個体の遺伝子を、何世代か前のものに戻すことができます。
これはおかしい、と感じたら、履歴を見ながら世代選択ボタンで世代を選択し、その世代まで最良個体を戻すのが良いでしょう。変わるのは最良個体一つだけです。

 

Gray Cording

XGAG ver1では遺伝子表現にbinary(2進数)表現を用いていました。この遺伝子を遺伝的アルゴリズムによって組み換えていきます。
例えば、遺伝的アルゴリズムによってある変数値を10進数にして11から12に変えたいという要請があったとしましょう。
このとき2進数表現では、1011から1100の変更となり、1と0を2箇所入れ替えなければなりません。逆に考えて、ある2進数にて0と1を1箇所入れ替えると10進数が2とか3とか変わることがあります。
これが遺伝的アルゴリズムの収束に悪影響を与えます。これを防ぐのに用いられるのが「Gray Cording」です。
Gray Codeにて0と1を1箇所入れ替えたとき、10進数も1しか変わらないようになっています。
グレイコード」とかでググるともっと詳しい解説が出てきます。

この実装により、収束性が大分改善されました。
Gray Cording実装自体もpythonの「binstr」というライブラリ

pypi.python.org


を見つけてこの中の関数をちょちょっと使うだけなので凄く簡単でした。

 

シェアリング手法

多目的遺伝的アルゴリズム(MOGA)では、パレート解(ある評価関数の値を改善するのに他の評価関数の値を下げなければいけない解)を効率よく探索するために、個体が密集している地域の評価関数の値を罰則として下げる「シェアリング手法」がよく用いられます。
XGAGが採用するGAはMOGAではありませんが、シェアリング手法を導入することで、局所解に陥りにくくできるのではないかと考えました。
XGAGで用いているシェアリングは表現空間シェアリング手法であり、近い形状をもつ翼型がたくさん集まっている所に罰則を科します。
各最適化係数のユークリッド距離を計算し、シェアリング半径という定数内に入ったものが、その距離に応じた罰則を受けます。

シェアリングを導入することによって、気持ち一つか二つの解に到達しやすくなったかな?という感じがしています。シェアリングを導入する前は実行するたびに出てくる解が違ったりするので、良い形状を探すのに人力を使っていることもありました(今のバージョンでもそれが必要な場合はありますが)ただし、シェアリング半径は設定できるようにしましたが、この値を大きな値にすると全然収束しなくなるので注意!シェアリング半径を0にするとシェアリングを行わなくできます。

 

翼型インプットに対するXFOILの積極的な利用

XFOILには、翼型の曲率が大きい所ほどたくさん点を入れてくれるといった便利な翼型補間機能(PANE)があったり、翼弦長が1じゃない翼型も相似拡大縮小して1にしてくれたり(NORM)、翼型ファイルの段階で迎え角(厳密には表現が違いますが)ついちゃったりしてる翼型の迎え角を0にしてくれたり(DERO)、いろいろ便利な機能があります。これらの機能を積極的に使うことによって、きちんと整理されていない翼型ファイルをXGAGに突っ込んでも大丈夫になりました。(もちろんきちんとしていた方が良いですが)また、この処置を行うことによって、ver1.00では必須な、難易度の高い速度分布調整を行う必要がなくなりました。つまり、XGAGで翼型を作って、そのままXFLR5とかで解析、実際に使用、といった流れが可能になったわけです。
計算の揚力係数が1.200だとか、翼厚11.00%とかの翼型が生成できたら、調整することなくそのまま使うことができるということです!(確認はしてくださいね)

以下はXGAGで作った翼型を速度分布調整することなくXFLR5解析に掛けた結果。圧力分布に不自然な振動がないのがわかります。XGAGとXFLR5ではともにXFOILを使っているので当たりまえっちゃ当たりまえだが、揚力係数の値が1.200(設計目標値)であることにも注目

f:id:yuukivel:20190409112653p:plain