問題の症状#
スクリプトで先に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.pyFlightGear準備完了を手動確認してから実行します。
連続実行スクリプト#
自動化する場合は、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に帰属します。引用部分については各引用元のライセンスが適用されます。