↑かつてはフライトプランや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機ばかり集めたフォルダーが存在します。これらの場合は、当然パス指定に注意が必要です。