強明輝 把翠芳
(1.蘭州理工大學電氣工程與信息工程學院 蘭州 730050)(2.甘肅省工業過程先進控制重點實驗室 蘭州 730050)(3.蘭州理工大學電氣與控制工程國家級實驗教學示范中心 蘭州 730050)
無人機從軍用領域逐漸走向民用以及商用領域[1~2],便捷人們生活的同時,帶來的社會安全問題[3]也逐漸暴露,尤其是闖入禁飛區域,引發“黑飛”、“亂飛”現象,威脅人員或者破壞公共設備[4]。地理圍欄[5]技術是一種基于位置服務[5~6]的新應用,早在十多年前就被提出了,是人機交互服務類型中的一種,目前的應用場景多是應用程序[7]。地理圍欄技術在無人機中的應用是近幾年才被提出的,主要為了防止無人機進入禁飛區域,引發安全事故。國內外對該技術在無人機的應用還在研究階段。2015年10月13日美國媒體KOED報道稱,美國國家航空航天局(NASA)的某研究中心[8]目前正在研究一種被稱為“地理圍欄”的技術,通過該技術為無人機劃分靜態地理圍欄,設置圍欄事件。NASA無人機管理首席調查員KoDardekar還表示,設置兩類地理圍欄事件:禁止其他無人機飛入和禁止自家無人機飛出,同時依靠無人機飛行器中的傳感器進行識別并避障。在國內,作為全球民用無人機行業領軍企業的深圳大疆創新科技公司,目前是全球唯一一家研究地理圍欄技術的民用無人機制造商。
地理圍欄實質是真實世界地理區域上的虛擬邊界,可以在定位源進入或離開時觸發圍欄事件。地理圍欄在無人機系統的主要是安全性方面的應用,可以在地面站引入地理圍欄,無人機無論在手動操控還是自動模式下,當進入禁飛域時,地理圍欄算法通過定義的圍欄事件,觸發聲音警報,使得操作人員能夠操控無人機避讓禁飛區域[9];也可以應用于無人機飛行控制系統,當無人機在自動模式下飛行時,在地理圍欄算法的幫助下,無人機將不會進入禁飛區域。
本文將地理圍欄技術作為解決無人機“黑飛”、“亂飛”安全事故的一種“新”技術引入,主要研究在無人機地面站系統中的地理圍欄,在Visual Studio 2010.NET[10]的開發環境下,以C#語言為主,研究地理圍欄算法,劃分的地理圍欄可以是多邊形、圓形等,用戶可以選擇禁止無人機進入的范圍,利用地理圍欄算法畫出一個多邊形或者圓形禁飛區域,通過相應的地理圍欄算法解算并判斷無人機是否在禁飛區域內,實現如果無人機進入禁飛區域,就會顯示帶有信號框的報警信號或語音提示。
無人機是無人機系統的控制對象,包括了飛行器本體、飛行控制器、負載設備(包括電池、圖像傳輸[11]等)幾個部分。地面站系統是整個無人機系統的重要部分,可以稱之為無人機系統的大腦,協調整個系統的任務規劃和導航控制。本文所涉及的無人機系統總體結構如圖1所示,地面站系統由便攜式PC機、地面站監控軟件、圖像接收設備、地面數據終端、通信設備等幾個部分組成。

圖1 無人機系統總體結構
地面站系統地面站監控系統對導航位置的精度要求較高,本文利用Google Earth客戶端使得無人機監控系統能夠加載更加精準地電子地圖,模擬無人機的飛行仿真,實時顯示觀察無人機的飛行狀態信息。但是目前無人機地面站的安全性能不高,尤其缺乏針對無人機“黑飛”、“亂飛”,引發事故的安全應用。在地面站中引入地理圍欄技術,提高了無人機系統的安全水平,幫助無人機預先劃分禁飛區域,構建基于地理圍欄的避讓禁飛區域的地面站,實現無人機的安全應用。

圖2 地面站軟件設計流程
基于Google Earth的無人機地面站系統[12]實現地理圍欄功能,在Google地圖中劃分禁飛區域,然后由無人機機載GPS定位模塊實時向地面站傳送無人機位置信息,利用地理圍欄算法解算無人機位置與預劃分禁飛區域的位置關系,從而判斷無人機是否進入禁飛區域,若未進入且沒有進入禁飛區域的趨勢,則無人機正常飛行;若進入禁飛區域,則通知地面操作人員,向飛行控制系統傳達返航或避讓指令,進而實現無人機對禁飛區域的避讓。還可以根據不同的需求加載不同的三維模型[12],對無人機進行飛行模擬仿真。具體的軟件設計流程如圖2所示。
本文主要介紹兩種典型常用的地理圍欄算法:多邊形地理圍欄和圓形的地理圍欄。基于Visual Studio 2010.NET開發地理圍欄算法,利用基于Google Earth的地面站實現地理圍欄功能,還包括像保存XML[13]格式的地圖數據,加載已保存的數據,選擇地圖類型等功能,為無人機的飛行和地理圍欄模擬提供基礎。
圓形地理圍欄的示意圖如圖3。假設圓形地理圍欄[15]圓心位置的為(x0,y0),地理圍欄半徑為r,無人機由機載GPS設備定位到的位置信息經緯度(X,Y),無人機與地理圍欄中心點距離為d,那么存在如下判斷規則算法:
判斷規則1:d-r≤0時,此時無人機已到達指定的地理圍欄。
判斷規則2:d-r>0時,無人機在地理圍欄外部,同時可由與前一狀態的差值判斷此時的無人機是不斷接近或是遠離地理圍欄,若不斷接近,說明有進入地理圍欄的可能,需進行頻繁地判斷;若不斷遠離,正常飛行。
通過無人機飛行器系統的定位模塊可獲知無人機信息(X,Y),同時指定的圍欄中心點的經緯度信息已知,求出無人機與圍欄中心點的距離d。進入圓形地理圍欄的算法為:d-r≤0,即設置的地理圍欄觸發事件。為了計算地理空間距離d,使用了“Haversine公式[16]”。

