基于BaiduMap的無人機(jī)管道巡檢地面站的程序軟件設(shè)計
來源:《管道保護(hù)》雜志 作者:鞏玉良 時間:2020-7-22 閱讀:
鞏玉良
西南管道貴陽輸油氣分公司
摘 要:介紹了一種基于BaiduMap的無人機(jī)地面站程序軟件的設(shè)計方法,軟件具有快速啟動、操作簡單和使用靈活等特點,對無人機(jī)管道巡檢地面站的設(shè)計具有參考價值。
關(guān)鍵詞:管道巡檢;無人機(jī);地面站; BaiduMap; JavaScript API; Swing ;航跡規(guī)劃
油氣長輸管道穿越沼澤、沙漠、山區(qū)、森林、城鄉(xiāng)環(huán)境和人口居住區(qū)等復(fù)雜區(qū)域,傳統(tǒng)的人工巡檢常常因無法抵達(dá)而不能滿足工作要求。采用無人機(jī)巡檢則可以解決這一問題。地面站是無人機(jī)系統(tǒng)指揮控制、任務(wù)調(diào)度、信息傳輸?shù)闹袠,保證無人機(jī)準(zhǔn)確安全飛行并執(zhí)行任務(wù),完成路線規(guī)劃、位置顯示、飛行軌跡顯示并對相關(guān)數(shù)據(jù)實時記錄與處理等。
1 簡介
BaiduMap(百度地圖)是當(dāng)今較為流行的地圖應(yīng)用,能夠呈現(xiàn)絕大多數(shù)地區(qū)的二維和衛(wèi)星實景,還能夠加載不同種類的二維圖形功能控件,如無人機(jī)二維模型。
Swing是一個用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包。與傳統(tǒng)圖像界面框架相比,它具有開發(fā)高效性、功能穩(wěn)定性、平臺兼容性等顯著優(yōu)勢。在無人機(jī)執(zhí)行任務(wù)的過程中,需要實時監(jiān)測和控制飛機(jī)的位置、三姿、傳感器、機(jī)載狀態(tài)等信息,利用Swing調(diào)用BaiduMap API可以輕松地實現(xiàn)這些功能。通過BaiduMap COM接口,將百度地圖接入到Swing應(yīng)用平臺上,結(jié)合JavaScript實現(xiàn)對百度地圖的交互控制,利用在Swing框架嵌入瀏覽器的方式融入html頁面資源,在該頁面使用JS 調(diào)用BaiduMap API,從而實現(xiàn)Java與百度地圖的數(shù)據(jù)交互。
2 系統(tǒng)設(shè)計
2.1 JavaScript調(diào)用BaiduMap API
首先 ,在BaiduMap API首頁找到相關(guān)鏈接,填寫有關(guān)信息得到一個密鑰,以便調(diào)用BaiduMap API。
然后,引入BaiduMap API,關(guān)鍵代碼如下:
<script type="text/javascript" src="http://api.map.baidu.com/api?ak=yourkey&v=2.0&services=false"></script>
再創(chuàng)建一個地圖(JS代碼):
var map = new BMap.Map("container"); // 創(chuàng)建地圖實例
var point = new BMap.Point(120.391655,36.067588); // 創(chuàng)建點坐標(biāo)
map.centerAndZoom(point, 15);
這里需要說明三點:
(1) map.centerAndZoom方法創(chuàng)建地圖,第一個參數(shù)可以根據(jù)之前創(chuàng)建好的一個點為中心創(chuàng)建地圖, 也可以根據(jù)城市區(qū)域的中文名稱創(chuàng)建地圖(如果拼寫正確,還可以根據(jù)城市的英文名稱創(chuàng)建)。
(2) map.centerAndZoom第二個參數(shù)是地圖縮放級別,最大為19,最小為0。
(3) BMap.Map方法創(chuàng)建地圖時需要一個容器(地圖會根據(jù)容器的大小自動進(jìn)行調(diào)整),填寫相關(guān)容器的ID。
可 以 通 過 m a p . s e t Z o o m ( ) ; 主 動 控 制 地 圖大小級別。也可以通過設(shè)置 m a p . e n a b l e S c r o l lWheelZoom(true);利用鼠標(biāo)滾輪控制大小。
此外百度地圖提供了非常豐富的功能空間供使用:
(1) Control:控件的抽象基類,所有控件均繼承此類的方法、屬性。通過此類您可實現(xiàn)自定義控件。
(2) NavigationControl:地圖平移縮放控件,PC端默認(rèn)位于地圖左上方,它包含控制地圖的平移和縮放的功能。移動端提供縮放控件,默認(rèn)位于地圖右下方。
(3) OverviewMapControl:縮略地圖控件,默認(rèn)位于地圖右下方,是一個可折疊的縮略地圖。
(4) ScaleControl:比例尺控件,默認(rèn)位于地圖左下方,顯示地圖的比例關(guān)系。
(5) MapTypeControl:地圖類型控件,默認(rèn)位于地圖右上方(地圖,衛(wèi)星,三維)。
(6) CopyrightControl:版權(quán)控件,默認(rèn)位于地圖左下方。
(7) GeolocationControl:定位控件,針對移動端開發(fā),默認(rèn)位于地圖左下方。
JS加載百度地圖效果如圖 1所示。
map.addControl(new BMap.NavigationControl();//縮放平移控件
map.addControl(new BMap.ScaleControl()); //比例尺
m a p . a d d C o n t r o l ( n e w B M a p . O v e r v i e wMapControl(); //縮略圖
map.addControl(new BMap.MapTypeControl());//地圖類型
map.setCurrentCity("石家莊"); //地圖所在城市
這 里 需 要 注 意 的 是 , 當(dāng) 設(shè) 置 城 市 信 息 時 ,MapTypeControl的切換功能才可用。
2.2 地圖事件
B a i d u M a p A P I 中 的 大 部 分 對 象 都 含 有addEventListener方法,我們可以通過該方法來監(jiān)聽對象事件。例如:
map.addEventListener("click", function(){;
alert("click event");
});
當(dāng)不再希望監(jiān)聽事件時,可以將其移除。每個API對象提供了removeEventListener用來移除事件監(jiān)聽函數(shù),詳情如下:
map.removeEventListener("click", functionA);
map.addEventListener("click", functionA);
地圖遮蓋物:
Overlay:覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法。
Point:標(biāo)注表示地圖上的點,可自定義標(biāo)注的圖標(biāo)。
Label:表示地圖上的文本標(biāo)注,您可以自定義標(biāo)注的文本內(nèi)容。
Polyline:表示地圖上的折線。
Polygon:表示地圖上的多邊形。多邊形類似于閉合的折線,另外您也可以為其添加填充顏色。
Circle:表示地圖上的圓。
InfoWindow:信息窗口也是一種特殊的覆蓋物,它可以展示更為豐富的文字和多媒體信息。注意:同一時刻只能有一個信息窗口在地圖上打開。
標(biāo)注示例如下:
var point = new BMap.Point(120.389472,36.072362); //默認(rèn)可以通過Icon類來指定自定義圖標(biāo)
var point=new BMap.Point(point);
var label=new BMap.Label("青島市政府",{offset:new BMap.Size(20, -10)}); //標(biāo)注標(biāo)簽
point.setLabel(label)//設(shè)置標(biāo)注說明
point.enableDragging(); //標(biāo)注可以拖動的
point.addEventListener("dragend", function(e){
alert(e.point.lng + ", " + e.point.lat); //打印拖動結(jié)束坐標(biāo)
});
map.addOverlay(point);
var point = new BMap.Point(120.387244,36.064835);
var myIcon = new BMap.Icon("http://api.map.baidu.com/img/points.png", new BMap.Size(23, 25));
var point2 = new BMap.Point(point, {icon:myIcon});
map.addOverlay(point2);
var infoWindow = new BMap.InfoWindow("<pstyle='font-size:14px;'>詳細(xì)信息</p>"); //彈出窗口
point2.addEventListener("click", function(){
this.openInfoWindow(infoWindow);
});
加載百度地圖標(biāo)注效果如圖 2所示。
2.3 Swing中嵌入瀏覽器
使用DJnative-swt和swt包開發(fā)的調(diào)用本地瀏覽器和webkit瀏覽器方式。
在lib中引入swt和DJnative和mozilla接口包,其中XPCOMDownloadManager類功能為調(diào)用mozilla內(nèi)核瀏覽器,核心代碼如下: NSSystemPropertySWT.WEBBROWSER_XULRUNNER_HOME.set(System.getProperty("user.dir") + "/xulrunner");
final JWebBrowser webBrowser = new
JWebBrowser(JWebBrowser.useXULRunnerRuntime());
XPCOMToggleEditionModer類的功能是調(diào)用mozilla內(nèi)核瀏覽器并啟用編輯模式,核心代碼如下:
n s I D O M N S H T M L D o c u m e n t n s D o c u m e n t= (nsIDOMNSHTMLDocument)document.quer y I n t e r f a c e ( n s I D O M N S H T M L D o c u m e n t . N S _IDOMNSHTMLDOCUMENT_IID); nsDocument.setDesignMode(e.getStateChange()==ItemEvent.SelectED ? "on" : "off");
SimpleWebBrowserExample類的功能為調(diào)用本機(jī)默認(rèn)瀏覽器,核心代碼如下:
JPanel webBrowserPanel = new JPanel(newBorderLayout());
webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component"));
f i n a l J We b B r o w s e r w e b B r o w s e r = n e wJWebBrowser();
webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
2.4 JavaScript與Swing的交互
由于BaiduMap API主要兼容于JavaScript,而地面站應(yīng)用程序的業(yè)務(wù)都是由Java對話框程序來實現(xiàn)的,所以我們需要在Java和JavaScript這兩種開發(fā)語言上實現(xiàn)數(shù)據(jù)交互。在html頁面中使用JS來調(diào)用Java,而在Java中融入JS的函數(shù)。
Java代碼調(diào)用JS函數(shù)并傳遞參數(shù)只需要在調(diào)用JS函數(shù)時加入?yún)?shù)即可,當(dāng)需要加入多個參數(shù)時追加拼接即可,其中注意str類型在傳遞的時候參數(shù)要用單引號括起來,具體如下:
mWebView.loadUrl("javascript:test('" + a+ "')"); //a是JS的函數(shù)test()的參數(shù)
JS調(diào)用Java函數(shù)并傳參時Java函數(shù)正常書寫,然后在html頁面中,利用如下代碼,即可實現(xiàn)調(diào)用:
<div id='b'><a onclick="window.wst.click">b.c</a></div>
在JS與Java的相互調(diào)用完成后,就可以響應(yīng)各自的業(yè)務(wù)方法,從而實現(xiàn)無人機(jī)航跡的相關(guān)功能,如航跡規(guī)劃,獲取飛機(jī)位置以及目標(biāo)位置經(jīng)緯度信息等,效果圖如圖 3所示。
3 航跡規(guī)劃
根據(jù)石油管道分布區(qū)域的地形特點,為無人機(jī)約束若干既定航點,然后讓無人機(jī)按照這些航點構(gòu)成的航線路徑以及預(yù)設(shè)的高度和速度來飛行是用戶需要在地圖上完成的重要功能,那么對于每一個航點需要創(chuàng)建一個獨立的Java類來描述航點的數(shù)據(jù)類型,即:
public class Point{
private double latitude; //緯度
private double longitude; //經(jīng)度
private double speed; //速度
private double height; //高度
}
在Swing加載的瀏覽器加入百度地圖后,在地圖界面上每點擊一個點,就調(diào)用BaiduMap API獲取該點的經(jīng)緯度高度等坐標(biāo)信息,創(chuàng)建一個Point對象將這些位置信息存入,并將該點置入一個ArraList容器中保存下來,最終可通過Swing對話框?qū)@些點處理成飛行路線并可以對它們進(jìn)行編輯。
4 管道信息與航跡顯示
管道位置信息一般以文件形式存儲,根據(jù)文件的特點,使用Java程序編寫識別文件中石油管道位置信息,把獲取的位置信息置入一個ArraList容器中保存下來,最終把管道位置顯示在百度地圖中,可在地圖中清晰的看到管道的走向與位置。
地面站軟件通過與地面數(shù)據(jù)終端連接,實時接收無人機(jī)的飛行數(shù)據(jù),在無人機(jī)執(zhí)行巡檢任務(wù)時,可在地圖中直觀觀察到飛機(jī)所在位置,并結(jié)合管道信息可快速定位無人機(jī)執(zhí)行的任務(wù)。
5 結(jié)語
采用Swing + JavaScript實現(xiàn)無人機(jī)地面站程序軟件設(shè)計,使用戶可以通過Swing對話框進(jìn)行航跡規(guī)劃和航點修改,并完成飛行信息數(shù)據(jù)的保存和實時數(shù)據(jù)的顯示,從而用最直觀的方式滿足無人機(jī)巡檢任務(wù)中對無人機(jī)的控制和監(jiān)測。該地面站軟件在管道巡檢系統(tǒng)中具有快速啟動、操作簡單和使用靈活等特點,對無人機(jī)管道巡檢地面站的設(shè)計具有重要的參考價值。
作者簡介:鞏玉良,男, 1976年生,畢業(yè)于中國石油大學(xué)(華東)油氣儲運工程專業(yè),助理工程師,主要從事長輸油氣管道保護(hù)及管理工作。聯(lián)系方式: 16685001237,2079885445@qq.com
上篇:
下篇: