Nasalでロケット打ち上げ(2) | virt_flyのブログ

virt_flyのブログ

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

イメージ 1
↑Nasalプログラムはxmlに書き出すことで、それを読み出すAIオブジェクトにのみ、その働きが及ぶのを限定することができます。なお、Nasalプログラム中で複数の設定を記述すれば、画像の様に複数のミサイルの発射も可能です。

 

-nas.xmlで問題回避

 

  一応、Nasalを用いてAIロケットを打ち上げることができましたので、nasファイルが他のAI機に(今回はtanker)にまで影響を及ぼさないように、対策を考えることにしましょう。

  FGルート直下のNasalディレクトリに置かれたNasalプログラムは常に機能し、他のシツエーションの場合にあっても、AI機など該当するものがあれば、影響が及びます。
  今回の例で言えば、ミサイルの<type>をtankerにしましたから、給油機を扱うAIシナリオでは、あらぬ方向へ給油機が吹っ飛んで行くんじゃないでしょうか。

  それを避けるには、NasalプログラムをNasalディレクトリに置かない方法を考えるべきかと試行錯誤。そして、-nas.xmlファイルに行き当たりました。

  Nasalプログラムを記述したxmlファイルですから、常に機能するわけでなく、当該AI機なりtankerのxmlファイルで指定しておいて、はじめて機能するもの。他のAIシナリオには、併用でもしない限り影響は及びません。p(^_^)q

  以下に、-nas.xmlとAIミサイルのxmlを例として示します。

 【rocket_launch.nas.xml】 

  なお、一点だけ注意事項があります。AIシナリオに配置を記述した当該ミサイルが何番目のAI機(tanker)かで、rocket_launch.nas.xml中に指定するAI機(tanker)のナンバーを変えてやらねばなりません。これを間違うととんでもない機体がすっ飛んで行くことになります。
  ここの例では、AIシナリオの一番目に記述したtankerを当該ミサイルとすることを前提にして、”0”の数字(赤字で示す部分)を振っています。もし2番目なら”1”、3番目なら”2”…。
 

<?xml version="1.0"?>

<PropertyList>
  <load><![CDATA[
    var rocket_speed = 70;
    var rocket_pitch =30;
    var rocket_dir =70;

      #print ("rocket_speed:" , rocket_speed);
      #print ("rocket_pitch:" , rocket_pitch);

     var vertical_change =math.sin(rocket_pitch*math.pi / 180.0)*rocket_speed;
     var horizontal_change =math.cos(rocket_pitch*math.pi / 180.0)*rocket_speed;
      #print ("vertical_change:" , vertical_change);
      #print ("horizontal_change:" , horizontal_change);
      #print ("rocket_dir:" , rocket_dir);
     var latche = math.cos(rocket_dir*math.pi / 180.0)*horizontal_change;
     var lonche = math.sin(rocket_dir*math.pi / 180.0)*horizontal_change;

var rocket_launch = func {
     var sec = getprop("/sim/time/elapsed-sec");
     var property_alt=getprop("/ai/models/tanker[0]/position/altitude-ft");
     if (property_alt==nil){
      var oldalt=0;
     }else{
      var oldalt=getprop("/ai/models/tanker[0]/position/altitude-ft");
     }
     var newalt = vertical_change*3.2808+oldalt;
     var property_lat=getprop("/ai/models/tanker[0]/position/latitude-deg");
     if (property_lat==nil){
      var oldlat=0;
     }else{
      var oldlat=getprop("/ai/models/tanker[0]/position/latitude-deg");
     }
     var newlat = latche*360.0/40000000+oldlat;
     var property_lon=getprop("/ai/models/tanker[0]/position/longitude-deg");
     if (property_lon==nil){
      var oldlon=0;
     }else{
      var oldlon=getprop("/ai/models/tanker[0]/position/longitude-deg");
     }
    var newlon = lonche*360.0/(math.cos(newlat*math.pi / 180.0)*40000000)+oldlon;
     #print ("newalt:" , newalt," newlat:" , newlat," newlon:" , newlon);
     interpolate("/ai/models/tanker[0]/position/altitude-ft", newalt, 1);
     interpolate("/ai/models/tanker[0]/position/latitude-deg", newlat, 1);
     interpolate("/ai/models/tanker[0]/position/longitude-deg", newlon, 1);
   settimer(func { rocket_launch(); }, 0.1 );
   } 

_setlistener("/sim/signals/fdm-initialized", func { rocket_launch(); });
]]></load>

</PropertyList>


【SA-2.xml】

  以下に示すAIミサイルのxmlファイルは、スモークを曳くだけのシンプルなもの。末尾の赤字で示す部分に-nas.xmlの指定を付け加えています。
 

<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2.ac</path>
   <offsets>
    <x-m> 0 </x-m>
     <y-m> 0.0 </y-m>
     <z-m> 0 </z-m>
     <roll-deg> 0.000 </roll-deg>
     <pitch-deg> 30.000 </pitch-deg>
     <heading-deg> 0.000 </heading-deg>
   </offsets>
   <model>
   <path>rocket_smoke.xml</path>
    <offsets>
     <x-m> 7.0 </x-m>
     <y-m> -0.0 </y-m>
     <z-m> -0.0 </z-m>
     <roll-deg> 0.000 </roll-deg>
     <pitch-deg> 30.000 </pitch-deg>
     <heading-deg> 0.000 </heading-deg>
   </offsets>
   </model>

  <nasal include="rocket_launch.nas.xml"/>

</PropertyList>