virt_flyのブログ -18ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

↑編隊を崩す僚機を再現するWingman Control

 

AI機を飛ばす手順

 

フライトシミュレーターソフトのFlightGearも変化してきており、新しく追加された機能を含めどのように変わったのか、知る必要があると書いた手前、手始めにWingman Controlsの使い方を調べてみることにしました。

 

編隊の僚機であるwingman機もAI機の一種。ことの関わりでいけば、AIシナリオを使ってAI機を実際にとばす手順についてふれておくべきでしょう。

 

この間、AI機は蛇足のつもりでここまでAI機用の3Dモデル設定xmlだ、AIシナリオだと言うことになるとは思わず、本来ふれるべきことにふれていませんでした。知っている方には今更ですが、よくご存知ない方には不親切極まりないことと反省しています。

 

↑AI機で空戦まがいーメッサーシュミットから逃れるYak-3ーこうした遊び方はどうしたら続けられる?

 

前提①ーAI機

 

AI機とは、基本は自分が操縦する飛行機(乗機)とは違って、プログラミングに基づきコンピューターのコントロールで離発着、飛行するFlightGearの世界の航空機です。

 

AI機には、専用の3Dモデル設定xmlファイルと多くの場合は専用の機体の3Dモデル(acファイル)が必要になります。

 

なぜなら、FlightGearで通常飛行を楽しんでいる機体のファイルをそのまま使っていたのでは、自分で操縦しないAI機のプロペラの様々な回転状態やジェット噴流の様子、あるいはランディングギアの状態の再現がうまくできないからです。

 

FlightGearでは、プログラム本体のAIフォルダー内のAircraftフォルダーにあらかじめ用意されたAI機も多数あります。ここになければ、AI機化したい当該機体の3Dモデル(acファイル)や3Dモデル設定xmlファイルから専用のac及び3Dモデル設定ファイルを作成することになります。ちなみに、当該機体のこの2つのファイルは、当該機体のModelsフォルダー内にあります。

 

3Dモデル(acファイル)の修正は、主にプロペラやジェットガスの再現に使われる3Dオブジェクトを機体の3Dモデルに一体化させること、場合によっては簡略化のためにランディングギアを撤去してたり、武装や外部燃料タンクを装着してしまうことでしょうか。作業は、Blenderなどの3Dモデリングソフトを使いますが、今回の主題ではないので詳しいことは省きます。

 

3Dモデル設定xmlファイルの修正は、様々なプロペラの回転状態やジェット噴流の様子を乗機の影響を受けることなく再現できるように真対気速度で条件分岐し描き分けたり、ランディングギアを出しっぱなしまたはしまいっぱなしにするよう記述、後の多くは不要な記述の削除でしょう。一部の例はこの間紹介していますし、今回の主題から外れますので詳しいことは省略します。

 

なお、wingman機は編隊長機に追随するものですから、先の条件分岐に関しては速度でなくとも乗機のエンジンの回転数が使って構わないし、ランディングギアについては元のxmlの記述のままで乗機のギア操作に合わせて出し入れが可能なところが、通常のAI機とは違うところです。

 

作成したファイルは、いずれも元にしたファイル同様、当該機体のModelsフォルダーにおいておけばよいでしょう。

 

前提②ーAIシナリオ

 

さて、AI機を飛ばすにはもう一つAIシナリオが必要です。AIシナリオは整理される方向のようですが、wingman機や空母ではいまだバリバリの現役です。

 

wingman機のAIシナリオは、編隊の長機との位置関係や姿勢などを記すところが特徴です。詳細は省きますが、既存のAIシナリオはFlightGearプログラム本体のAIフォルダー内にあります。参考にすると良いでしょう。

 

作成したAIシナリオをAIフォルダー内に置いたら、FlightGearのランチャーを開き、目的の機体を指定してシミュレーションを開始します。

 

FlightGearの画面が表示されたら、上部のメニューから[AI]タブをクリックし、現れたドロップダウンメニュー中の[Trafic and Scenario Settings]を選択すると、「AI Trafic and Scenario Settings」というダイアログボックスが開きます。

 

 

AIシナリオの一覧から目的のAIシナリオにチェックをいれて[Close]を押すと、wingmanの場合だと乗機の周囲に僚機が表示され、編隊飛行を楽しむことができるようになります。

 

本題ーWingman Controlsの使い方

 

