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

virt_flyのブログ

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

イメージ 1
↑今回の設定で、画像のように、ミサイルの発射に時間差をもうけることも可能になります。

 

ロケットの発射までに間をもうけよう

 

  さて、これまでにAIロケットをNasalプログラムにて、他に悪影響を及ぼすこともなく、打ち上げることができるようにしてきました。

  ただ、このままだとFlightGearを起動したら、すでにAIロケットが自動的に発射されてしまっています。AIシナリオを使うことなどを思えば、コントロールとはいわずとも、せめて発射のタイミングくらいはこちらで設定したいものです。

  結果的には、rocket_launch.nas.xmlにて、/sim/time/elapsed-secを用いているのを利用し、起動後の一定秒数の間は位置変化を0にして初期位置座標のままに置いておくことで、発射までの時間稼ぎにかえ、記述も整理しました。

【rocket_launch.nas.xmlの修正】

  赤字で示した部分が、今回変更した箇所です。secの数値を変えることでAIロケットの発射までの間を変更できます。
 

<?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 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 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");
    }

    if (sec <40){   ここの数値で発射までの間を設定している
    var newalt = 0+oldalt;
    var newlat = 0+oldlat;
    var newlon = 0+oldlon;
    }else{
    var newalt = vertical_change*3.2808+oldalt;
    var newlat = latche*360.0/40000000+oldlat;
    var newlon = lonche*360.0/(math.cos(newlat*math.pi / 180.0)*40000000)+oldlon;
    }

     #print("speed:",speed," 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の修正】

  発射まで間を持たせたことで、しばらく発射台の上にとどまるロケット(ミサイル)のエンジンは、まだ点火されていませんからスモークがでていては困ります。何らかの条件設定により、スモークを発生させないように、ロケットのxmlも修正が必要です。
  他によい方法が思い当たらないので、高度を条件にすることにしました。そのためAIシナリオで配置したロケットの位置を高さで上回れば、発射されたとみなしてスモークを発生させることにしたものです。
 

<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2org.ac</path>
<?xml version="1.0"?>
<PropertyList>
<path>/Models/SA-2org.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>   22.000 </pitch-deg>
      <heading-deg> 0.000 </heading-deg>
    </offsets>
  <model>
    <path>rocket_smoke.xml</path>
       <condition>
       <greater-than>
       <property>/ai/models/tanker[0]/position/altitude-ft</property>
        <value>22</value>

        </greater-than>
        </condition>
    <offsets>
      <x-m>  0.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>


  ここまでくれば、Bombable用に自作したベトナム戦争を舞台とする北爆シナリオを、完動するようにつくりなおせるかも。