飛行ロボット自動操縦・全翼機入門機の図面・プログラム公開

今年も飛行ロボコンの季節がやってきた。
私はこの大会にB1からB3まで参戦し、1年ブランクを置いて、その後はずっと運営に関わってきた。

途中ルールの大幅な改定があったり、スポンサーも増えて大会も大規模化するなど、飛行ロボコンを取り巻く環境は大きく変化した。

変わるルールに合わせて、参加者も変わっていかなければならない。
とにもかくにも、大会、すなわちクライアントが何を求めていて、何をすれば良いのか、考え続けることが大事だ。


さて、(順調にいけば)今年は私も学生生活最後の年だ。
最近は作るものも本格化してきて、飛行ロボコンサイズよりも大きな無人機を作ることの方が多くなった。
そんな背景もあって、運営と研究の傍ら、久しぶりに飛行ロボコンサイズの機体を作ってみたくなった。
やっぱり普通の機体を作るのは面白くないので、最近自分の中で流行している無尾翼機、ついでにプロペラの後流を翼上面に通して揚力を稼ぐチャネル翼を採用してみた。
さらにそれを半自動操縦によってより安定化するといったコンセプトだ。
エレボンを用いたねじり下げや、ボックスを軸としたバルサ構造など、持っている技術で使えるものはこれに含めた。



f:id:yuukivel:20190912174818j:plain

機体名は「Fantôme」フランス語で「亡霊」という意味だ。

f:id:yuukivel:20190926213827p:plainf:id:yuukivel:20190926213912p:plain


youtu.be


(本当の元ネタはPS2初期の名作「SKYGUNNER」なんだけれども知っている人は少ないか,,,)


飛行ロボコンの出場機体を見ていると、いくつか気づくことがある。
無尾翼機が少ない。必須というわけではないけれども、ねじり下げを作るのが難しいのかなと感じた。
・自動操縦機でStability Assistをやっている機体が少ない。せっかく自動操縦をしているのにSASを入れないのはもったいない。

加えて、学生の様子を見ていると自動操縦をやるうえで結構参入障壁が大きいことがわかる。
・まずプロポの信号を読み出すところで苦労する。これはarduinoのpulsein関数が悪いところが大きいけれども。
・次に姿勢推定で躓く。場合によってはオイラー角を知らず、角速度そのまま積分すればいいんでしょ的なノリで来ることもある。
・Filterの存在を知らない場合がある。補正をしてあげないと3分も持たない。
・授業では習ったけれども、PIDの実装ができない場合がある。これも軽く手ほどきすれば理解してくれるのだけれど、座学だけだと「どの部分をプログラムに書けばよいのか」がシステムダイナミクスの部分とごっちゃになってわかりにくいようだ。
・制御に気が回るばかりに機体が疎かになる。しっかりと剛性のある機体を作らなければ飛行実験の再現性がとれないが、なぜか自動操縦をやり始めたとたんにヨワヨワ機体になってしまうことある(二敗)


これらの問題をうまく解決して次につなげていってもらうために、この機体の「XFLR5空力解析ファイル」「製作用ジグシート・カット部材図面」「自動制御Arduino sketch」を公開する。

github.com


製作法や基板など詳しい説明はしないが、画像やsketchの中身を見てもらえればきっと理解できるだろう。(理解できるくらいには勉強してほしい)
基本的に3mm厚バルサと1mm厚バルサだけで作れるようになっている。


ただしちょっと癖のある機体なので、調整は大変かもしれない。サイドスラスト角の調整がうまくいけば、びっくりするほどよく飛ぶ。
構造も、飛行ロボコンに直接出すにはちょっと重く、実験機としてガシガシ使うにはちょっと弱いので、本格的に運用するなら多少工夫をした方が良いかもしれない。
加えてチャネル翼で推力を揚力に変換する(語弊はある)機体なので、滑空比は良くない。
しかしながら、爆音を携えながら低速で威圧的に飛ぶ様は、往年の名機MayFlyを彷彿とさせる気もしなくもない。

もし作った!という人がいれば教えてください。泣いて喜びます。

スライド「飛行機設計の入門」の公開

 

 

↓スライド内で言及されている翼型作成エクセル

www.dropbox.com

 

私は大学でとある授業のTAをしており、そこで電動ラジコン飛行機の設計法について1時間ほど解説している。このTAはかれこれ3年半ほどやっていて、その授業用の資料も少しずつ書き足したりしてきた。このスライドを授業で見た学生は、結構多いんじゃないか。

 

無人飛行機産業に少しかかわるようになって、飛行機設計の技術というのは他の技術よりも入門の敷居が高いらしく、固定翼の設計がまともにできる人はまだまだ少ない、というのが率直な感想だった。

 

だからこそ、つまりはその技術の特殊性をもってして、航空宇宙工学を専攻した人はご飯が食べていけるわけで、私もその一人だ。その結果、持っている技術は他人から隠したくなるし、なかなか自作の飛行機が市民権を得ないのも、そういう理由だろう。

 

でもでもでも、せっかくドローンブームが来ていて、5年前に比べてグッと人々と空が近くなった現在において、固定翼界隈が乗り遅れるのは、最大級の損失だと、私は思う。機械工学、もっと具体的に言えばマルチコプターのように、航空工学が一般的な学問として認識されるようになれば、日本もアメリカのように、飛行機と人間が歩み寄っていけるのではないか。

 

というわけで、飛行機設計の手法に絞ってまとめたこの資料を公開します。

一応、最低限飛行機の専門用語とかは押さえている前提で、流体とかの小難しい話はあまりしていません。後半は空力解析ソフトXFLR5の3次元解析機能を用いた機体解析のやり方や、先尾翼機や全翼機といった変態機の簡易的な設計方法も載せています。

www.xflr5.com

 

多くの人が、固定翼を飛ばして楽しめる、そして便利だなぁと思ってもらえる世界が実現したらいいなぁ、としみじみ思います。その実現に向けて、少しでも力になれれば、と思う次第です。

遺伝的アルゴリズムによる翼型最適化プログラム「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



Hatena Blogに引越しました

ご無沙汰しております。Yuukivelです。

 

はてなダイアリーの機能停止に伴い、Hatena Blogに引越します。

前のブログはDrop Boxのリンクも切れていまして、プログラムのダウンロード等ができなくなっています。

 

前のブログの文章は、今改めて読み返してみると結構痛いので、まともな感じに書き直して、ダイジェストで編集しなおします。

ただし、まだ旧ブログは見ることができるようなので、移行が終わるまでは旧ブログも公開状態にしておきます。

 

また技術的なことの紹介も再開しようと思います。

最近は自作ラジコンを活発にやっているので、図面公開もしていきたいなぁ。

 

f:id:yuukivel:20190407181754j:plain

 

Yuukivel