FlightGearのデータを外部表示させよう | virt_flyのブログ

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

FlightGearで外部表示させた速度・高度・方位データ

↑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で飛行中のデータが表示されています。

 

FlightGearデータ、速度・高度・方位をAmbientに表示

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