問題の症状#

JSBSimから手動実装したUDPパケット(80バイト)を送信しても、FlightGearで機体が動きません。

症状:

  • JSBSimコンソールでは飛行データが正常に表示される
  • FlightGearでは機体が地上に静止したまま
  • エラーメッセージは表示されない

原因#

FlightGearのnative-fdmプロトコルは、約300バイト、50以上のフィールドを要求します。

しかし、簡易実装では80バイトしかサポートしていなかったため、FlightGearが必要なデータを受け取れませんでした。

具体的な問題:

# 手動実装(誤ったアプローチ)
packet = struct.pack('dddddddd',  # 8個のdouble(64バイト)
    lat, lon, alt,
    phi, theta, psi,
    v_north, v_east
)
# → FlightGearが期待する50+ fieldsに対して8 fieldsしか送信していない

struct.pack()で手動構築したパケット仕様と、FlightGearの期待する仕様に大きなギャップがありました。

解決方法#

JSBSim組み込みの**type="FLIGHTGEAR"出力**を使用します。

XML設定#

JSBSim機体XMLに以下を追加:

<?xml version="1.0"?>
<output name="localhost" type="FLIGHTGEAR" protocol="UDP" port="5550" rate="60"/>

JSBSimがnative-fdmプロトコルの完全実装を自動で行うため、手動UDP実装は完全に不要です。

FlightGear起動オプション#

FlightGear --fdm=null --native-fdm=socket,in,60,,5550,udp

オプション説明:

  • --fdm=null: FlightGear内部FDMを無効化(JSBSim外部FDM使用)
  • --native-fdm=socket,in,60,,5550,udp: UDP 5550ポートで外部FDMデータ受信(60Hz)

予防策#

1. 公式ドキュメント優先#

低レベルAPI(raw UDP)実装より、高レベルAPI(FLIGHTGEAR出力タイプ)を優先します。

2. 複雑なプロトコル仕様は手動実装しない#

native-fdmプロトコルは300バイト、50+フィールドと複雑です。シミュレーター自体の機能を活用しましょう。

3. 組み込み機能を最初に確認#

JSBSimは多くの出力フォーマットを組み込みでサポートしています:

  • type="FLIGHTGEAR" - FlightGear native-fdm
  • type="CSV" - CSV形式
  • type="SOCKET" - カスタムプロトコル

参照資料#

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

筆者の過去調査データ#

  • jsbsim_fg(private repository)
    • docs/phase5/PHASE5_FLIGHTGEAR_USAGE.md:13-27 - 問題点認識
    • docs/phase5/PHASE5_FINAL_REPORT.md:44-63 - 解決策
    • temp/PHASE5_FLIGHTGEAR_INTEGRATION_PRACTICAL_GUIDE.md:233-235 - 正しいアプローチ

公式ドキュメント#

  • JSBSim Reference Manual - Output Directives(https://jsbsim-team.github.io/jsbsim-reference-manual/)- Public Domain
  • FlightGear Wiki - Network I/O(https://wiki.flightgear.org/Generic_protocol)- CC BY-SA 3.0

© 2025 Yaaasoh. All Rights Reserved.

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