Wingman Controlsは、同じくFlightGear画面上部のメニューバーの[AI]タブから開いたドロップダウンメニューの中に出てきます。

 

[Wingman Controls]をクリックしたら表示されるのが、「AI Wingman Controls」というダイアログボックスです。どうやら、これで編隊飛行の操作が行えるようです。

 

 

FlightGearのwingman機能はよくできており、長機に追随する僚機の動きに多少のズレが設けられていて編隊飛行が結構リアルなのがグッジョブですが、編隊を離れる僚機の動きまでは実行してくれませんでした。

 

Wingman Controlsを使えば、右や左に僚機が離れていく様子が再現できます。ダイアログボックスの真ん中にある[Left/Right]のスライドバーを動かすことで、飛んでいく方向や角度が指定できます。

 

実行は、[Break Formation]にチェックを入れると直ちに開始されます。

 

[Formate]にチェックを入れると、再び編隊が組み直されます。

 

なお、ダイアログボックスの[OK]や[Apply]、[Reset]、[Cansel]の各ボタンは、[Cansel]を除き全く意味のないボタンです。実行されます。

 

残り一つの[Join]のラジオボタンの機能がよくわかりませんが、wingman機は旋回をしながら徐々に移動しているようです。乗機が停止していると、その周りを大きく旋回しているようです。

 

[Open/Close]のボタンもトグルのようですが今がOpenなのかCloseなのかさえよくわかりません。wingman機が複数の場合、全機が編隊を崩すか、一部のwingman機が編隊を崩すの違いがあるようにも見えます。いつもいつもと言えず確証もっては言えません。

 

↑遠方に飛んでいった僚機(右上)がある一方、長機の横に残る僚機も(AI Wingman Controlsの陰)

 

wingman controlsについいては、解説が見つからないので、上記のこと程度しか今のところわかりません。

 
どんな楽しみ方があるのかまだインスピレーションがわきません。とりあえずインスタント・リプレイで再現できるかを確かめて見ましたが、wingman機を見かけることはあっても、編隊からの離脱場面は再現されることはありませんでした。

↑かつてはフライトプランやAIシナリオを使ってこんな無茶苦茶なこともできたのに

 

以前できたことができない⁉ FlightGear

 

フライトシミュレーターであるFlightGearは、順調にバージョンアップをしているのかどうか、いまだにバージョンナンバーは2020.x.xとそろそろ4年前となる年の数字のままなのはさておき、一定の改善や新たな機能の追加がなされていることは確かです。

 

しかし、他方では以前できていたことがだんだんとできなくなっているのはどうしたものでしょう。

 

AI機のプロペラの回転の再現ができても意味がない

 

↑長機以外の3つのwingman機は、異なる3つの分岐条件でそれぞれ回転を再現しています

 

前回のブログで、AI機のプロペラの回転の再現について書きました。編隊飛行するwingman機の場合は、プロペラの低速、高速時の回転を再現するのに、エンジンの回転数、指示対気速度、真対気速度の3つがいずれも条件分岐に使え、それぞれに低速、高速の回転を再現することができました。ここでは、編隊の長機、すなわち自分の乗機のエンジンの回転数、速度をwingman機(僚機)と同じとみなして流用しています。ちなみに、プロペラの回転の条件分岐は3Ðモデル設定xmlファイル(当該AircraftのMdoelsフォルダー内にある)に記述します(参考参照)

 

ならば、次は乗機とは別個に飛行、離着陸するAI機のプロペラの回転の再現はどうか? それには、乗機のエンジン、速度の影響を受けることがあってはなりませんから、AI機の飛行用に書かれたFlightPlanやAIシナリオに記された速度を利用していると考えます。

 

ということで、確認してみることにしたのですが…。ここから大変な思いをすることになりました。

 

AI機のプロペラ問題に限ってい言えば、結論は条件分岐には真対気速度を使えばよいことに間違いないことがわかりました。ただし、ショックなことにそれになんの意味もないことも判明しました。

 

フライトプランを使うAIシナリオの場合

 

FlightPlanは、通過する地点とその時の高度、速度が記されており、AIシナリオがこれを読みだしてAI機を飛ばせるもの。FlightPlanに記されたktasの値にもとづいて飛ぶAI機の3Ðモデル設定xmlファイルでは、プロペラの低速・高速時の回転の再現の条件分枝には真対気速度が使われています。

 

