問題の症状#

スクリプトで先にJSBSimを実行し、その後FlightGearを起動すると、FlightGearが初期化完了する前にJSBSimがシミュレーション終了してしまいます。

結果:

  • FlightGearが受け取るUDPデータが不完全
  • FlightGearでは機体が動かない
  • データ到着しない

原因#

FlightGear起動時間: 2-3分の初期化時間が必要

スクリプトの待機時間: 15秒しかなかった

JSBSimがUDPパケット送信開始時、FlightGearが未準備の状態でした。UDP(コネクションレス)では送信側が受信側の状態を知らないため、パケットが破棄されます。

解決方法#

2段階アプローチ#

ステップ1: FlightGearを先に起動#

# start_flightgear.bat
FlightGear --fdm=null --native-fdm=socket,in,60,,5550,udp

数分待機(FlightGear初期化完了まで)

ステップ2: JSBSim実行#

# run_jsbsim_only.py
python run_jsbsim_only.py

FlightGear準備完了を手動確認してから実行します。

連続実行スクリプト#

自動化する場合は、60秒の待機時間を確保:

# launch_continuous.py
subprocess.Popen(["start_flightgear.bat"])
time.sleep(60)  # FlightGear初期化待機(最低2分推奨)
subprocess.Popen(["python", "run_jsbsim_only.py"])

予防策#

1. 受信側(FlightGear)を先に準備#

UDPはコネクションレスなため、受信側を必ず先に起動します。

2. 十分な初期化待機時間を確保#

最低2分の待機時間が必要です(FlightGear起動時間)。

3. 手動確認プロセスの方が確実#

自動化より、ユーザーに「FlightGear準備完了か」と確認させる方が信頼性が高い場合もあります。

4. 起動順序を明示的に設計#

プロセス間通信では起動順序を設計段階で明確にします。

参照資料#

本記事の執筆にあたり、以下の資料を参照しました:

筆者の過去調査データ#

  • jsbsim_fg(private repository)
    • docs/phase5/PHASE5_FLIGHTGEAR_USAGE.md:18-21 - 問題認識
    • docs/phase5/PHASE5_FINAL_REPORT.md:67-84 - 解決策
    • docs/phase5/README_CONTINUOUS.md:29-31 - 正しいアプローチ
    • launch_continuous.py - 連続実行スクリプト実装例

公式ドキュメント#

  • UDP Protocol Specification(RFC 768)- Public Domain

© 2025 Yaaasoh. All Rights Reserved.

本記事の著作権はYaaasohに帰属します。引用部分については各引用元のライセンスが適用されます。