強(qiáng)明輝 把翠芳
(1.蘭州理工大學(xué)電氣工程與信息工程學(xué)院 蘭州 730050)(2.甘肅省工業(yè)過(guò)程先進(jìn)控制重點(diǎn)實(shí)驗(yàn)室 蘭州 730050)(3.蘭州理工大學(xué)電氣與控制工程國(guó)家級(jí)實(shí)驗(yàn)教學(xué)示范中心 蘭州 730050)
無(wú)人機(jī)從軍用領(lǐng)域逐漸走向民用以及商用領(lǐng)域[1~2],便捷人們生活的同時(shí),帶來(lái)的社會(huì)安全問(wèn)題[3]也逐漸暴露,尤其是闖入禁飛區(qū)域,引發(fā)“黑飛”、“亂飛”現(xiàn)象,威脅人員或者破壞公共設(shè)備[4]。地理圍欄[5]技術(shù)是一種基于位置服務(wù)[5~6]的新應(yīng)用,早在十多年前就被提出了,是人機(jī)交互服務(wù)類(lèi)型中的一種,目前的應(yīng)用場(chǎng)景多是應(yīng)用程序[7]。地理圍欄技術(shù)在無(wú)人機(jī)中的應(yīng)用是近幾年才被提出的,主要為了防止無(wú)人機(jī)進(jìn)入禁飛區(qū)域,引發(fā)安全事故。國(guó)內(nèi)外對(duì)該技術(shù)在無(wú)人機(jī)的應(yīng)用還在研究階段。2015年10月13日美國(guó)媒體KOED報(bào)道稱(chēng),美國(guó)國(guó)家航空航天局(NASA)的某研究中心[8]目前正在研究一種被稱(chēng)為“地理圍欄”的技術(shù),通過(guò)該技術(shù)為無(wú)人機(jī)劃分靜態(tài)地理圍欄,設(shè)置圍欄事件。NASA無(wú)人機(jī)管理首席調(diào)查員KoDardekar還表示,設(shè)置兩類(lèi)地理圍欄事件:禁止其他無(wú)人機(jī)飛入和禁止自家無(wú)人機(jī)飛出,同時(shí)依靠無(wú)人機(jī)飛行器中的傳感器進(jìn)行識(shí)別并避障。在國(guó)內(nèi),作為全球民用無(wú)人機(jī)行業(yè)領(lǐng)軍企業(yè)的深圳大疆創(chuàng)新科技公司,目前是全球唯一一家研究地理圍欄技術(shù)的民用無(wú)人機(jī)制造商。
地理圍欄實(shí)質(zhì)是真實(shí)世界地理區(qū)域上的虛擬邊界,可以在定位源進(jìn)入或離開(kāi)時(shí)觸發(fā)圍欄事件。地理圍欄在無(wú)人機(jī)系統(tǒng)的主要是安全性方面的應(yīng)用,可以在地面站引入地理圍欄,無(wú)人機(jī)無(wú)論在手動(dòng)操控還是自動(dòng)模式下,當(dāng)進(jìn)入禁飛域時(shí),地理圍欄算法通過(guò)定義的圍欄事件,觸發(fā)聲音警報(bào),使得操作人員能夠操控?zé)o人機(jī)避讓禁飛區(qū)域[9];也可以應(yīng)用于無(wú)人機(jī)飛行控制系統(tǒng),當(dāng)無(wú)人機(jī)在自動(dòng)模式下飛行時(shí),在地理圍欄算法的幫助下,無(wú)人機(jī)將不會(huì)進(jìn)入禁飛區(qū)域。
本文將地理圍欄技術(shù)作為解決無(wú)人機(jī)“黑飛”、“亂飛”安全事故的一種“新”技術(shù)引入,主要研究在無(wú)人機(jī)地面站系統(tǒng)中的地理圍欄,在Visual Studio 2010.NET[10]的開(kāi)發(fā)環(huán)境下,以C#語(yǔ)言為主,研究地理圍欄算法,劃分的地理圍欄可以是多邊形、圓形等,用戶(hù)可以選擇禁止無(wú)人機(jī)進(jìn)入的范圍,利用地理圍欄算法畫(huà)出一個(gè)多邊形或者圓形禁飛區(qū)域,通過(guò)相應(yīng)的地理圍欄算法解算并判斷無(wú)人機(jī)是否在禁飛區(qū)域內(nèi),實(shí)現(xiàn)如果無(wú)人機(jī)進(jìn)入禁飛區(qū)域,就會(huì)顯示帶有信號(hào)框的報(bào)警信號(hào)或語(yǔ)音提示。
無(wú)人機(jī)是無(wú)人機(jī)系統(tǒng)的控制對(duì)象,包括了飛行器本體、飛行控制器、負(fù)載設(shè)備(包括電池、圖像傳輸[11]等)幾個(gè)部分。地面站系統(tǒng)是整個(gè)無(wú)人機(jī)系統(tǒng)的重要部分,可以稱(chēng)之為無(wú)人機(jī)系統(tǒng)的大腦,協(xié)調(diào)整個(gè)系統(tǒng)的任務(wù)規(guī)劃和導(dǎo)航控制。本文所涉及的無(wú)人機(jī)系統(tǒng)總體結(jié)構(gòu)如圖1所示,地面站系統(tǒng)由便攜式PC機(jī)、地面站監(jiān)控軟件、圖像接收設(shè)備、地面數(shù)據(jù)終端、通信設(shè)備等幾個(gè)部分組成。
圖1 無(wú)人機(jī)系統(tǒng)總體結(jié)構(gòu)
地面站系統(tǒng)地面站監(jiān)控系統(tǒng)對(duì)導(dǎo)航位置的精度要求較高,本文利用Google Earth客戶(hù)端使得無(wú)人機(jī)監(jiān)控系統(tǒng)能夠加載更加精準(zhǔn)地電子地圖,模擬無(wú)人機(jī)的飛行仿真,實(shí)時(shí)顯示觀(guān)察無(wú)人機(jī)的飛行狀態(tài)信息。但是目前無(wú)人機(jī)地面站的安全性能不高,尤其缺乏針對(duì)無(wú)人機(jī)“黑飛”、“亂飛”,引發(fā)事故的安全應(yīng)用。在地面站中引入地理圍欄技術(shù),提高了無(wú)人機(jī)系統(tǒng)的安全水平,幫助無(wú)人機(jī)預(yù)先劃分禁飛區(qū)域,構(gòu)建基于地理圍欄的避讓禁飛區(qū)域的地面站,實(shí)現(xiàn)無(wú)人機(jī)的安全應(yīng)用。
圖2 地面站軟件設(shè)計(jì)流程
基于Google Earth的無(wú)人機(jī)地面站系統(tǒng)[12]實(shí)現(xiàn)地理圍欄功能,在Google地圖中劃分禁飛區(qū)域,然后由無(wú)人機(jī)機(jī)載GPS定位模塊實(shí)時(shí)向地面站傳送無(wú)人機(jī)位置信息,利用地理圍欄算法解算無(wú)人機(jī)位置與預(yù)劃分禁飛區(qū)域的位置關(guān)系,從而判斷無(wú)人機(jī)是否進(jìn)入禁飛區(qū)域,若未進(jìn)入且沒(méi)有進(jìn)入禁飛區(qū)域的趨勢(shì),則無(wú)人機(jī)正常飛行;若進(jìn)入禁飛區(qū)域,則通知地面操作人員,向飛行控制系統(tǒng)傳達(dá)返航或避讓指令,進(jìn)而實(shí)現(xiàn)無(wú)人機(jī)對(duì)禁飛區(qū)域的避讓。還可以根據(jù)不同的需求加載不同的三維模型[12],對(duì)無(wú)人機(jī)進(jìn)行飛行模擬仿真。具體的軟件設(shè)計(jì)流程如圖2所示。
本文主要介紹兩種典型常用的地理圍欄算法:多邊形地理圍欄和圓形的地理圍欄?;赩isual Studio 2010.NET開(kāi)發(fā)地理圍欄算法,利用基于Google Earth的地面站實(shí)現(xiàn)地理圍欄功能,還包括像保存XML[13]格式的地圖數(shù)據(jù),加載已保存的數(shù)據(jù),選擇地圖類(lèi)型等功能,為無(wú)人機(jī)的飛行和地理圍欄模擬提供基礎(chǔ)。
圓形地理圍欄的示意圖如圖3。假設(shè)圓形地理圍欄[15]圓心位置的為(x0,y0),地理圍欄半徑為r,無(wú)人機(jī)由機(jī)載GPS設(shè)備定位到的位置信息經(jīng)緯度(X,Y),無(wú)人機(jī)與地理圍欄中心點(diǎn)距離為d,那么存在如下判斷規(guī)則算法:
判斷規(guī)則1:d-r≤0時(shí),此時(shí)無(wú)人機(jī)已到達(dá)指定的地理圍欄。
判斷規(guī)則2:d-r>0時(shí),無(wú)人機(jī)在地理圍欄外部,同時(shí)可由與前一狀態(tài)的差值判斷此時(shí)的無(wú)人機(jī)是不斷接近或是遠(yuǎn)離地理圍欄,若不斷接近,說(shuō)明有進(jìn)入地理圍欄的可能,需進(jìn)行頻繁地判斷;若不斷遠(yuǎn)離,正常飛行。
通過(guò)無(wú)人機(jī)飛行器系統(tǒng)的定位模塊可獲知無(wú)人機(jī)信息(X,Y),同時(shí)指定的圍欄中心點(diǎn)的經(jīng)緯度信息已知,求出無(wú)人機(jī)與圍欄中心點(diǎn)的距離d。進(jìn)入圓形地理圍欄的算法為:d-r≤0,即設(shè)置的地理圍欄觸發(fā)事件。為了計(jì)算地理空間距離d,使用了“Haversine公式[16]”。
圖3 圓形方法示意圖
其中,R為地球半徑,可取平均值6371Km。
由式(1)、(2)可求出d,如下:
由于實(shí)際應(yīng)用中,地理圍欄側(cè)重于對(duì)禁飛區(qū)域的實(shí)際形狀邊界的界定,因此地理圍欄基本都是不規(guī)則的復(fù)雜多邊形。多邊形地理圍欄算法的關(guān)鍵是找出有多少個(gè)節(jié)點(diǎn)在多邊形[17]地理圍欄內(nèi),即奇偶定理。
多邊形地理圍欄如圖4所示,由無(wú)人機(jī)定位位置A向左作射線(xiàn),將其作為水平閾值線(xiàn),多邊形每條邊與水平閾值線(xiàn)相交的點(diǎn)表示為一個(gè)節(jié)點(diǎn)。那么地理圍欄的算法判斷規(guī)則如下:
判斷規(guī)則1:在無(wú)人機(jī)位置的左側(cè)存在奇數(shù)個(gè)節(jié)點(diǎn),那么無(wú)人機(jī)在地理圍欄內(nèi)部。
判斷規(guī)則2:在無(wú)人機(jī)位置的左側(cè)存在偶數(shù)個(gè)節(jié)點(diǎn),那么無(wú)人機(jī)在地理圍欄外部。
圖4 射線(xiàn)與多邊形交點(diǎn)的幾種可能情況
但也有特殊情況:例如水平閾值線(xiàn)剛好經(jīng)過(guò)多邊形圍欄邊界的一個(gè)頂點(diǎn),如圖4中所示,AB會(huì)被誤認(rèn)為和地理圍欄兩條邊界都有交點(diǎn),而AC與某一條邊界共線(xiàn)被誤認(rèn)為與地理圍欄邊界有無(wú)窮多的交點(diǎn)。這些情況均會(huì)導(dǎo)致對(duì)于地理圍欄事件的錯(cuò)誤判斷。
針對(duì)這些特殊情況進(jìn)行判斷的規(guī)則如下:其中假設(shè)當(dāng)前處理的邊是A1A2。
判斷規(guī)則1:如果點(diǎn)A為無(wú)人機(jī)的位置,在多邊形圍欄邊A1A2上,則直接判定無(wú)人機(jī)在地理圍欄內(nèi)部。
判斷規(guī)則2:如果水平閾值線(xiàn)正好穿過(guò)A1或者A1A2,那么,若無(wú)人機(jī)坐標(biāo)的縱坐標(biāo)與A1,A2中較小的縱坐標(biāo)相同,且在此次判斷過(guò)程中,忽略這個(gè)交點(diǎn)。
判斷規(guī)則3:如果水平閾值線(xiàn)與多邊形圍欄邊A1A2平行,則忽略對(duì)其與該邊交點(diǎn)的判斷。
用戶(hù)可以在圓形地理圍欄功能選項(xiàng)中輸入任意半徑,在興趣點(diǎn)上繪制一個(gè)圓圈。這個(gè)圓圈將作為禁飛區(qū)域,如果無(wú)人機(jī)跨越禁飛區(qū)域邊界,則會(huì)出現(xiàn)語(yǔ)音提示以及消息框。與多邊形地理圍欄相比,圓形地理圍欄更容易,用圓形地理圍欄算法規(guī)則的C#代碼實(shí)現(xiàn)地理圍欄功能,實(shí)現(xiàn)效果圖如圖5所示。
圖5 圓形地理圍欄效果圖
實(shí)現(xiàn)圓形地理圍欄功能的C#代碼如下:
public double Distance(Point y0x0pos1,
Point YX pos2)
{
int Radius=6371;
//地球的半徑
double dY=this.toRad(pos2.Y-pos1.y0);
double dX=this.toRad(pos2.X-pos1.x0);
double inn_brckt=Math.Sin(dY/2)*Math.Sin(dY/2)+Math.Cos(this.toRad(pos1.x0))*Math.Cos(this.toRad(pos2.X))*Math.Sin(dX/2)*Math.Sin(dX/2);
double f=2*Math.Asin(Math.Min(1,Math.Sqrt(inn_brckt)));
double d=Radius*f;
return d;
}
private double toRad(double deg_val)
{
return(Math.PI/180)*deg_val;
}
if(r_circle.Checked==true & & r_poly.Checked ! =true)
{
Pointy0x0LL_circle=gMapfence1.Position;double d_re?sult=Distance(circle_centre,LL_circle);
if(d_result>(radius/1000))
{
Warningsound.Play() ; MessageBox.Show(“UAV Crossed boundary”,“Error”,MessageBoxButtons.OK);
}
}
在基于Google Earth的地面站的Google地圖上,在禁飛區(qū)域邊界上選擇關(guān)鍵頂點(diǎn),連接繪制一個(gè)多邊形邊界,如圖6所示,將某機(jī)場(chǎng)沿其邊界劃分為禁飛區(qū)。
地理圍欄算法利用所選點(diǎn)來(lái)定義圍欄邊界,進(jìn)而判斷無(wú)人機(jī)的位置是否在邊界內(nèi)。多邊形是任意形狀的,對(duì)于復(fù)雜的多邊形,很難判斷無(wú)人機(jī)是在邊界內(nèi)還是在邊界外[18],具體實(shí)現(xiàn)利用多邊形地理圍欄算法的判斷規(guī)則。確定無(wú)人機(jī)的位置是多邊形地理圍欄內(nèi)部或外部的C#代碼如下:
Public bool FindUAVPs(double X,double Y)
{
int no_of_pySides=this.Count()-1;
int j=no_of_pySides-1;
bool UAVStatus=false;
for(int i=0;i<no_of_pySides;i++)
{
if(boundryPt[i].Y<Y & & boundryPt[j].Y>=Y
||boundryPt[j].Y<Y & & boundryPt[i].Y>=Y)
{
if(boundryPt[i].X+(Y-bndryPt[i].Y)/( bndryPt[j].Y-bndryPt[i].Y)*(bndryPt[j].X-bndryPt[i].X)<X)
{
UAVStatus=! UAVStatus;
}
}
j=i;
}
return UAVStatus;
}
上面代碼的運(yùn)行過(guò)程中,首先會(huì)檢查(bound?ryPt[i],boundryPt[j])范圍內(nèi)的無(wú)人機(jī)位置的Y坐標(biāo),如果檢查到,則繼續(xù)檢查無(wú)人機(jī)位置的X坐標(biāo)是否在水平閾值線(xiàn)以下,從i點(diǎn)連接到j(luò)點(diǎn),或者不連接。如果在這兩個(gè)條件在奇數(shù)次都為真,則“FindUAVPs()”函數(shù)將返回true,那么無(wú)人機(jī)就在地理圍欄里面;否則返回false,否則無(wú)人機(jī)就在地理圍欄外面。
圖6 多邊形地理圍欄效果圖
基于Google Earth的地面站系統(tǒng)[3]中地理圍欄功能的實(shí)現(xiàn),在Visual Studio 2010.NET的開(kāi)發(fā)環(huán)境下,以C#語(yǔ)言為主,利用地理圍欄算法在地面站系統(tǒng)的Google電子地圖上用多邊形或圓形地理圍欄算法預(yù)先繪制虛擬邊界,為無(wú)人機(jī)劃分禁飛區(qū)域。無(wú)人機(jī)在飛行過(guò)程中,飛行控制系統(tǒng)通過(guò)遙測(cè)鏈路向地面站系統(tǒng)的地理圍欄模塊發(fā)送位置信息,通過(guò)地理圍欄算法解算檢查無(wú)人機(jī)是否進(jìn)入禁飛區(qū)域,如果無(wú)人機(jī)越過(guò)禁飛區(qū)域邊界,則在地面站收到音頻和彈出消息框來(lái)通知操作人員。在具體實(shí)現(xiàn)應(yīng)用方面,圓形地理圍欄比多邊形地理圍欄容易實(shí)現(xiàn),但是多邊形地理圍欄的精確度更高,后續(xù)工作中,進(jìn)一步研究實(shí)現(xiàn)針對(duì)多邊形地理圍欄的實(shí)時(shí)地大范圍索引技術(shù),使基于地理圍欄的地面站更具有實(shí)際工程價(jià)值,對(duì)無(wú)人機(jī)的安全應(yīng)用具有深遠(yuǎn)意義。