FlightPlanはどうも使えないのではと以前から書いてきましたが、aircraft_demoのような離陸だけの単純なFlightPlanを使うAIシナリオでもやはり機能せず、機体が現れないのですから実際のプロペラの回転状況は確認のしようがありません。

 

もしかして、グライダーをけん引するCubのプログラムならばと試してみたら、Ubuntu用開発版2020.4.0では、Cubは現れるものの間もなく地下に潜ってしまいけん引ワイヤーにエラーが発生。Windows用の安定版2020.3.19ならどうかと思ったら、ダウンロードとインストールの仕方がよくわからず慌てさせられはしましたが、Cubの色に一部変なところがあるものの機体は表示され、けん引は成功。

 

開発版はWindows用も同様にエラーを起こしますが、開発版だからかもと言えそうですが、安定版の2020.3.19で、FlightPlanに機能するものとしないものがあるのもよくわかりません。

 

フライトプランなしのAIシナリオの場合

 

↑AIシナリオで飛んでいた給油機 今では機体が青と黄色の飛行機様のダミーに化ける

 

回転の再現の様子をもう少しはっきりと確認したいと考え、次にFlightPlanを使わないAIシナリオだけのケースも調べることにしました。旋回飛行くらいはこれまで通りできるものと信じていたのに、旋回はするものの機体が表示されず、青と黄色の飛行機様のダミーが見えるのみ。

 

驚くべきことに、<type>の記述をaircraftからshipに替えると、旋回はしないものの機体は普通に表示され、プロペラの回転の様子も確認ができます。機体が表示されなかったのはパス指定が不適切であったからではないばかりか、明らかにAircraftは絶対に表示させないという意思を感じます。

 

AIのNasalスクリプト化は既定方針⁉

 

思えば、かつてAIシナリオには、bigstorm_demoやthermal_demoいくつものrefueling_demoなどのシナリオがありましたが、今では多くがcarrier(空母)とwingmanのシナリオになってしまいました。

 

確かに、みすぼらしい(失礼)嵐のAIシナリオのかわりに、メニューのWeatherから様々なリアルな気象現象が選べるようになりましたし、thermal_demoを使って不自然な上昇気流をつくららなくても、現実世界の気象条件を反映したFlightGearの架空世界の中で上昇気流を見つければソアリングができるとか見かけたことがあります。空中給油も、メニューのAIにあるTanker Controlを使えばAIシナリオは要りません。

 

整理されていってるように思ったら、次のようなThorstenの言葉を見つけました。

「AI システムでできることはかなり限られているため、AI はより汎用性の高いNasalソリューションに置き換えられます」(「FlightGearにおけるAIのステータス」より)

 

てんで具体的なことは理解できませんが、以前からAIのNasalスクリプト化がすすめられてきたことはわかります。wingmanだって、使い方を知りませんがメニューのAIにWingman Controlができていますものね。空母がなければAIシナリオはとうになくなっていたのでしょう。

 

今更気づいたって遅すぎます。いったいAI機を飛ばすにはどうすればよいのでしょう? ai_plane.nasの進捗状況は? AI機の飛ばし方がわからないと、AI機のプロペラの回転のさせ方がどういう場面でどのようにプログラミングすればよいか迷うことのないように整理できたところで、なんの役にも立たたないではありませんか。

 

FlightGearについてこれまでに知りえたことは周辺部分のほんの一部にすぎないというのに、それとて古臭いものとなっていて、wingman controlやAIトラフィックなどあらためて一から学びなおす必要を痛感しました。

 

 

参考)プロペラの回転の条件分岐を記した3Ðモデル設定xmlファイル

 

説明の理解のために、具体的なプログラムを示さないのは不親切かと思い、実際上には今すぐ役立ちそうにありませんが、AI機の3Dモデル設定xmlの当該プロペラの回転を再現する条件分岐部分の記述例を掲載します。

 

【AI機用の3Dモデル設定xmlファイルの例】

 

