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