錢偉

本文介紹了無人機三維顯示需求,介紹了Flightgear軟件的功能和使用特點,建立了無人機數字仿真模型,并基于仿真模型和Flightgear軟件,采用udp網絡通訊協議建立了二者之間的連接,將無人機仿真數據實時傳輸到Flightgear軟件,驅動Flightgear中無人機模型、場景模型等的實時運行,完成無人機的三維實時顯示工作。
無人機在試飛之前需要對各個系統部件進行大量的測試和仿真,以檢測系統的控制部分的極性、邏輯、量值等等,但是有時實驗室測試并不直觀,容易使人忽略重要的細節。例如,某型無人機在地面測試時一切正常,但在起飛后全自主飛行過程中,發生了一加自主飛行功能就向北飛的現象。發生這一現象的原因是程序員在設計航路時,將無人機所用磁航向傳感器的單位弄錯,弧度當成了角度。最終雖然依靠人工手動將其控制返航,依然表明了傳統的測試存在盲區。如果能加入仿真的實時顯示功能,將無人機沿著航路模擬飛行的經緯度高度、速度、姿態角、實時舵面值等,以以無人機三維運動的形式直觀地反映出來,可使系統測試人員直接看到無人機能否完成航路、是否存在問題。Flightgear軟件是一款開源飛行軟件,內部集成了多款飛機模型數據,具有良好的人機界面,容易進行二次開發,并可接收外部傳送過來的飛行動力學數據進行飛行,是無人機全數字仿真和地面測試階段三維顯示的較好選擇。
無人機三維顯示需求
目前我們的無人機無論是進行實驗室仿真或外場飛行試驗,一般都能拿到較為準確、實時性也較強的遙測數據,這些數據包括無人機系統飛行的各種信息,如GPS經緯度、高度等定位信息;無人機俯仰角、滾轉角等姿態角信息;三軸加速度信息、舵面控制量及反饋量信息等等。按照以往經驗,有了這些信息,如需對無人機的飛行性能進行分析,可以對各路信息分別匯總,繪出曲線,即能較直觀地看出參數的數值走向和有無異常等。有時也需要視頻信息,以記錄那些測試數據測試不到的細節,則要另外增加價格昂貴的高清長焦攝像機,但攝像機也存在無法拍到或拍攝不清晰的問題,且有時從成百上千幀視頻圖像中也難以找到有用線索。
Flightgear軟件介紹
自從David于1997年發布了Flightgear軟件第一個跨平臺版本之后,從最初比較粗糙的空氣動力學模型開始,逐漸增加了更多的特性如環境特性、跑道特性、場景特效、屏幕顯示、儀表臺、導航塔臺系統和網絡互聯以及串口互聯等,也支持多機編隊飛行和多人空中對戰模式,更突出的是,此軟件為開源軟件,用戶可以自行定義通訊協議、飛機模型、顯示模式等,可以添加自己繪制的飛機模型進行飛行,動力學模型可采用系統自帶也可自己編寫,并通過matlab-simulink軟件或者其他仿真軟件與Flightgear進行實時交互,驅動飛機模型的飛行。該軟件具有跨平臺、多場景、開放性等特點,擴展性特別強,且對計算機和顯卡的要求不高,一般計算機的集成顯卡即可滿足要求。Flightgear軟件部分特點如下:
飛行動力學模型
Flightgear在3個主要的飛行動力學模型之間選擇,可以添加新的動力學模型,甚至接入外部“專有的”飛行動力學模型:
JSBSim:JSBSim是一個開源飛行動力學模型(FDM)軟件庫,用于對飛行器的飛行動力學進行建模,用C + +編寫。JSBSim可以在獨立模式下批處理運行,飛機模型以XML文件配置,其中包括飛機的質量平衡、空氣動力學、飛行控制屬性、大氣模型等。
YASim:YASim模型使用飛機的幾何形狀來生成基礎飛行特性,可快速構建飛機行為,無需所有傳統的氣動試驗數據,是一種粗略的近似,在得到接近現實的結果之前,需要進行很多調整。如果飛機有可靠的飛行數據,例如風洞數據,或者希望最終生成逼真的模擬,那么JSBSim是更好的方法。但是如果缺乏這樣的數據,又知道飛機的幾何形狀,并且能夠像真正的飛行員那樣訪問相同的飛行特性和極限,那么YASim提供了一種解決方案,這對于大多數仿真需求來說已經足夠了。
UIUC:這個飛行動態模型是基于 LaRCsim,最初是美國國家宇航局寫的。通過使用飛行器配置文件來擴充代碼。.UIUC使用查表法來檢索飛機部件的氣動力和力矩系數,然后用這些系數來計算力和力矩作用在飛機上的總和。
全面而精確的地景風景數據庫
數據庫包含超過20,000個真實地景的世界機場。具有和現實相同的跑道、跑道標志、位置和進近燈光。也適用于較大的機場滑行道(在適當的時候甚至包括綠色中線燈)和傾斜跑道。定向機場照明能成功地改變強度及操作者相對方向變化。
準確和全面的天空模型
Flightgear軟件可以實現精確的時間跟蹤,并基于當前時間正確的放置太陽、月亮相對于當前地球坐標的位置。例如當前時間和地點是黎明的成都,那么太陽、月亮、星星和行星等在天空中都遵循正確的相對位置。這個建模考慮季節性影響,使用24小時制,甚至在北極圈以北,也放置太陽與月球的正確位置,給人以身臨其境的感覺。
靈活和開放的飛機建模系統
Flightgear具有模擬各種飛行器的能力。可以模擬飛行1903年萊特飛行器、“撲翼”飛行器、飛艇、波音747和空客A320飛機,以及各種軍用飛機等,Flightgear具有模擬幾乎一切飛機的能力。Flightgear的飛行環境也很完備,飛機設計師可以打造逼真、具有完美動態效果、完全互動的3D駕駛艙。Flightgear還可以準確模擬許多儀器和系統故障,例如Gps故障、大氣傳感器故障等。如果設置故障,則飛機會根據故障進行相應的動作。
低廉的硬件要求
Flightgear著眼現實仿真等方面的研究,但是軟件本身對電腦硬件的需求并不強。如果你的電腦配置非常好,你會的到更加好的視覺效果,但是如果你的電腦配置一般,雖然視覺效果不會特別好,但是你同樣可以得到一個非常流暢的飛行感受。
內部特征
Flightgear允許用戶和飛機設計師通過內部和外部訪問機制獲取大量的內部狀態變量。這些狀態變量被組織成一個方便的層次“屬性”樹。使用屬性樹可以監視Flightgear內部任何狀態變量。可以從外部腳本遠程控制Flightgear的運行。可以僅通過編輯一個少數人可讀的配置文件來創建模型動畫、音效、動畫工具和網絡協議等任何能想到的情況。這是一個功能強大的系統,使Flightgear更加靈活、可配置、適應性更強。
通訊
通用輸入/輸出選項允許用戶自己定義輸入輸出協議文件,選擇采用串口或網絡客戶端。如果所有實例正在運行在同一幀率,可以得到非常好的互相之間的緊密同步顯示。可以使用FlightGear在局域網進行多機聯網通訊,練習編隊飛行或對戰仿真等。
無人機全數字仿真環境與Udp通訊
無人機全數字仿真
依據無人機風洞數據建立了無人機的數學模型,基于4階龍格庫塔方法對建立的無人機12階微分方程進行解算,基于vsc++2010建立仿真和控制界面,基于Udp實現網絡數據傳輸,實現無人機仿真模型與Flightgear軟件的數據發送。無人機仿真原理如圖1所示,曲線顯示界面如圖2所示,三維顯示界面如圖3所示。
Udp通訊傳輸
Udp通訊屬于tcp/ip通訊協議的一種,支持大數據量的傳輸,比較適合對實時性要求不高強、對數據準確性要求不高但數據量很大的場合。我們的全數字仿真系統所用的三維顯示對實時性要求并不特別強,但是數據量較大,因此采用Udp協議進行通訊傳輸。通信模塊分為客戶端和服務器端,客戶端和服務器端可以部署于同一臺機器,也可以部署到不同的機器上。在網絡中進行通信至少需要一對套接字,其中之一運行于客戶端,稱之為Clientsocket;另一個運行于服務器端,稱之為Serversocket。由于本機只向Flightgear傳送數據,不接收其發回的數據,因此僅編寫客戶端程序即可。
Udp客戶端程序在vc++2010中的設計流程為:
(1) 調用socket()方法創建一個數據報套接字(SOCK_DGRAM);
(2) 獲取無人機的飛行數據,按照數據結構進行編組;
(3) 數據發送至服務器;
(4) 停止仿真時關閉數據報。
基于仿真系統的udp傳輸
軟件部分發送代碼如下:
Socket初始化:
voidctrlDlg::ToFlightgear()
{ //SOCKET初始化
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return; }
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE(wsaData.wVersion ) != 1 ) {
WSACleanup( );
return; }
SOCKET sockClient=socket (AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.255");//
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons (5500);
數據編組:
FGNetDatafgbuf;
fgbuf.version=FG_NET_FDM_VERSION; // increment when data values change
fgbuf.padding=0; // padding
// Positions
fgbuf.longitude=show_y[num_showxy-1]/57.3; // geodetic (radians)
fgbuf.latitude=show_x[num_showxy-1]/57.3; // geodetic (radians)
fgbuf.altitude=-h; // above sea level (meters)
//fgbuf.altitude=300.0; // above sea level (meters)
fgbuf.agl=-h; // above ground level (meters)
fgbuf.phi=(float)phi; // roll (radians)
fgbuf.theta=(float)theta; // pitch (radians)
fgbuf.psi=(float)psi; // yaw or true heading (radians)
...}
數據發送:
sendto(sockClient,(char*)(&fgbuf),length,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
關閉socket:
closesocket(sockClient);
WSACleanup();
數據回放的三維顯示
從上面的介紹可以看出,Flightgear軟件可以通過Udp進行數據驅動。對于仿真時保存的數據或實際飛行過程生成的遙測數據,只要按照相關的通訊協議和相應的時間間隔傳輸到Flightgear,同樣可以驅動Flightgear軟件中飛機的三維顯示,這里不再詳細介紹。
Flightgear軟件的通訊接口設置
Flightgear軟件設置
通訊接口采用Udp協議,在Flightgear軟件上的設置如圖4所示。
其中,flightmodel界面的動力學模型設置為external,意為采用外部傳過來的模型,而不采用軟件自帶的動力學模型;
傳輸協議界面,首先點擊new,新建傳輸協議,然后依次將Protocol設置為nativefdm,Medium設置為socket,Direction設置為in,Hz取5,端口選擇5500,選擇UDP模式。按上述步驟設置完成后,Flightgear軟件就準備就緒。點擊run按鈕進入運行界面,等待外部信息的傳入。
接口協議
Udp協議需要按照一定的數據格式進行傳輸,共28個變量,408個字節長度。典型的傳輸變量見表1。這些變量能夠滿足三維顯示的需求。如需對飛機座艙進行數據顯示,還可以將東向、北向、天向速度、加速度以及三軸角速度等進行傳輸。由于我們的仿真為無人機仿真,不需要座艙顯示,因此速度信息并未傳輸。為了直觀,加入了舵面的顯示,當無人機進行左右轉彎或者爬升以及下滑時,可以清晰地看到舵面的動作。
結論
以往的影像數據多來自于攝像機,雖然攝像機足夠高清,但當飛機飛行速度增加時,無法顯示滿足要求的高清影像,當需要觀看動態實況時,由于缺少相應手段,只能對遙測數據逐個分析,不便于形成整體概念。相比以往外場飛行或飛行后缺少相應的三維影像的情況,仿真和回放數據能提供接近真實狀態的實時影像。因此,從某種程度上來說,本文提供了一種額外的視景手段,通過三維實時軟件,可以直觀地看到飛機運行時的狀態。