この例では単純化のために再現するのは低速と高速の場合の2つとします。都合で、wingman機と他のAI機(AIシナリオなどで動かす)を1つにまとめて記述しています。わかりやすいように、条件分岐にエンジンの回転数を使用するwingman機は青色、真対気速度を使用するAI機は緑色で記述しています。実際に使用する場合は、目的に合わせてどちらかを残し不要な方は削除するかコメントアウトします。なお、プロペラの回転の再現には不要と思われる指示対気速度(<property>/instrumentation/airspeed-indicator/indicated-speed-kt</property>)については例示しません。

 

   ・
   ・
   ・
 <animation>
  <type>select</type> ←次のオブジェクトを以下の条件以下の場合に表示
  <object-name>prop</object-name> ←低速時のプロペラの3Dオブジェクト
  <condition>
   <less-than>
    <property>/engines/engine[0]/rpm</property> 
←エンジンの回転数
    <value>1000</value>
   </less-than>

   <less-than>
    <property>velocities/true-airspeed-kt</property> 
←真対気速度
    <value>10</value>  ←数値はいい加減
   </less-than>
  </condition>
 </animation>

 <animation>
  <type>spin</type> ←次のオブジェクトを以下の場合で回転
  <object-name>prop</object-name> ←低速時のプロペラの3Dオブジェクト
    <property>/engines/engine[0]/rpm</property> ←エンジンの回転数
    <factor>-0.479</factor>
    <property>velocities/true-airspeed-kt</property> ←真対気速度
    <factor>-0.479</factor>  ←数値はいい加減
    <center>
    <x-m>3.40</x-m>
    <y-m>0.0</y-m>
    <z-m>0.0</z-m>
  </center>
  <axis>
    <x>1.0</x>
    <y>0.0</y>
    <z>0.0</z>
  </axis>
 </animation>
     
 <animation>
  <type>select</type> ←次のオブジェクトを以下の条件以上の場合に表示
  <object-name>propdisk</object-name> ←高速時のプロペラの3Dオブジェクト
  <condition>
   <greater-than>
     <property>/engines/engine[0]/rpm</property> 
←エンジンの回転数
     <value>1000</value>
   </greater-than>
   <greater-than>

     <property>velocities/true-airspeed-kt</property> ←真対気速度
     <value>1</value>  ←数値はいい加減
   </greater-than>
  </condition>
 </animation>

 <animation>
  <type>spin</type> ←次のオブジェクトを以下の場合で回転
  <object-name>propdisk</object-name> ←高速時のプロペラの3Dオブジェクト
    <property>/engines/engine[0]/rpm</property> ←エンジンの回転数
    <factor>-0.479</factor>
    <property>velocities/true-airspeed-kt</property> --> ←真対気速度
    <factor>-0.479</factor>  ←数値はいい加減
  <center>
    <x-m>3.40</x-m>
    <y-m>0.0</y-m>
    <z-m>0.0</z-m>
  </center>
  <axis>
    <x>1.0</x>
    <y>0.0</y>
    <z>0.0</z>
  </axis>
 </animation>
   ・
   ・
   ・

 

FlightGearの通常の機体の3Dモデル設定xmlは、当該AircraftのModelsフォルダーにあります。大概はAircraftの名前を冠し、○○○○.xmlとなっています。例外はいくらでもあります。

 

AI機用の3Dモデル設定xmlは、通常の機体の3Dモデル設定xmlを元に作成したわけですから、そのまま同じフォルダーにおいておくのが無難です。AI機用の名称は通常と区別するため○○○○-ai.xmlなどとしておきます。

 

機体によっては、AIフォルダーを新たに中に設けているケースもあります。また、FlightGearではデフォルトですでにAI機ばかり集めたフォルダーが存在します。これらの場合は、当然パス指定に注意が必要です。

 

 

 

↑塗装用のテクスチャーが複数できたので、作製したAI機に貼り付けて編隊飛行させてみる

プロペラの回転の再現でAI機も作製

 

フライトシミュレーターのFlightGear用航空機のYak-3に、またまた不具合を見つけてしまいました。「Yak-3の機体ファイルの不具合を直そう」が4回目になるとは思いませんでした。なんだか他人のあら捜しをしているやな奴って感じがしてきます。

 

そんな気は毛頭なく、あくまでも経年変化により不具合が生じた機体が、しかも何年もそのままになっているのはもったいないので直してしてしまおうというスタンスです。本来、他人が勝手に作品をいじるのは失礼な話で、作者によるメンテナンスを待つべきだと思います。

 

さて、今回の不具合というのは、排気管のペインティングのし忘れと、見た目気づかなかったのですがプロペラが壊れていたことです。

 

排気管の未塗装

 

