桂玲+李路+周黃晴+張為民+黃明飛+王雙雙



【摘 要】本文所設計的控制平臺以Android手機為基礎,以WIFI為通信網絡,從如何搭建Android開發(fā)環(huán)境入手,通過對界面布局、視頻流獲取、信息交互、異常捕獲、權限控制等幾個方面的應用設計,實現對四旋翼微型勘測器飛行等的控制,并能實時準確地對高清攝像頭、環(huán)境檢測傳感器所采集的圖像和文本數據進行傳輸與顯示,調試結果表明設計結果完全符合設計要求。
【關鍵詞】無線WIFI;Android手機;應用程序設計
0 引言
我國是一個資源大國,野外資源豐富,對野外資源實地勘測任務艱巨。由于野外資源分布廣,加之地形復雜惡劣、森林覆蓋率大、未知區(qū)域居多等這些不利條件都給野外工作人員帶來了極大不便。
本系統通過嵌入式Android手機平臺遠程控制四旋翼微型勘測飛行器,該平臺利用高清攝像頭來采集作業(yè)面環(huán)境圖像,利用多種環(huán)境探測器和GPS定位,探測環(huán)境實情;并通過WIFI將視頻和勘測信息實時回傳給手機,以便直觀地掌握當前的勘測情況。
為實現上述功能,整個勘測平臺搭載于四旋翼飛行器上,為保證整個平臺的穩(wěn)定,每個重要功能由單獨的處理器處理,整個系統構架如圖1所示:
其中,飛控主要解算姿態(tài)傳感器數據以獲得當前飛行器的姿態(tài)信息并調整電機轉速,保持飛行器的平穩(wěn)和飛行方向控制;主控,主要保證飛行器和控制端的連接穩(wěn)定,解析和創(chuàng)建數據包,并傳遞控制指令給飛控。WIFI是建立手持控制端與主控間通信的媒介。手持控制端是控制整個勘測飛行器的工作,在整個系統的大腦,本文將具體對它的設計做闡述。
1 系統分析
現在的智能手機一般有WiFi、藍牙、移動網絡三種通信方式,相比而言WiFi是最合適做控制的短距離通信協議。通信平臺通過寫入OpenWRT系統的TP-LINKWR703N路由器和手機無線連接。OpenWRT是嵌入式設備上運行的linux系統,附帶3000左右的軟件包,開發(fā)者無需在每一次修改后重新編譯,且用戶可以方便的自定義功能來制作固件。也可以方便的移植各類功能到openwrt下[1]。而Android操作系統是基于Linux系統研發(fā)的一款開源的手機操作系統,由操作系統、中間件、用戶界面和應用軟件組成。由于Android提供了豐富的封裝庫,編程時無需在意系統底層設計和兼容性,現已然在現今智能手機操作系統市場占有率為首位。
路由器里的OpenWRT系統帶有Mjpeg stream插件,可以把從USB攝像頭采集的圖像轉換成流媒體輸出,可以通過文件或者HTTP形式得到視頻。路由器帶有調試用串口引腳,通過配置系統文件可以讓路由器將網絡端口(TCP/IP協議)的數據經串口輸出,同樣也可以把串口的數據傳送的到網絡端口上。從而下位機(主控)通過串口便可以和上位機(手持控制端,如手機)的網絡端口實現信息的透傳。由此,手機端需要打開兩個連接端口,一個從Mjpeg-stream中獲得圖像信息,另一個和下位機通信。系統設計流程如圖2所示:
2 系統實現
2.1 搭建Android開發(fā)環(huán)境
2.1.1 安裝JDK
根據電腦的操作系統從Oracle公司官網下載對應的JDK;下載完成后根據安裝向導提示完成JDK的安裝。
2.1.2 環(huán)境配置
JDK安裝完成后,打開Windows系統的命令窗口,在其中輸入“java-version”,若在下面顯示了Java的版本號說明已經安裝成功;否則要手動配置系統環(huán)境。配置過程如下:按如下步驟打開系統環(huán)境變量設置窗口,計算機->屬性->更改設置->高級->環(huán)境變量,然后在系統變量處新建,變量名為“JAVA_HOME”,變量值中填剛才JDK安裝的路徑,如“C:\Program Files\Java\jdk1.8.0_25”;點擊確定后,再新建一個變量名為classpath,變量值為“.;%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar”;點擊確定后,找到變量Path,在變量值后加”;%HAVA_HOME%/bin“;最后通過命令窗口驗證JDK是否成功安裝。
2.1.3 開發(fā)工具
從Android下載適合電腦系統的集成ADT的Eclipse開發(fā)工具,解壓后便可直接打開Eclipse開發(fā)平臺。
2.2 新建Android應用程序
在Eclipse項目管理窗口點擊右鍵,依次New->Android Application Project->Next,根據新建工程向導設置應用名、工程名、包名和應用程序圖標等,所有需要設置的設置完成之后點擊Finish完成,至此應用程序的新建已經完成。
2.3 界面布局
顯示和控制是人機交互的重要環(huán)節(jié)。上位機UI操作界面包括攝像頭舵機俯仰左右轉動、飛行器前后左右飛行、傳感器數據顯示和圖像畫面顯示。前三項分別用Button(按鍵)、TextView(文本)、ImageView(圖片)控件即可實現;視頻圖像即通過繼承SurfaceView類在屏幕上顯示實時圖像。
整個布局以RelativeLayout(相對布局)為父本,在其中分別放置子控件Button(按鍵控件)、ImageView(圖片控件)和TextView(文本控件),設置控件大小、添加控件ID和其在父控件的位置。新建MySurfaceView.class繼承SurfaceView類,添加自定義的控件到布局文件里,設置高度和寬度為“fill_parent”(填充父本)并添加ID。
添加控制按鍵:
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginTop="70dp" />
第1行添加控件ID,ID號為32位的常量,通常由編譯工具自動生成存于R.java里;第2行、3行分別設置控件寬高,余下4行設置控件在父本中的位置。
添加自定義的控件:
android:id="@+id/mySurfaceViewVideo" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 至此,界面布局已經基本完成,在Activity中加載布局文件即完成了整個布局的設置[2-3]。 2.4 視頻流獲取 在對路由器進行開發(fā)時,本文在OpenWRT系統中裝了mjpg-streamer應用,這樣便能方便地把攝像頭所采集的數據轉換為視頻流[2]。mjpg-streamer可以通過文件或者是HTTP方式訪問linux UVC兼容攝像頭。為此,要在MySurfaceView.class里新建線程用于接收圖像數據,在接收之前需要建立一塊緩存區(qū),用于存放接收到的數據。以URL發(fā)起請求,然后等待服務器(路由器)返回應答。新建單獨的線程完成視頻流的獲取與圖像顯示[4]。 主要代碼如下: url = new URL(urlstr); urlConn = (HttpURLConnection) url.openConnection(); read = urlConn.getInputStream().read(buffer, 0, readSize); 以上代碼必須捕獲異常。 服務器應答后,接下來就要解析出圖片數據并顯示到屏幕上。由于服務器應答是HTTP超文本傳輸協議,我們需要解析出圖像數據。JPEG圖像每個標記都是由兩個字節(jié)組成,其中,前一個字節(jié)固定值0xFF,0xFF 0xD8標記圖像開始,0xFF 0xD9標記圖像結束。截取中間段即為圖像信息,然后通過轉碼轉成Bitmap圖像,轉換圖像大小,繪制圖像,主要代碼如下: Canvascanvas = surfaceHolder.lockCanvas() ; //獲得canvas對象 Bitmap bmp = BitmapFactory.decodeStream(new ByteArrayInputStream(jpg_buf)); mBitmap = Bitmap.createScaledBitmap(bmp, width, height, false); canvas.drawBitmap(mBitmap,(mScreenWidth-width)/2,(mScreenHeight-height)/2, null); surfaceHolder.unlockCanvasAndPost(canvas); //釋放canvas鎖,并且顯示視圖 2.5 信息交互 Activity生命周期里,啟動Activity時系統會先調用onCreate方法,Activity退出時會調用onDestroy方法。通常在onCreate方法里進行按鍵綁定、變量初始化等一系列Activity初始化操作,而在onDestroy方法里釋放資源。 2.5.1 綁定按鍵 在MainActivity.class的onCreate方法里為控件綁定監(jiān)聽器,這樣當這個按鍵被按下時系統會調用這個監(jiān)聽函數,便可以在按鍵被按下時做出相應的反應。 按鍵綁定監(jiān)聽器: findViewById(R.id. button_front). setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub sendfrontData(); } }); 在onClick方法里寫按鍵操作的代碼,當綁定的按鍵被按下此段代碼將會被調用。 2.5.2 獲取輸入流和輸出流 新建一個Socket連接,此連接用來和下位機串口間數據透傳。依據OpenWRT里設置的地址和端口打開Secket連接,并獲得Socket的輸入流和輸出流,主要代碼如下: mSocketClient = new Socket(CtrlIp, CtrlPort); inStream = mSocketClient.getInputStream(); outStream = mSocketClient.getOutputStream(); 打開Socket連接,獲得當前Socket的輸入輸出流。以上代碼必須捕獲異常。新建接收線程,接收下位機發(fā)來的數據,并解析和更新UI。 new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true) {
inStream.read(buffer);
parseData(buffer);
}
}
}.start();
只有在run方法里寫入自己的代碼,當線程運行后會直接調用run方法,整個代碼在循環(huán)體內,Socket接收到數據后,在線程調用數據解析方法解析數據并更新到UI界面。
2.5.3 UI更新
下位機發(fā)來的數據有狀態(tài)信息和其他數據信息,主要顯示方式為文本顯示。Android系統里,文本顯示由TextView控件實現,若要顯示文本到屏幕,首先需要獲得文本控件的ID號,然后再設置控件顯示的文本內容以及字體大小和字體類型、排列方式等,同樣TextView的屬性可以在layout布局文件里設置。
顯示文本到屏幕:
TextViewbt = (TextView) findViewById(R.id.textv);
bt.setText(str);
第一句獲得文本控件textv的ID,第二句,通過setText()為此控件設置文本內容。
2.6 異常捕獲
當退出應用時用戶需要釋放掉之前使用的資源,在MainActivity.class里復寫onDestroy方法,在onDestroy方法里斷開Socket連接和關閉輸入輸出流:
try {
if(mSocketClient!=null)
{
mSocketClient.close();
inStream.close();
outStream.close();
mSocketClient = null;
}
} catch (IOException e) {
e.printStackTrace();
}
mThreadClient.interrupt();
2.7 權限控制
Android 提供了豐富的 SDK(Software development kit),開發(fā)人員在對 Android 系統資源的訪問需要有相應的訪問權限,這個權限就稱為 Android 應用程序權限,由AndroidManifest.xml文件管理,它在應用程序設計時設定,在 Android 系統中初次安裝時即生效。此應用需要以下權限:
<!-- internet -->
STATE"/> STATE"/> 3 應用調試 筆者把該控制平臺與飛行器一起來檢測其工作性能,打開手機調試功能,連接電腦,并安裝好手機驅動,然后在Eclipse里選中項目右擊,選Run as -> Android Application,直接在手機上運行程序,調試如圖3所示。測試表明該平臺能在Android手機終端的控制下攝像頭上下左右旋轉90°拍攝圖像信息;飛行器能平穩(wěn)地前進、后退和左右旋轉飛行;并對有害可燃氣體濃度檢測和PM2.5等顆粒污染物環(huán)境參數信息檢測快速、準確;GPS定位系統精準,室內精度為2.0m以下而室外為0.5m以下。數據,視頻顯示正常,各項性能完全符合設計的要求并能方便地拓展其功能和應用。 【參考文獻】 [1]向誠,謝峰粹.基于WIFI和Android的智能探測車設計[J].電子技術應用,2013.12:82-85. [2]張余,編著.Android網絡開發(fā)從入門到精通[M].清華大學出版社,2014. [3]候國照.基于OpenWrt的無線傳感器網絡協議研究與實現[D].哈爾濱:哈爾濱工業(yè)大學,2009.02:102-105. [4]王雷,藍箭,陳雪娟.基于Android 平臺的無線WiFi控制方法[J].微型電腦應用,2012,7:58-61. [責任編輯:王楠]