X-Plane12にリアルタイム航空機を出現させる

X-Plane12の世界に現在飛行している飛行機をリアルタイムに出現させることを試みています。
飛行機のデータは自力で取得したADS-Bデータです。これはFR24とは全く関係なく、1秒おきに受信し、全て自分のサーバーに蓄えられているデータです。
つまり何らかの方法でこのデータを1秒毎に読み込んでX-PlaneのAI機として表示する方法です。

これを実現するためには下記のプラグインをX-Plane12にインストールします。このプラグインはX-Plane12を起動しながらPythonを起動して、PythonによってAI機をコントロールするために必要になるのです。
断片的なスクリーンショットですが、参考にしてください。

https://xppython3.readthedocs.io/en/latest/usage/installation_plugin.html

Closeをクリックします

私はこのままSaveをクリックしました。

さて、試しにサンプルをロードします。

するとsamplesフォルダーに下記のように沢山のPythonプログラムがコピーされます。

試しに PI_Camera1.pyをコピーして下記のようにペーストします。

そしてReloadをクリックするとこのプログラムが起動します。

F8をクリックします

他のViewを選択して通常の表示に戻しました。
これでPythonのサンプルプログラムによって視点が変えられることがわかりました。
先ほどのsamples フォルダーには沢山のサンプルが含まれていて、大変参考になります。

それらと下記のURLを参考にしつつ、2種類の生成AIの力を借りながら1機の飛行機を出現させるPythonプログラムを作り、うまく作動させることができました。
ネットに流れている日本語、英語の情が少なく、丸2日間苦労したので、初めて出現したときは感動ものでした。
https://xppython3.readthedocs.io/en/latest/index.html
https://developer.x-plane.com/datarefs/

import xp

class PythonInterface:
def XPluginStart(self):
“”” プラグインの開始時に呼ばれる “””
self.Name = “AI Aircraft Control”
self.Sig = “xppython3.ai_aircraft”
self.Desc = “Controls AI Aircraft Position”
print(“🔍 PI_AI.py がロードされました”)

    return self.Name, self.Sig, self.Desc

def XPluginEnable(self):
    """ プラグインが有効化されたときに呼ばれる """
    print("✅ XPluginEnable: AI機の制御を開始")
    self.override_physics()
    self.move_ai_aircraft()
    return 1

def XPluginDisable(self):
    """ プラグインが無効化されたときに呼ばれる """
    print("✅ XPluginDisable: AI機の制御を停止")

def XPluginStop(self):
    """ プラグインの終了時に呼ばれる """
    print("✅ XPluginStop: AI機プラグインを終了")

def XPluginReceiveMessage(self, inFromWho, inMessage, inParam):
    pass

def override_physics(self):
    """ 物理エンジンをオーバーライドしてスクリプト制御を可能にする """
    override_ref = xp.findDataRef("sim/operation/override/override_planepath")
    if override_ref:
        xp.setDatavi(override_ref, [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
        print("✅ 物理エンジンのオーバーライドを有効化しました!")
    else:
        print("❌ 'override_planepath' DataRef が取得できません!")

def move_ai_aircraft(self):
    """ AI機(plane1)を指定の緯度・経度・高度に移動 + 姿勢変更 """
    x_ref = xp.findDataRef("sim/multiplayer/position/plane1_x")
    y_ref = xp.findDataRef("sim/multiplayer/position/plane1_y")
    z_ref = xp.findDataRef("sim/multiplayer/position/plane1_z")

    pitch_ref = xp.findDataRef("sim/multiplayer/position/plane1_the")  # Pitch
    bank_ref = xp.findDataRef("sim/multiplayer/position/plane1_phi")   # Bank
    heading_ref = xp.findDataRef("sim/multiplayer/position/plane1_psi")  # Heading

    if None in (x_ref, y_ref, z_ref, pitch_ref, bank_ref, heading_ref):
        print("❌ AI機の座標または姿勢 DataRef が見つかりません!")
        return

    # **目標地点(羽田空港 RWY 34R付近)**
    lat, lon, alt = 35.540988922, 139.804336548, 50.0

    # **緯度・経度をローカル座標に変換**
    new_x, new_y, new_z = xp.worldToLocal(lat, lon, alt)

    # **AI機の座標を更新**
    xp.setDataf(x_ref, new_x)
    xp.setDataf(y_ref, new_y)
    xp.setDataf(z_ref, new_z)

    # **AI機の姿勢を設定**
    xp.setDataf(pitch_ref, 15.0)  # Pitch 15度
    xp.setDataf(bank_ref, 30.0)   # Bank 30度
    xp.setDataf(heading_ref, 340.0)  # Heading (方位) 340度

    print(f"✅ AI機1を移動: 緯度={lat}, 経度={lon}, 高度={alt}m")
    print(f"✅ 変換後の座標: X={new_x}, Y={new_y}, Z={new_z}")
    print(f"✅ AI機の姿勢変更: Pitch=15度, Bank=30度, Heading=340度")

これに PI_AI.py という名前をつけて先ほどのFolderに保存します。

なお、上記のプログラムの本当に簡単な説明です。
def override_physics(self): AI機(NO1)をこちらでコントロールできるようにします。
def move_ai_aircraft(self): 緯度経度から、AI機の位置を示すローカル座標系に変換します。その後、姿勢を反映させて表示します。
となります。


なお、このプログラムは、自機では無くAI機を出現させる設定になっているため、下記の事前設定が必要です。

なお、左下のマップはAI機の位置や高度や姿勢を確かめるのに便利です。「m」キーを押すと表示されます。


このようにしたら下の図のように選択して左クリックすると実行されます。(一度前述したFolderに保存されたPythonプログラムは、その後X-Plane12を立ち上げると自動実行されます)

これで1機のAI機をX-Plane12に出現させることができました。

ということは、伊藤研究室が構築したADS-B情報から任意の20機の飛行機の位置高度を1秒毎に読み込んで、X-Plane12に表示させるプログラムを作ることが出来ます。


今後の進捗状況は随時更新します。

お断り
伊藤研究室では研究用のライセンス版X-Plane12を使用しています。