向小梅,聶林波
(1. 91388 部隊(duì),廣東湛江 524022; 2.南海艦隊(duì)海洋水文氣象中心,廣東湛江 524001)
UUV(水下無人航行器)主要通信手段為水聲通信。UUV 多數(shù)時(shí)間在水面以下,無法進(jìn)行無線電通信,一旦UUV浮出水面,就可以利用衛(wèi)星進(jìn)行無線電通信。我國自主研發(fā)的北斗衛(wèi)星導(dǎo)航系統(tǒng)可以提供定位和短報(bào)文通信功能。UUV 的遙控指揮可以借助北斗導(dǎo)航系統(tǒng)實(shí)現(xiàn)。這樣的優(yōu)點(diǎn)是能在更遠(yuǎn)海域進(jìn)行UUV 的定位和控制,同時(shí)降低了系統(tǒng)設(shè)計(jì)和維護(hù)成本,系統(tǒng)更加穩(wěn)定可靠。
北斗衛(wèi)星導(dǎo)航系統(tǒng)是我國獨(dú)立研制的集測量技術(shù)、定位技術(shù)、數(shù)字通信和擴(kuò)頻技術(shù)為一體的全天候區(qū)域性有源三維衛(wèi)星導(dǎo)航、定位、通信系統(tǒng)[1-4]。它是除美國的GPS 俄羅斯的GLONASS 之后第三個(gè)成熟的衛(wèi)星導(dǎo)航系統(tǒng)。該系統(tǒng)于2000年初步建成,2003年實(shí)現(xiàn)了全網(wǎng)運(yùn)營,主要用于國家經(jīng)濟(jì)建設(shè),為我國的交通運(yùn)輸、氣象、石油、海洋、森林防火、災(zāi)害預(yù)報(bào)、通信、公安以及其他特殊行業(yè)提供高效的導(dǎo)航定位及通信服務(wù)。北斗衛(wèi)星系統(tǒng)由四顆北斗衛(wèi)星(兩顆備用)、地面控制中心和北斗用戶終端三部分組成,具有快速定位、雙向短報(bào)文通信和精密授時(shí)服務(wù),其覆蓋范圍是北緯5° ~55°,東經(jīng)70° ~140°,上大下小,最寬處在北緯35°左右,覆蓋我國的全部國土,以及印度洋和太平洋相當(dāng)廣闊的一部分。在定位方面,該系統(tǒng)能快速定位用戶地理位置,為用戶及主管部門提供導(dǎo)航;水平定位精度100 m,差分定位精度小于20 m;定位響應(yīng)時(shí)間:1 類用戶5 s,2 類用戶2 s;3 類用戶3 s,簡短定位更新時(shí)間小于1 s,一次性定位成功率95%。在通信方面,北斗系統(tǒng)專門開發(fā)出軍用通信頻段,以支持廣大軍隊(duì)用戶使用,最多一次可傳輸120 個(gè)漢字,可以實(shí)現(xiàn)用戶與用戶、用戶與地面控制中心之間通信[5-8]。
UUV 處于水面工作狀態(tài)時(shí)接收北斗導(dǎo)航衛(wèi)星傳輸?shù)臄?shù)據(jù),UUV 的遙控指令處理模塊按照遙控協(xié)議對(duì)數(shù)據(jù)進(jìn)行處理,提取指令信息,將指令發(fā)給UUV 航行控制模塊,UUV 航行控制模塊按照指令執(zhí)行動(dòng)作,實(shí)現(xiàn)UUV 的運(yùn)動(dòng)控制;UUV航行控制模塊將自身狀態(tài)信息反饋給狀態(tài)報(bào)告模塊,狀態(tài)信息按照遙控協(xié)議編碼后經(jīng)北斗通信模塊發(fā)送給主控端。主控端接收UUV 經(jīng)北斗導(dǎo)航衛(wèi)星傳輸?shù)臄?shù)據(jù),按照遙控協(xié)議處理數(shù)據(jù),提取UUV 狀態(tài)信息,UUV 控制決策模塊根據(jù)UUV 的信息制定下一步控制指令。整個(gè)系統(tǒng)的控制流程如圖1 所示。
圖1 基于北斗導(dǎo)航系統(tǒng)的UUV 遙控系統(tǒng)控制流程
系統(tǒng)軟件由主控端和被控端兩部分組成。主控端發(fā)送控制指令給被控端,接收被控端傳回的應(yīng)答信息,根據(jù)返回的信息發(fā)送后續(xù)指令; 被控端接收主控端的控制指令,根據(jù)指令執(zhí)行相應(yīng)的動(dòng)作,向主控端發(fā)送自身狀態(tài)信息,向主控端報(bào)告指令執(zhí)行情況。主控端能實(shí)時(shí)顯示UUV 的狀態(tài)信息、位置信息、指令執(zhí)行情況。主控端利用電子海圖實(shí)現(xiàn)圖形化顯示和指揮。當(dāng)UUV 在水面工作時(shí),北斗通信模塊啟動(dòng),將UUV 傳感器采集環(huán)境數(shù)據(jù)和UUV 自身工作狀況按照遙控協(xié)議預(yù)先設(shè)定的格式經(jīng)北斗導(dǎo)航衛(wèi)星傳輸?shù)街骺囟?。主控端將UUV 的當(dāng)前位置、狀態(tài)和軌跡等信息以圖形化的方式現(xiàn)在電子海圖上。主控端根據(jù)UUV 的狀態(tài)信息自動(dòng)或由人工判別并下發(fā)后續(xù)控制指令,控制UUV 的動(dòng)作、姿態(tài)、運(yùn)動(dòng)方向和移動(dòng)距離等。主控端顯示軟件基于電子海圖平臺(tái)。電子海圖用來實(shí)時(shí)顯示UUV 狀態(tài)信息,記錄UUV 的航行軌跡。主控端可以控制多批UUV,向每個(gè)UUV 發(fā)出不同指令,控制UUV 的運(yùn)動(dòng)。主控端也可以對(duì)UUV 進(jìn)行編組,實(shí)現(xiàn)同一組UUV 一致動(dòng)作。
UUV 遙控系統(tǒng)可由一個(gè)主控端和多個(gè)被控端通過北斗導(dǎo)航衛(wèi)星系統(tǒng)互連而成。要使整個(gè)遙控系統(tǒng)有條不紊地工作,就要求每個(gè)終端必須遵守一些事先約定好的有關(guān)數(shù)據(jù)格式及時(shí)序等的規(guī)則。這些為實(shí)現(xiàn)遙控而建立的規(guī)則、約定就是遙控協(xié)議。遙控協(xié)議由3 個(gè)要素[9]組成: 語法、語義和時(shí)序。語法即控制指令和狀態(tài)信息的結(jié)構(gòu)或格式;語義即需要發(fā)出何種控制指令,完成何種動(dòng)作以及做出何種響應(yīng); 時(shí)序即遙控過程實(shí)現(xiàn)順序的詳細(xì)說明。
一套功能完善的遙控協(xié)議能確保系統(tǒng)可靠地實(shí)現(xiàn)對(duì)UUV 的控制功能。遙控協(xié)議需要解決的問題:一是對(duì)指令集進(jìn)行規(guī)范說明,確保指令的完備性滿足UUV 控制需要。指令集大致分為動(dòng)作指令、狀態(tài)反饋指令、定位指令、時(shí)間統(tǒng)一指令。二是需要對(duì)指令和信息的格式進(jìn)行規(guī)范說明,確保雙方能正確理解指令和信息。三是需要包含時(shí)間統(tǒng)一機(jī)制和指令延遲處理機(jī)制,需要解決信息傳輸時(shí)間延遲對(duì)UUV 控制的精度影響和信息受干擾丟失對(duì)UUV 控制的影響等問題。
根據(jù)遙控系統(tǒng)的功能需求,遙控軟件主要用到GIS 技術(shù)、串口通信技術(shù)和多線程技術(shù)。
系統(tǒng)基于GIS 平臺(tái),能實(shí)現(xiàn)地圖顯示、計(jì)算和分析等功能。本系統(tǒng)采用TopMap ActiveX 作為GIS 平臺(tái)。TopMap ActiveX 是組件式地理信息系統(tǒng)開發(fā)平臺(tái),產(chǎn)品包括TopMap ActiveX 主控件、全圖瀏覽定位的鳥瞰圖控件、屬性列表編輯控件、地圖圖層列表及管理控件等,適用于單機(jī)及局域網(wǎng)、客戶端/服務(wù)器模式的地理信息系統(tǒng)應(yīng)用開發(fā)。在面向?qū)ο蟮目梢暬幊陶Z言(如VB、VB.NET、C#、VC 等)中插入TopMap ActiveX 組件,就可實(shí)現(xiàn)地理信息系統(tǒng)功能[10]。
安裝完TopMap ActiveX 后,即可在Visual Studio2010 創(chuàng)建的項(xiàng)目中引入TopMap ActiveX 組件。在Visual Studio2010的開發(fā)界面里選擇工具箱/組件,在空白處右鍵,選擇“選擇項(xiàng)…”。選擇COM 組件下的TopMap ActiveX GIS Control Module V6。在工具箱的組件下就會(huì)出現(xiàn)TopMap ActiveX GIS Control Module V6。鼠標(biāo)選中TopMap ActiveX GIS Control Module V6,在窗體中按下左鍵拖動(dòng)鼠標(biāo)繪制大小合適的矩形,松開左鍵,就在窗體中添加了TopMap 地圖組件。
加載地圖用下面的代碼實(shí)現(xiàn):
TGMAPX1.MapLoad("d: mapsMap06.TGF");
顯示地圖:
TGMAPX1.DrawMapFull();
設(shè)置某個(gè)圖層為動(dòng)態(tài)圖層后,由于動(dòng)態(tài)圖層提供了繪制圖層(DrawMapDynamic)的方法,而不需要重新繪制整個(gè)地圖,所以加快了地動(dòng)態(tài)圖層刷新圖的繪制速度。對(duì)某個(gè)圖層進(jìn)行了實(shí)體添加操作時(shí),在添加實(shí)體的同時(shí)會(huì)在地圖上看到添加的實(shí)體,而這時(shí)顯示范圍是不會(huì)發(fā)生變化的,在這種情況下,就可以采用刷新動(dòng)態(tài)圖層的繪制方法。除添加實(shí)體外,實(shí)體移動(dòng)、實(shí)體閃爍等等都可以采用動(dòng)態(tài)圖層方法。地圖視野范圍發(fā)生改變,如放大,縮小等整個(gè)地圖視野發(fā)生改變,在這種情況下不可以采用動(dòng)態(tài)圖層刷新。
TGMAPX1. LayerSet (0,TGMAPXLib. emLayerFlag. ETGLayerIsDynamic,True);
TGMAPX1.DrawMapDynamic();
用TGOFeatureSymbol 繪制UUV 目標(biāo)(點(diǎn)實(shí)體對(duì)象)。
TGOFeatureSymbol pFeatureSymbol = new TGOFeatureSymbolClass();
TGORecordSet RecordSet=new TGORecordSetClass();
//設(shè)置點(diǎn)實(shí)體樣式
pFeatureSymbol.SymStyle.ForeColor.R=125;
pFeatureSymbol.SymStyle.ForeColor.G=240;
pFeatureSymbol.SymStyle.ForeColor.B=255;
pFeatureSymbol.SymStyle.Lib=0;
pFeatureSymbol.SymStyle.index=4;
pFeatureSymbol.Symbol.x=lon;
pFeatureSymbol.Symbol.y=lat;
RecordSet.AddNew();
RecordSet.feature=pFeatureSymbol;
RecordSet.Close();
TMAPX1.DrawMapFull();
用TGOFeaturePolyline 繪制UUV 航線軌跡。
TGOFeaturePolyline pFeaturePolyline = new TGOFeature-PolylineClass ();
TGOPoints pts =new TGOPointsClass();
TGOPoint pt=new TGOPointClass ();
pt.x =lon1;
pt.y = lat1;
pts.Add(-1,pt);
pt.x =lon2;
pt.y = lat2;
pts.Add(-1,pt);
//把點(diǎn)序列添加到線
pFeaturePolyline.polyline.parts.Add(-1,pts);
RecordSet.AddNew();
RecordSet.feature=pFeaturePolyline;
RecordSet.Close();
TMAPX1.DrawMapFull();
在該系統(tǒng)中采用TopMap ActiveX 組件實(shí)現(xiàn)各種GIS 功能包括UUV 定位、航跡顯示、距離計(jì)算、速度推算、位置推算等功能。
計(jì)算機(jī)通過串口與北斗終端連接。指令和數(shù)據(jù)均通過串口來傳輸。Visual Studio2010 中的命名空間System. IO.Prots 提供了SerialPort 類來實(shí)現(xiàn)對(duì)串口的訪問。SerialPort 類支持同步I/O 和事件驅(qū)動(dòng)I/O。
使用該類需要先引用:using System.IO.Ports;
創(chuàng)建串口對(duì)象:mserialPort = new SerialPort();
設(shè)置串口屬性值:
mserialPort.PortName =“com1”;
mserialPort.BaudRate = 9 600;
mserialPort.Parity = Parity.None;
mserialPort.DataBits = 8;
mserialPort.StopBits =StopBits.One;
mserialPort.Handshake = Handshake.None;
設(shè)置串口讀寫超時(shí)值:
mserialPort.ReadTimeout = 500;
mserialPort.WriteTimeout = 500;
打開串口:mserialPort.Open();
獲取當(dāng)前計(jì)算機(jī)的串口名稱數(shù)組:
mserialPort.GetPortNames();
讀寫串口:mserialPort.read(),mserialPort.write()
系統(tǒng)要具有多任務(wù)、多線程和實(shí)時(shí)監(jiān)控功能。C#能很好實(shí)現(xiàn)多任務(wù)和多線程編程。C#能實(shí)現(xiàn)操作系統(tǒng)級(jí)別的實(shí)現(xiàn)數(shù)據(jù)監(jiān)測功能,提供了較高的實(shí)時(shí)性。
在C#中system.threading 命名空間提供了進(jìn)行多線程編程的類和接口。常用的實(shí)現(xiàn)多線程方法有thread、threadpool和timer。另外C#中的backgroundworker 組件提供了最簡單的一種多線程解決方法[11]。
Thread 的用法如下所示:
priority 指定一個(gè)線程相對(duì)于另一個(gè)線程的相對(duì)優(yōu)先級(jí)。ThreadState 定義線程組所有可能的執(zhí)行狀態(tài)。一旦線程被創(chuàng)建,它就至少處于其中一個(gè)狀態(tài)中,直到終止。
threadpool 方法相對(duì)thread 較簡單,它適應(yīng)于一些需要多個(gè)線程而又較短任務(wù),它的缺點(diǎn)是對(duì)創(chuàng)建的線程不能加以控制,也不能設(shè)置其優(yōu)先級(jí)。threadpool.queueuserworkitem(new WaitCallback(ThreadProc))將方法排入隊(duì)列等待線程池線程變得可用時(shí)執(zhí)行。
timer 以指定的時(shí)間間隔執(zhí)行方法。使用TimerCallback委托指定Timer 執(zhí)行的方法。計(jì)時(shí)器委托在構(gòu)造計(jì)時(shí)器時(shí)指定,并且不能更改。此方法不在創(chuàng)建計(jì)時(shí)器的線程上執(zhí)行,而是在系統(tǒng)提供的threapool 線程上執(zhí)行。構(gòu)造計(jì)時(shí)器時(shí)可以指定在第一次執(zhí)行方法之前等待的時(shí)間以及此后的執(zhí)行期間等待的時(shí)間。Change 方法用于更改這些值或禁用計(jì)時(shí)器。
C#中的backgroundworker 組件提供了最簡單的一種多線程解決方法[11]。該組件在應(yīng)用程序的界面線程的后臺(tái)執(zhí)行耗時(shí)的操作。上傳和下載、訪問數(shù)據(jù)庫、讀寫磁盤文件等需要很長執(zhí)行時(shí)間的操作可能導(dǎo)致用戶界面在操作運(yùn)行時(shí)無法響應(yīng)。BackgroundWorker 組件可以解決這些問題。使用BackgroundWorker 組件,先定義要在后臺(tái)執(zhí)行的輔助方法,然后調(diào)用RunWorkerAsync 方法。在輔助方法以異步方式運(yùn)行的同時(shí),界面線程繼續(xù)正常運(yùn)行。該方法運(yùn)行完畢,BackgroundWorker 激發(fā)RunWorkerCompleted 事件向調(diào)用線程發(fā)出警報(bào)。
BackgroundWorker 類的DoWork 事件處理程序采用一個(gè)DoWorkEventArgs 參數(shù),該參數(shù)具有Argument 屬性。此屬性接收來自RunWorkerAsync 的參數(shù),并可以傳遞至DoWork 事件處理程序中調(diào)用的輔助方法。
C#中的FileSystemWatcher 組件提供對(duì)文件的實(shí)時(shí)監(jiān)控[11]。使用FileSystemWatcher 監(jiān)視指定目錄中的更改??杀O(jiān)視指定目錄中的文件或子目錄的更改??梢詣?chuàng)建一個(gè)組件來監(jiān)視本地計(jì)算機(jī)、網(wǎng)絡(luò)驅(qū)動(dòng)器或遠(yuǎn)程計(jì)算機(jī)上的文件。Filter 屬性設(shè)置為空字符串("")或使用通配符(“* .* ”)可以監(jiān)視所有文件中的更改,將Filte 屬性設(shè)置為某個(gè)文件名即可監(jiān)視該文件。將Filter 屬性設(shè)置為“* .txt”即可監(jiān)視特定類型文件中的更改。監(jiān)視文件或目錄的Attributes、Last-Write日期和時(shí)間或Size 方面的更改可通過將NotifyFilter 屬性設(shè)置為NotifyFilters 枚舉中的某個(gè)或某一組值來實(shí)現(xiàn)。Windows 操作系統(tǒng)在FileSystemWatcher 創(chuàng)建的緩沖區(qū)中通知組件文件發(fā)生更改。如果短時(shí)間內(nèi)有很多更改,則緩沖區(qū)可能會(huì)溢出。這將導(dǎo)致組件失去對(duì)目錄更改的跟蹤。為防止緩沖區(qū)溢出,可使用FileSystemWatcher. NotifyFilter 和File-SystemWatcher.IncludeSubdirectories 屬性篩選掉不想要的更改通知。也可以通過FileSystemWatcher. InternalBufferSize 屬性增加內(nèi)部緩沖區(qū)的大小。但緩沖區(qū)來自無法換出到磁盤的非頁面內(nèi)存,增加緩沖區(qū)大小的成本較大,所以將緩沖區(qū)保持大小適中,以便不會(huì)丟失任何文件更改事件。
在該系統(tǒng)的設(shè)計(jì)中采用backgroundworker 組件實(shí)現(xiàn)對(duì)UUV 的指令發(fā)送、位置推算等操作,采用FileSystemWatcher組件實(shí)現(xiàn)UUV 回傳數(shù)據(jù)的監(jiān)測和處理操作,采用thread 類實(shí)現(xiàn)多批UUV 目標(biāo)的定位和通信。
基于“北斗”導(dǎo)航系統(tǒng)的UUV 遙控系統(tǒng)為UUV 管理控制功能國產(chǎn)化提供了一個(gè)新的發(fā)展方向。由于UUV 遙控系統(tǒng)依托北斗導(dǎo)航系統(tǒng)實(shí)現(xiàn)控制指令和感知信息的傳遞和協(xié)同,既可迅速確定UUV 位置信息,又可遠(yuǎn)程傳遞各種控制指令和UUV 探測的信息以及UUV 自身狀態(tài)數(shù)據(jù),極大地增強(qiáng)了地面指揮中心對(duì)UUV 的遙控能力并拓展了UUV 的活動(dòng)范圍。
[1]徐常凱,郭瑞勇,郭軍.基于北斗衛(wèi)星的軍事物流通信系統(tǒng)研究[J].物流技術(shù),2009,28(9):147-149.
[2]江彩英,黃永玉,謝丹,等.北斗衛(wèi)星應(yīng)急通信傳輸試點(diǎn)建設(shè)[J].氣象科技,2013,41(5):857-860.
[3]龐佑軍.基于北斗衛(wèi)星導(dǎo)航的搜救系統(tǒng)原理與構(gòu)型[J].航空電子技術(shù),2013(4):7-8.
[4]唐金元,于潞,王思臣.北斗衛(wèi)星導(dǎo)航定位系統(tǒng)應(yīng)用現(xiàn)狀分析[J].全球定位系統(tǒng),2008(2):26-27.
[5]于天澤.北斗衛(wèi)星導(dǎo)航定位技術(shù)在我國鐵路應(yīng)用探討[J].中國鐵路,2013(4):4-5.
[6]吳才聰,蘇懷洪,褚天行,等.基于北斗的移動(dòng)應(yīng)急監(jiān)控與指揮技術(shù)[J].數(shù)字通信世界,2011(12):60-61.
[7]李經(jīng).基于AIS 的艦艇編隊(duì)避碰技術(shù)研究[J].艦船電子工程,2010(8):69-70.
[8]于光峰.船載AIS 信息采集與解碼技術(shù)研究[J].電子技術(shù)與軟件工程,2013(21):91-92.
[9]Andrew S.Tanenbaum.Computer networks[M].北京:清華大學(xué)出版社,2001:17-20.
[10]北京慧圖信息科技有限公司.TopMap ActiveX 開發(fā)幫助[EB/OL].http://www.topmap.com.cn,2011.
[11]Microsoft.Microsoft Help Library[EB/OL],http://www.microsoft.com/zh-cn/download/developer-tools.aspx,2010.