圖3 圓形方法示意圖


其中,R為地球半徑,可取平均值6371Km。
由式(1)、(2)可求出d,如下:

由于實際應用中,地理圍欄側重于對禁飛區域的實際形狀邊界的界定,因此地理圍欄基本都是不規則的復雜多邊形。多邊形地理圍欄算法的關鍵是找出有多少個節點在多邊形[17]地理圍欄內,即奇偶定理。
多邊形地理圍欄如圖4所示,由無人機定位位置A向左作射線,將其作為水平閾值線,多邊形每條邊與水平閾值線相交的點表示為一個節點。那么地理圍欄的算法判斷規則如下:
判斷規則1:在無人機位置的左側存在奇數個節點,那么無人機在地理圍欄內部。
判斷規則2:在無人機位置的左側存在偶數個節點,那么無人機在地理圍欄外部。

圖4 射線與多邊形交點的幾種可能情況
但也有特殊情況:例如水平閾值線剛好經過多邊形圍欄邊界的一個頂點,如圖4中所示,AB會被誤認為和地理圍欄兩條邊界都有交點,而AC與某一條邊界共線被誤認為與地理圍欄邊界有無窮多的交點。這些情況均會導致對于地理圍欄事件的錯誤判斷。
針對這些特殊情況進行判斷的規則如下:其中假設當前處理的邊是A1A2。
判斷規則1:如果點A為無人機的位置,在多邊形圍欄邊A1A2上,則直接判定無人機在地理圍欄內部。
判斷規則2:如果水平閾值線正好穿過A1或者A1A2,那么,若無人機坐標的縱坐標與A1,A2中較小的縱坐標相同,且在此次判斷過程中,忽略這個交點。
判斷規則3:如果水平閾值線與多邊形圍欄邊A1A2平行,則忽略對其與該邊交點的判斷。
用戶可以在圓形地理圍欄功能選項中輸入任意半徑,在興趣點上繪制一個圓圈。這個圓圈將作為禁飛區域,如果無人機跨越禁飛區域邊界,則會出現語音提示以及消息框。與多邊形地理圍欄相比,圓形地理圍欄更容易,用圓形地理圍欄算法規則的C#代碼實現地理圍欄功能,實現效果圖如圖5所示。

圖5 圓形地理圍欄效果圖
實現圓形地理圍欄功能的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地圖上,在禁飛區域邊界上選擇關鍵頂點,連接繪制一個多邊形邊界,如圖6所示,將某機場沿其邊界劃分為禁飛區。
地理圍欄算法利用所選點來定義圍欄邊界,進而判斷無人機的位置是否在邊界內。多邊形是任意形狀的,對于復雜的多邊形,很難判斷無人機是在邊界內還是在邊界外[18],具體實現利用多邊形地理圍欄算法的判斷規則。確定無人機的位置是多邊形地理圍欄內部或外部的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;
}
上面代碼的運行過程中,首先會檢查(bound?ryPt[i],boundryPt[j])范圍內的無人機位置的Y坐標,如果檢查到,則繼續檢查無人機位置的X坐標是否在水平閾值線以下,從i點連接到j點,或者不連接。如果在這兩個條件在奇數次都為真,則“FindUAVPs()”函數將返回true,那么無人機就在地理圍欄里面;否則返回false,否則無人機就在地理圍欄外面。

圖6 多邊形地理圍欄效果圖
基于Google Earth的地面站系統[3]中地理圍欄功能的實現,在Visual Studio 2010.NET的開發環境下,以C#語言為主,利用地理圍欄算法在地面站系統的Google電子地圖上用多邊形或圓形地理圍欄算法預先繪制虛擬邊界,為無人機劃分禁飛區域。無人機在飛行過程中,飛行控制系統通過遙測鏈路向地面站系統的地理圍欄模塊發送位置信息,通過地理圍欄算法解算檢查無人機是否進入禁飛區域,如果無人機越過禁飛區域邊界,則在地面站收到音頻和彈出消息框來通知操作人員。在具體實現應用方面,圓形地理圍欄比多邊形地理圍欄容易實現,但是多邊形地理圍欄的精確度更高,后續工作中,進一步研究實現針對多邊形地理圍欄的實時地大范圍索引技術,使基于地理圍欄的地面站更具有實際工程價值,對無人機的安全應用具有深遠意義。