利用XPlaneConnect從X-Plane內讀寫數據
X-Plane
X-Plane面向個人的比較流行的飛行模擬軟件之一,用戶可以利用其自帶的工具或者第三方插件來做一些飛行仿真方面的二次開發,比如飛機位置姿態等數據輸出、外部程序控制飛機舵面角度、飛機機模(系統仿真、氣動仿真)開發、機場地景開發等等。
X-Plane官網:https://www.x-plane.com/
X-Plane SDK文檔:https://developer.x-plane.com/sdk/
XPlaneConnect
XPlaneConnect是NASA開源的一個基于X-Plane SDK開發的開源研究工具,其中包含了兩個部分,一個是X-Plane的插件XPlaneConnect.xpl,這個插件需要手動放在X-Plane的安裝目錄內,X-Plane啟動時會調用該插件;一個是與XPlaneConnect.xpl進行UDP通信的庫,包括C、JAVA、MATLAB、Python等編程語言,并且提供了許多例程。用戶可以基于XPlaneConnect快速進行二次開發,包括數據讀寫、飛行暫停/恢復、設置飛機位置和姿態等等。
XPlaneConnect:https://github.com/nasa/XPlaneConnect
開發步驟(C/C++)
- 在https://github.com/nasa/XPlaneConnect 下載XPlaneConnect插件和源代碼。
- 將XPlaneConnect.zip插件解壓并復制到X-Plane安裝目錄下的/Resources/plugins/目錄,然后打開X-Plane。
- 創建一個C/C++工程,將XPlaneConnect-1.3-rc6.zip解壓,將XPlaneConnect-1.3-rc6/C/src內的xplaneConnect.c和xplaneConnect.h這兩個文件復制到C/C++工程目錄。
- 利用xplaneConnect的openUDP函數新建一個udp通信。
- 利用xplaneConnect內的getPOSI、sendPOSI、getCTRL、sendPOSI、getDREF和sendDREF等函數與X-Plane進行數據讀取或寫入;利用sendCOMM可以向X-Plane發送指令(類似于快捷鍵)。





代碼示例
#include <iostream>
#include "xplaneConnect.h"
int main(int argc, char* argv[])
{
//利用xplaneConnect自帶的openUDP函數新建一個udp通信
XPCSocket client = openUDP("127.0.0.1");//"127.0.0.1"為XPlane所在電腦的ip
const int aircraftNum = 0;//X-Plane當前用戶飛機為0,其他編號為AI飛機
while (1)
{
//利用getPOSI獲取飛機位置、姿態和起落架狀態,由于經緯度數據需要較高的數據精度,因此需要用double類型
//利用sendPOSI可以實現飛機位置、姿態和起落架狀態的控制
//[Lat, Lon, Alt, Pitch, Roll, Yaw, Gear]
double posi[7];
int result = getPOSI(client, posi, aircraftNum);
if (result < 0) // Error in getPOSI
{
break;
}
//利用getCTRL獲取飛機的升降舵、副翼、方向舵、油門桿、起落架、襟翼以及擾流板數據
//利用sendCTRL可以實現飛機升降舵、副翼、方向舵、油門桿、起落架、襟翼以及擾流板的控制
//[Elevator, Aileron, Rudder, Throttle, Gear, Flaps, Speed Brakes]
float ctrl[7];
result = getCTRL(client, ctrl, aircraftNum);
if (result < 0) // Error in getCTRL
{
break;
}
//設置X-Plane飛行仿真暫停/恢復
result = sendCOMM(client, "sim/operation/pause_toggle");
if (result < 0) // Error in sendCOMM
{
break;
}
//利用getDREF獲取X-Plane飛行仿真是否暫停的狀態
float simPaused[1] = { 0.0f }; //用于存放"sim/time/paused"的狀態
int drefArraySizze = 1; //"sim/time/paused"接口的數組大小,該接口不是數組則為1
result = getDREF(client, "sim/time/paused", simPaused, &drefArraySizze);
if (result < 0) // Error in getDREF
{
break;
}
//設置X-Plane內的時間(祖魯時間,協調世界時)
//sim/time/zulu_time_sec
float zuluTime = 9 * 60 * 60;//設置為早上9點(如果要設置本地時間,需要添加時差)
result = sendDREF(client, "sim/time/zulu_time_sec", &zuluTime, 1);
if (result < 0) // Error in sendDREF
{
break;
}
printf("Loc: (%4f, %4f, %4f) Aileron:%2f Elevator:%2f Rudder:%2f\n",
posi[0], posi[1], posi[2], ctrl[1], ctrl[0], ctrl[2]);
Sleep(100);
}
}
數組類型數據讀寫:
//設置X-Plane各風層風向
float windDir[13] = {0.0f};
result = sendDREF(client, "sim/weather/region/wind_speed_msc", windDir, 13);
if (result < 0) // Error in sendDREF
{
break;
}

接口列表
X-Plane 指令列表(Command): https://siminnovations.com/xplane/command/index.php
X-Plane 數據讀寫接口(Datarefs): https://developer.x-plane.com/datarefs/#search-form



浙公網安備 33010602011771號