
↑FlightGearのデータをAmbientdeで表示させることができた グラフ化する意味はないと言えばないが
Generic protocol+UDP+Ambientで実現
眼が悪くなり、FlightGearの飛行機の計器の値やHUDの目盛りがまるで見えなくなったのが苦痛で、手元に置いたタブレットに表示させたり、計器をこしらえて表示できたなら、と思うこの頃です。
先ごろ電子工作で、温度センサーの値をデータ可視化クライアントサービスのAmbientに送信してグラフを描かせることができたものだから、少々欲がでてきました。
FlightGearのGeneric protocolやUDPを利用した例もあるようなので、試してみようかなということで、今回のテーマは「FlightGearのデータを外部表示させよう」です。
いろいろ試行錯誤しつつ方向を見定めるようにしてきましたが、順次FlightGearのGeneric protocolを利用して目的のプロパティの値をUDPで送信、送信先は慣れたAmbientにするとの方向ですすめ、最終的に成功しましたので報告とします。
Ambientでグラフを描いても仕方がないのですが、まずは外部送信を試すことが目的でしたので、今回はご勘弁を。
■必要なものと手順
ここではWindowsで説明します。
今回は、速度と高度、方位の3項目を送信することにしましたが、他にも様々な値を扱うことができるでしょう。
・注意事項
最新のFlightGearはディレクトリ構造が変更になったようで、以前ならROOTディレクトリ直下にサブディレクトリとしてあったものが、別途指定した場所に変わってしまっており、FlightGear起動時のオプション指定もややこしくなりました。
・Python
Pythonでプログラムしますので、あらかじめPythonがインストールされている必要があり、requestsなど必要なものはpip installします。
※Pythonインストール時には、「Add Python 3.x to PATH」にチェックを入れること
・fgdata.xml
プロトコルはfgdata.xmlに記述し、FlightGearのデータファルダ内のProtocolサブフォルダに置きます。
<?xml version="1.0"?> <PropertyList> <generic> <output> <line_separator>\n</line_separator> <var_separator>,</var_separator> <chunk> <name>groundspeed-kt</name> <node>/velocities/groundspeed-kt</node> </chunk> <chunk> <name>altitude-ft</name> <node>/position/altitude-ft</node> </chunk> <chunk> <name>true-heading-deg</name> <node>/orientation/true-heading-deg</node> </chunk> </output> </generic> </PropertyList> |
|
・fg_ambient.py
データを送信させるためのPythonプログラムを記述し、fg_ambient.py名でC:/Users/自分のフォルダ名/下に置きます。
import socket import json import requests import time import math # FlightGearからのUDP受信設定 UDP_IP = "127.0.0.1" UDP_PORT = 5501 # FlightGearの送信ポートに合わせる # Ambientの設定(自分のチャネルIDとライトキーを入れる) AMBIENT_CHANNEL_ID = 99366 AMBIENT_WRITE_KEY = "6637f47721e2d233" AMBIENT_URL = f"http://ambidata.io/api/v2/channels/{AMBIENT_CHANNEL_ID}/data" # UDPソケットの準備 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((UDP_IP, UDP_PORT)) print("受信開始...") while True: try: data, addr =sock.recvfrom(1024) decoded = data.decode("utf-8").strip() print("受信データ:", decoded) values = decoded.split(",") # FlightGearの送信順に合わせてインデックスを調整 groundspeed = float(values[0]) # 速度(ノット) altitude = float(values[1]) # 高度(フィート) heading = float(values[2]) # 方位(度) # 無効な値をチェック if any(map(lambda x: x is None or math.isnan(x), [groundspeed, altitude, heading])): print("無効なデータを検出、送信スキップ") continue print(f"Groundspeed: {groundspeed}, Altitude: {altitude}, Heading: {heading}") # Ambientに送信するデータ payload = { "writeKey": AMBIENT_WRITE_KEY, "d1": groundspeed, "d2": altitude, "d3": heading } headers = {"Content-Type": "application/json"} response = requests.post(AMBIENT_URL, data=json.dumps(payload), headers=headers) if response.status_code == 200: print(" Ambientに送信成功!") else: print(f" 送信失敗: {response.status_code} - {response.text}") time.sleep(1) # 送信間隔を1秒に調整 except Exception as e: print("エラー:", e) time.sleep(2) # エラー時は少し待って再試行 |
|
実行は、CMD(コマンドプロンプト)で以下の通り入力して行います。
| C:/Users/自分のフォルダ名>python fg_ambient.py |
|
・起動オプション
FlightGearの起動オプションでfgdata.xmlの読み込を指定します。
実行は、CMD(コマンドプロンプト)で以下の通り入力して行います。pathや飛行機、空港は例です。
| C:/Users/自分のフォルダ名〉"C:\Program Files\FlightGear 2024.1\bin\fgfs.exe" --fg-root="C:/Users/自分のフォルダ名/FlightGear/Downloads/fgdata_2024_1" --fg-aircraft="C:/Users/自分のフォルダ名/FlightGear/Custom Aircraft" --aircraft=F1M2 --airport=RJBB --runway=24L --generic=socket,out,0.1,127.0.0.1,5501,udp,fgdata |
|
下の画像は、パイソンプログラムfg_ambient.pyを実行したCMD画面です。FlightGearで飛行中のデータが表示されています。

↑Pythonプログラムfg_ambient.pyを実行したCMD画面 飛行中の速度、高度、方位の値が流れています