權(quán)聰
(國營長虹機械廠,廣西 桂林 541003)
近年來,無人機的應用與研究受到了廣泛的關注,成為各大國之間競爭的主要領域。地面站軟件作為無人機遠程控制的核心關鍵組成部分,無人機控制人員通過地面站系統(tǒng)提供的地面站軟件與無人機進行交互。操作人員在無人機飛行任務開始前提前規(guī)劃好飛行航線,地面站實時監(jiān)控無人機的飛行狀況,并通過實時修改任務改變無人機的飛行航線,在無人機完成飛行任務后,對飛行存儲的數(shù)據(jù)進行回放分析。航路規(guī)劃與航線操作功能作為地面站軟件的核心組成部分,起到了重要作用。無人機在每次飛行任務前,都需提前進行本次飛行任務的航路規(guī)劃,航點對應著無人機本次飛行經(jīng)過的位置,在設置飛行航點時,需要設置無人機飛行器所具有的速度、位置、航向信息等數(shù)據(jù),多個有序航路點組成了一條飛行航線。規(guī)劃好航線后,將該航線裝訂并通過網(wǎng)口發(fā)送飛控計算機,無人機就會按照規(guī)劃好的航線完成本次飛行任務的各項飛行動作,依次按序飛過各航點執(zhí)行飛行任務。
航路規(guī)劃在無人機導航中起到了至關重要的作用,無人機航路規(guī)劃時,根據(jù)任務的預設目標規(guī)劃好本次飛行任務的軌跡。航線由多個有序的航點組成,規(guī)劃好的航點和航線擬合成航跡在地圖上直觀顯示,航點、航線數(shù)據(jù)保存在文本中,方便執(zhí)行下次飛行任務時調(diào)用。
(1)航點信息管理。航點信息的增加、刪除、插入(鼠標點擊在列表控件某行點上,點擊插入行點,會插入該行點之后)、航點信息的保存和加載功能。
在軟件界面上,將所有航點信息顯示在一個ListContral 列表控件中,該列表的每個數(shù)據(jù)對應一個規(guī)劃好的航點,每一列對應該航路點的經(jīng)緯度、航點序號、速度和高度設定值、狀態(tài)字等信息,起始位置信息下方有航點添加、航點刪除、航點插入、航路點信息保存和航路點信息加載等按鈕,如圖1 所示。
圖1 軟件整體界面圖
(2)地圖數(shù)據(jù)到列表數(shù)據(jù)的交互功能。切換街道地圖和衛(wèi)星混合地圖、航點的拖拽(航點坐標更新到列表)、地圖的縮放、地圖的移動,航點坐標信息的顯示等基本地圖功能等;地圖切換為衛(wèi)星圖,如圖2 所示。
圖2 地圖切換衛(wèi)星圖
(3)列表數(shù)據(jù)到地圖的交互功能。修改列表數(shù)據(jù)信息,點擊更新按鈕,地圖數(shù)據(jù)也會隨著列表數(shù)據(jù)的更改而更新。
(4)條件插入航點功能。根據(jù)已知基準點的航向角、距離插入新的航點(可以插入基準點后,也可以插入最后);已航點3 為基準,航向角180°,距離100000m處插入航點4,效果如圖3 所示。
(5)地圖測距功能。測量航點之間的距離和測量整個航路的距離,效果如圖4 所示。
(6)航線選擇功能。航線為直線或者曲線,效果如圖5 所示。
圖5 航線曲線選擇功能
(7)清除所有航點功能。清除地圖上的所有數(shù)據(jù)和列表控件上的所有數(shù)據(jù)。
(8)航路點信息的管理與保存。為了后續(xù)任務的航路點的加載,將設置的航點保存在文本中,把航路點信息保存在數(shù)據(jù)庫中,每次對航路點進行操作都將同時更新數(shù)據(jù)庫中數(shù)據(jù)表的記錄,數(shù)據(jù)庫航點存儲表的結(jié)構(gòu)如表1 所示。
表1 PathPointTable 表
航點信息存儲:讀取Listcontral 列表數(shù)據(jù),并把列表數(shù)據(jù)進行文件存儲,保存成.log 文件,并按時間命名,如圖6 所示。
圖6 航點信息存儲效果圖
(9)規(guī)劃好的航線在地圖上的標示。規(guī)劃好一條航線后,載入地圖,鼠標點擊地圖就會設置一個航點,多個航路點繪制出無人機飛行航線的軌跡,用Element標注航點,用直線或弧線將航路點連接起來,形成的Line 曲線表示航線,如圖7 所示。
圖7 航線表示
(10)大數(shù)據(jù)量的航點加載功能:選擇航路文件,加載已保存的航點信息,并顯示在地圖上,如圖8 所示。
圖8 航點文件加載功能
本地面站系統(tǒng)的開發(fā)使用集成開發(fā)環(huán)境是微軟公司的Visual Studio2010,系統(tǒng)軟件運行在Win7 及其以上操作系統(tǒng)?;谛阅芊矫婵紤],采用基于MFC 應用程序框架,地圖部分的實現(xiàn)是基于百度的離線地圖,這是百度公司為了方便地理信息系統(tǒng)的二次開發(fā)而設計的一款功能非常強大的GIS 開發(fā)包。
電子導航地圖為現(xiàn)代無人機的飛行提供導航服務,無人機飛行過程中使用電子導航地圖顯示導航軌跡。依據(jù)無人機下發(fā)狀態(tài)數(shù)據(jù)包中包含GPS、北斗等衛(wèi)星導航提供的經(jīng)緯度信息,實時地在地圖上標注無人機當前準確位置和航向,在無人機導航中起到了至關重要的作用。
由于航路規(guī)劃需要在地圖上實時標注飛行器的位置、航向、規(guī)劃好的航路和實際的歷史軌跡等信息,地面站軟件需要實現(xiàn)地圖導航的基本功能。本子系統(tǒng)的實現(xiàn)使用了百度公司的產(chǎn)品,基于百度地圖開發(fā)工具包的二次開發(fā),百度Map 作為一組嵌入式腳本語言可以跨平臺使用,它是百度地圖軟件產(chǎn)品的底層模塊,可以用來構(gòu)建GIS 和桌面地圖應用程序,或是在原有的地圖軟件上增加新的功能。
(1)將百度地圖的JS 文件本地化并與服務器進行交互。將百度map 加載時需要的JS 文件下載到本地終端,在后續(xù)應用程序開發(fā)時,不需引用百度網(wǎng)站上的JS 文件,只需調(diào)用本地的JS 文件。調(diào)用百度map API時,需要使用百度map JS 文件,百度提供了本地化JS map3.0.js 文件,可在百度官網(wǎng)上進行下載。
(2)將百度 map 的地圖數(shù)據(jù)(tiles:瓦片)下載到本地以及應用的開發(fā)。提到地圖數(shù)據(jù),首先需要了解百度 map 的基礎知識。百度將瀏覽器中顯示的導航地圖,分割成一張一張圖片,起名為tile,為了能夠瀏覽顯示的百度地圖,需從百度官方網(wǎng)站下載所有tile,然后將這些tile 拼接在一起,就能夠展示出一張完整的百度地圖。地圖每一個tile 都是大小為256×256 的PNG 或jpg 圖片,因為百度地圖存在級別為0 ~19 縮放功能,因此在每個縮放級別中,地圖的顯示區(qū)域被劃分為多個tile 圖片,每個tile 圖片會根據(jù)百度站點下載對應的地圖數(shù)據(jù),地圖數(shù)據(jù)其實是一張張PNG 或JPG 圖片,在百度地圖請求獲取tile 圖片數(shù)據(jù)時,將三個重要的參數(shù)傳遞給地圖,分別為地圖x 坐標數(shù)據(jù)、y 坐標數(shù)據(jù)及當前顯示的地圖的縮放級別。
(3)MFC 調(diào)用百度離線地圖。VS2010 中添加web browsers(Active X 微軟操作系統(tǒng)自帶)控件,為控件增加成員變量m_web,在初始化的程序中調(diào)用以下代碼加載百度地圖。
百度離線地圖的html 網(wǎng)頁實現(xiàn)(在工程文件下的map_LINE.html 和map_CURVE.html 中)具體實現(xiàn)要調(diào)用百度地圖API 函數(shù)。
(4)MFC 界面到地圖的數(shù)據(jù)交互(VC 與JavaScript 交互)。在VC 中調(diào)用WebBrowser 時,有2 種方法可以調(diào)用。MFC 中存在一個CHtmlView 類對WebBrowser 進行封裝,調(diào)用方便快捷。CHtmlView 類是由CView 派生而來,在MFC 中被稱作視圖類,CView 類是由CWnd 派生而來,將其應用在對話框類中,不存在使用兼容性問題,只需修改一小部分內(nèi)容即可。其中特別需要注意的以下兩個問題:
CHtmlView 類的構(gòu)造函數(shù)是protected 的,因此在程序中不允許直接構(gòu)造一個CHtmlView 類對象。必須在CHtmlView 類上進行派生后才能構(gòu)造。如果將創(chuàng)建CHtmlView 類對象應用到棧上,必需重新調(diào)用PostNcDestroy( ),該函數(shù)體內(nèi)容為空。因為默認的PostNcDestroy( )函數(shù)會delete( ) this 出錯。如果將創(chuàng)建CHtmlView 類對象應用到堆上,則需要注意防止二次delete。
另一種方法是調(diào)用WebBrowser 的ActiveX 控件,該方法既可以應用在在MFC 項目中,也可以在非MFC 項目中使用,本系統(tǒng)軟件工程使用ActiveX 控件;
需要調(diào)用類CWebPage,將其對應的兩個文件WebPage.h 和WebPage.cpp 添加到工程中;MFC 調(diào)用JS中的函數(shù)AddPoint( ),并傳遞2 個參數(shù)(緯度,經(jīng)度,航點號)。
(5)地圖到MFC 界面的數(shù)據(jù)交互(JavaScript與VC 交互)。一個JavaScript 對象傳到了C++ 這邊以后,就變成了一個IDispatch*,然后我們用CComDispatchDriver 接管這個IDispatch*( ) 后,就可以調(diào)用這個JavaScript 對象的方法,獲取這個JavaScript 對象的屬性,實際上CComDispatchDriver就是對IDispatch( ) 的包裝, 最終都是調(diào)用IDispatch::Invoke( )。同理,如果我們在C++ 這邊構(gòu)造出一個IDispatch* 并傳遞給JavaScript,那么JavaScript 就可以把這個IDispatch* 當作一個JavaScript 對象來使用,自然它就可以調(diào)用這個對象的方法,修改這個對象的屬性,最終就可以實現(xiàn)調(diào)用C++函數(shù),修改C++對象的成員變量,實際上JavaScript調(diào)用C++也是通過IDispatch::Invoke( )來調(diào)用。那么如何構(gòu)造這個IDispatch 就是問題的關鍵點。
這種方法,需要先把IDispatch*( )示例代碼中是this,但因為this 是CPathPlanDlg( ) 的實例,而CPathPlanDlg( )多重繼承于IDispatch( ),實際this 就是IDispatch*傳遞給JavaScript,JavaScript把它保存好,然后調(diào)用。
航路規(guī)劃系統(tǒng)是實現(xiàn)無人機自主飛行和避障導航的關鍵系統(tǒng)。針對航路規(guī)劃系統(tǒng)國內(nèi)外學者進行了數(shù)據(jù)分析,多半是針對控制規(guī)律和系統(tǒng)安性進行研究設計,鮮有人考慮無人機地面站控制系統(tǒng)的人機交互策略。依據(jù)現(xiàn)有的飛行器適航規(guī)范標準歸納總結(jié)航路規(guī)劃軟件系統(tǒng)設計的技術難點,設計了一款無人機航路規(guī)劃軟件,但是系統(tǒng)設計未考慮突發(fā)及極端環(huán)境下無人機規(guī)劃航路規(guī)劃的自適應規(guī)避算法。在后續(xù)的研究中將繼續(xù)完善地面站平臺的功能,實現(xiàn)無人機自主導航的過程監(jiān)測和異常處理,以提高無人機系統(tǒng)的穩(wěn)定性與可靠性。