きかいや。

機械といいつつだいたいプログラミングのはなし

HPASimのフライトモデルと計算課程

HPASimは有限要素法に近い運動シミュレーションを行っている。
フライトシミュレータのモデル作成は基本的に実機の設計値をひたすらプログラムのパラメータに落とし込むことになる。

0.前提:飛行機を部分ごとに分割して表現している.

現状HPASimの翡翠(09年 TBW機)では

プロペラ
胴体、フェアリングパイロット、
主翼中央、左右第一翼~第四翼(第四翼がオールムービングエルロン)
ラダー左右、エレベータ
の16要素で表現している。

これらに対して重力、推力、揚力、抗力の計算を行う。
※その後ひたすら足しあわせて力とモーメントを行っている。
その後加速度・角加速度計算→積分→速度→積分→位置
の計算.
(※以降はUnityでは物理エンジンがやってくれる。
DXライブラリ版ではそこも自前計算)


1.パラメータ入力:それぞれの要素の中身を入れる
各要素は
・翼型:迎角αに対するcd/cl/cmのリスト
・上反角:
・質量:
・翼面積:
・取り付け迎角:
・要素の位置(原点は設計時の適当な基準):
※プロペラ(エンジン)だけは回転数と速度に対する推力のリストや関数を持っている。

を設定する。
ユーザはこのパラメータを入れてやることになる。

パイロットを胴体やフェアリングと別に設定したのには意味がある。
パイロットの体の動きによる重心・慣性変化を再現するつもりで組んだからだ。

※胴体はcl=0としてcdのみ入れている。
パイロットはcl=cd=cm=0,質量50kgのように、質量のみ入れている形。
垂直尾翼は上反角90度として表現する
フェアリング垂直尾翼と同様の表現
※現バージョンではcmは入れてあるが計算は無視している(面倒だったから)
※現バージョンではプロペラは回転数に対して線形に推力を出させている
(速度依存無視、回転速の3乗比例ですらないなんてひどい雑さだ!)
パイロットは重量要素として大きいので、飛行機とは別にRigidBodyを用意してJointしたほうが適切な表現かもしれない。



FSMSなどの通常のフライトシミュレータの場合、
各要素ではなく全機としてのCL/CD/CM、重量、慣性モーメントなどをいきなりぶち込むことになるはず。
操作してみて特性を調整するにはそちらのほうがあっているかもしれない。

ーーーー------------------------------ーーーー
ユーザ側での設定は終了。

以下、シミュレーションの過程

                              • ーーーーー

2.重心位置、合計重量、重心周りの慣性モーメントを計算する。
加速度計算の前準備
2での入力値をもとに自動計算するようになっている。
回転計算用に、計算用に機体座標系で、重心位置が原点になるように座標系の取り直しをしている。
現在のところこの計算は初期化時に1回のみ行っているが、
パイロットの体重移動などを反映するなら毎フレーム計算するか、
RigidBodyを機体とパイロットの二つに分けたほうが良い。


3.各要素の翼面の法線ベクトルを計算する
迎角計算の前準備。

4.迎角を計算する
翼面の法線ベクトルと要素の相対速度(対気)(風の影響、機体の姿勢回転による影響も含む)のベクトルの内積から迎角を計算

5.揚抗力を計算する

6.揚抗力・推力・重力をRigidbodyに加える

7.加速度以降の計算は物理エンジンが行う。

8.あたり判定処理はUnityのColliderを使う

9.アニメーション、SEなどはUnityの機能をお好みで。