違和感がありつつも、排気管は機体左右で違いがあるのがYak-3の仕様かと思ったのですが、いくらなんでもそんなことがあるわけありませんよね。目立ちますから、気がついて慌ててテクスチャーの当該箇所を黒っぽく塗ってやりました。

 

プロペラのac、rgb両ファイル間のエラー

 

↑select livery機能の導入でペイントが簡単に変えられるようになったYak-3

 

プロペラの方は、中速時の回転が描写されないのだなと思いはしましたが、まったく気になりませんでした。発見のきっかけは、前回紹介したselect livery機能(画面上から機体の塗装を切り替えられる)がYak-3に実装できないと困るので念の為に確認した際、いくつか機体の塗装用テクスチャーを描いたので、Wingman機能(編隊僚機)を使って遊べるようにAI機をこしらえようとして、プロペラの回転の再現に手こずることになったからです。

 

3Dモデリングソフトで見てみると、問題はYak-3が使用している3Dオブジェクトのpdiskとそのテクスチャーpdisk.rgbとがうまく関連していなくてエラーを起こすこと。

 

pdiskは、旧いFlightGearの機体で結構使われていたようで、F-4Uにまだ残っていたpdisk.rgbを借りてきて復旧することができました。ただし、F-4Uではプロペラの先端に塗られた黄色の塗装が弧を描くようになっているので、これを描かせないために画像を拡大してはみ出させるようにしました。

 

結果、Yak-3は中速時の三ツ矢羽風のプロペラの回転が再現できるようになりました。

 

AI機でのプロペラの回転の再現

 

AI機、わかった風なネーミングですが、FlightGearでは要は直接操縦するのではなくプログラミングして動かす機体のことと言っていいでしょう。それぞれの機体ファイルを一部改変し、コンピューターが操作できるようにしたのがAI機です。

 

Yak-3のAI機は、プロペラはpdiskを使わず、Bf-109のAI機につけられていたより簡単なpropdiskだけを取り出し、Yak-3の3Dモデルに合体させてつくることにしました。

 

↑プロペラの回転の様子ー機体ごとに少しずつ違えています 高速時のプロペラの影は、もともとありましたが濃くてでかいのが異様。なくすとまた物足りない。どうしたものか?(画像は内容にあったものに差し替えています)

 

propdiskは、透明の円板上の3Ðオブジェクトで高速時のプロペラの回転様子を画像にしたもの(テクスチャ―)をこれに貼り付け、高速時になったときに表示させるようになっています。AI再現するのにプロペラの高速時の回転を再現するのにpropdiskを機体の3Ðモデル(acファイル)の一部として取り込んでおく必要があります。この点は通常の機体とAI機の違いでしょう。

 

高速回転再現時の高速の条件は、今回は編隊を組ませたくAI機というよりwingman機となりますので、長機(起動した機体=自分の乗機)同様エンジンの回転数がもとになります(メモ参照)。

 

無事(wingman機)のプロペラも回転し、低速時、高速時の状態が再現できました。このページの各スクリーンショットがそれを示しています。

 

<メモ>おさえるべきはAI機とwingman機の違い

 

wingman機はAI機の一種といえますが、乗機のスロットルの上げ下げ、ギアの出し入れの操作が、直接wingman機に反映されます。編隊を組んでいるのですから、半ば当然です。

一方、AI機は空港を離発着する定期便の航空機や駐機場で止まっている旅客機、襲撃してくる爆撃機などなど、自分の乗機が飛んでいようが止まっていようが関係なく、飛行しあるいは駐機していなければなりません。

 

したがって、AI機のプロペラを回すには、乗機の影響を受けないよう上記のエンジンの回転数を頼りにするわけにはいきません。フライトプラン(今でも使えるのかは未確認)やAIシナリオでプログラミングされた速度を利用するしかないでしょう。

 

両者について、うっすらとした理解しかしていないようでは、混乱のもとです。私自身がきっちりと理解していなかったため、エンジンの回転数は使えないと思い込み、僚機にも速度を使っていました。この場合、笑っちゃいますが乗機の速度を使っていたわけです。本来のAI機に使用すべき速度と、速度に2つあることにも深く思い至らず、この3者の使い方でしばしば混乱していました。

 

恥ずかしながら、まだ理解が不十分かもしれませんが、これが今回の到達点です。自戒のためにメモに残します。ホームページの方のあやふやな記述も改めた方がよさそうですね。