李瑞峰,冀龍濤
(哈爾濱工業(yè)大學(xué) 機器人技術(shù)與系統(tǒng)國家重點實驗室,黑龍江 哈爾濱150080)
家用型智能服務(wù)機器人集成了視覺、溫濕度和煙霧等傳感器,能夠監(jiān)測家庭環(huán)境的數(shù)據(jù)。隨著3G網(wǎng)絡(luò)的建設(shè)和智能手機性能的提升,利用智能手機對家用機器人進行遠(yuǎn)程控制,可以隨時隨地了解家中的狀況,極大地方便了人們的生活。Android系統(tǒng)以其開源、可移植等良好的特性受到了普遍歡迎。在利用Android手機進行遠(yuǎn)程控制尤其視頻監(jiān)控方面,國內(nèi)外進行了相關(guān)研究。
文獻[1,2]設(shè)計的基于Android手機的遠(yuǎn)程監(jiān)控系統(tǒng)傳送的是連續(xù)圖像而不是視頻流,對網(wǎng)絡(luò)帶寬要求高。文獻[3,4]在Android平臺下實現(xiàn)了本地視頻文件的播放。文獻[5]采用嵌入式Linux系統(tǒng)采集實時視頻,移植FFMPEG開源編解碼器在Android上實現(xiàn)了H.264的解碼,但缺少對前端攝像頭云臺的控制。文獻[6]針對專業(yè)監(jiān)控攝像頭開發(fā)了實時視頻監(jiān)控軟件,可解碼MJPEG、MPEG-4和H.264編碼。文獻[7]將基于Android的移動流媒體實時傳輸系統(tǒng)分為采集端、服務(wù)器和播放端,視頻流經(jīng)過兩次網(wǎng)絡(luò)傳輸,延遲較大。文獻[8]采用Android手機作為視頻采集端,LIVE555作為流媒體服務(wù)器,PC作為播放端,在WIFI下實現(xiàn)了實時視頻監(jiān)控。
本文旨在建立一個利用Android手機通過3G網(wǎng)絡(luò)遠(yuǎn)程控制家用機器人的完整系統(tǒng),包括遠(yuǎn)程視頻監(jiān)控、遠(yuǎn)程運動控制和傳感器信息的顯示。
家用機器人由機器人本體、控制板 (下位機)和平板電腦 (服務(wù)器)組成,如圖1所示。平板電腦和控制板安裝在機器人本體上。平板電腦安裝Windows XP系統(tǒng),通過USB接口連接攝像頭、3G上網(wǎng)卡和USB轉(zhuǎn)RS232串口數(shù)據(jù)線。其中,3G上網(wǎng)卡插入中國電信UIM卡撥號接入Internet,攝像頭用于采集視頻,USB轉(zhuǎn)RS232串口線用來實現(xiàn)平板電腦和控制板之間的通信。控制板連接溫濕度、煙霧等傳感器,采集周圍的環(huán)境信息,并且通過脈寬調(diào)速(PWM)方式驅(qū)動直流電機運動。Android手機打開3G數(shù)據(jù)連接后接入Internet,從而和平板電腦利用IP地址通信。

圖1 系統(tǒng)硬件構(gòu)成
系統(tǒng)采用客戶端/服務(wù)器 (C/S)結(jié)構(gòu),服務(wù)器處于一直運行狀態(tài),等待客戶端訪問。中國電信3G撥號后得到公網(wǎng)IP,但每次撥號獲取的IP地址是動態(tài)的,客戶端連接服務(wù)器前需獲知對方IP地址,造成極大的不便。可以通過向花生殼、金萬維等域名解析服務(wù)商注冊,獲得一個免費域名,并綁定到服務(wù)器的IP地址上,Android手機通過域名對平板電腦進行訪問。
整個遠(yuǎn)程控制系統(tǒng)由服務(wù)器、客戶端和下位機組成,各部分具體功能如下:
服務(wù)器:采集攝像頭視頻,進行編碼和流化,同客戶端和下位機通信。
客戶端:顯示實時視頻和下位機傳感器信息,并發(fā)送運動指令控制機器人運動。
下位機:實現(xiàn)路徑規(guī)劃、自主避障等功能,接收服務(wù)器發(fā)送的運動控制指令,并向服務(wù)器發(fā)送溫濕度等傳感器數(shù)據(jù)。
在本系統(tǒng)中,服務(wù)器和客戶端傳遞的數(shù)據(jù)有3種,視頻流、運動控制指令和傳感器信息。其中視頻由于數(shù)據(jù)量大成為重點研究對象。流媒體是指在網(wǎng)絡(luò)中使用流式傳輸技術(shù)的連續(xù)時基媒體,不必等到整個文件下載完畢,僅需把起始幾秒的數(shù)據(jù)下載到本地緩存中就可以開始播放[6],適合用于實時視頻監(jiān)控。
實現(xiàn)流式傳輸,需要合適的傳輸協(xié)議,在傳輸層主要涉及TCP和UDP協(xié)議,在應(yīng)用層主要涉及RTP、RTCP和RTSP協(xié)議。TCP協(xié)議是面向連接的協(xié)議,可靠性高,但確認(rèn)和重傳機制使得傳輸延時大。UDP協(xié)議是無連接的協(xié)議,消耗資源少,適合傳輸大量數(shù)據(jù)。RTP協(xié)議定義了RTP報文和RTCP報文,用于傳輸音視頻等實時數(shù)據(jù)。RTSP協(xié)議[9]作為實時流媒體傳輸中的控制協(xié)議,負(fù)責(zé)控制實時數(shù)據(jù)包的發(fā)送。本系統(tǒng)將采用TCP協(xié)議傳輸運動控制指令和傳感器數(shù)據(jù),采用RTP/UDP協(xié)議傳輸視頻數(shù)據(jù)。流媒體技術(shù)涉及的協(xié)議的層次結(jié)構(gòu)如圖2所示。

圖2 流媒體協(xié)議棧
流媒體在傳輸前必須經(jīng)過編碼,以減少數(shù)據(jù)量,增強實時性。目前應(yīng)用較多的視頻編碼算法是H.263、MPEG-4和H.264/AVC[10]。本文設(shè)計的家用機器人遠(yuǎn)程控制系統(tǒng),視頻的采集和編碼在安裝Windows XP系統(tǒng)的平板電腦進行,視頻的解碼和顯示在Android手機上進行。由于Android手機硬件性能的差異,視頻解碼能力不同,因此系統(tǒng)將采用H.263、MPEG-4和H.264/AVC這3種編碼方案,根據(jù)實際情況進行調(diào)整以提高程序的通用性。
VLC media player是一款自由開源的跨平臺多媒體播放器及框架,最初作為VideoLAN的客戶端,后來合并了VideoLAN服務(wù)器的功能,可播放大多數(shù)多媒體文件,以及各種流媒體協(xié)議,可以在包括 Windows、Linux、Mac OS X、Unix、Android在內(nèi)的多種平臺上運行[11]。VLC作為流媒體服務(wù)器時,可以流化攝像頭采集的實時視頻和存儲介質(zhì)上的視頻文件,并轉(zhuǎn)碼成多種視頻格式,然后輸出HTTP、RTSP、RTP、UDP等多種視頻流到Internet上[12]。LibVLC是VLC多媒體框架的核心引擎和接口庫,開發(fā)者可以利用LibVLC創(chuàng)建各種多媒體程序,實現(xiàn)音視頻的獲取、編碼、流化等功能。LibVLC是一個C函數(shù)庫,可以和多種編程語言混合編程,比如C++、Python、Java等[13]。
由于Android手機硬件性能的差異,支持硬件解碼的視頻編碼種類不同,為了保證程序的通用性,需要編寫解碼程序?qū)崿F(xiàn)視頻流的軟件解碼。Android是利用Java作為編程語言設(shè)計程序的,而視頻解碼一般都是用高效率的C語言編寫的,因此需要使用Android系統(tǒng)的Java本地接口(JNI)技術(shù)在Java中調(diào)用C/C++程序,實現(xiàn)視頻流的接收、解碼和顯示。
系統(tǒng)工作流程如圖3所示。平板電腦通過3G上網(wǎng)卡撥號連接Internet,打開域名解析軟件,將域名指向IP地址,然后打開服務(wù)器程序,設(shè)定視頻幀率、分辨率及串口端口、波特率等參數(shù),開啟遠(yuǎn)程控制服務(wù),等待Android手機客戶端的訪問。客戶端程序打開后,輸入服務(wù)器的IP地址或者花生殼等域名解析軟件預(yù)先綁定的域名,然后登陸連接到服務(wù)器,獲取服務(wù)器拍攝的實時視頻和下位機發(fā)送的溫濕度等傳感信息顯示在手機屏幕上,并且通過按鈕發(fā)送指令遠(yuǎn)程控制機器人運動。客戶端下線后,服務(wù)器關(guān)閉本次連接,重新建立一個新的連接等待客戶端的下一次訪問。

圖3 系統(tǒng)工作流程
服務(wù)器使用VS2010的MFC編寫基于對話框的程序界面。在MFC中使用VLC的libVLC接口時,首先在Video-LAN官網(wǎng)http://www.videolan.org/上下載 Windows版本的VLC軟件安裝,然后在安裝目錄下產(chǎn)生libvlc.dll、libvlccore.dll動態(tài)鏈接庫文件以及sdk和plugins文件夾。sdk\include和sdk\lib下分別包含了程序編譯時需要的頭文件和庫文件。在工程屬性中,需要設(shè)置這兩個目錄。在對話框工程的頭文件中需要聲明#inlucde<vlc\vlc.h>,在源程序中需要聲明#pargma comment(lib,"libvlc.lib")和#pargma comment(lib,"libvlccore.lib"),然后可以在程序中調(diào)用libVLC提供的函數(shù)接口實現(xiàn)所需功能。
對攝像頭采集的視頻進行編碼和流化,首先創(chuàng)建libVLC實例,然后設(shè)定數(shù)據(jù)源為攝像頭,并從數(shù)據(jù)源創(chuàng)建媒體描述器,繼而設(shè)定轉(zhuǎn)碼參數(shù),從媒體描述器創(chuàng)建媒體播放器,最后啟動播放器。在開啟流媒體服務(wù)前,可以通過MFC程序界面自主選擇視頻編碼和幀率。考慮到轉(zhuǎn)碼速率,默認(rèn)對視頻采用算法復(fù)雜度較低的H.263編碼,設(shè)定幀率為5幀每秒,參數(shù)可以根據(jù)Android手機的硬件性能和3G網(wǎng)絡(luò)狀況自行更改。由于視頻傳輸?shù)臄?shù)據(jù)量較大,為了保證視頻畫面的流暢性,采用RTSP/RTP/UDP協(xié)議實現(xiàn)視頻流的傳輸。利用LibVLC建立流媒體服務(wù)器的過程如圖4所示。

圖4 建立流媒體服務(wù)器流程
服務(wù)器和客戶端采用基于TCP協(xié)議的Socket進行通信,傳輸運動控制指令和傳感器信息。服務(wù)器采用C++語言開發(fā),客戶端采用Java語言開發(fā),雖然二者實現(xiàn)Socket通信的API函數(shù)不同,但底層實現(xiàn)是一樣的。在MFC中新建一個類CMySocket繼承自CSocket類,利用CSocket類封裝的API函數(shù)實現(xiàn)Socket通信。為該類增加一個指針成員變量,指向?qū)υ捒蝾悾⒏矊慍Sokcet類的OnAccept()和OnReceive()函數(shù),將實現(xiàn)代碼轉(zhuǎn)到對話框類中。對話框類中需添加兩個CMySocket變量,分別用于監(jiān)聽客戶端連接和收發(fā)數(shù)據(jù)。
服務(wù)器和下位機之間采用RS232串口通信,在MFC中利用MSComm控件實現(xiàn)。為了提高程序的靈活性,將端口號、波特率、數(shù)據(jù)位、停止位、奇偶校驗屬性放置在MFC界面中以下拉列表的形式供用戶選擇,進行串口參數(shù)的設(shè)置,其余屬性則在程序中使用預(yù)先設(shè)置的默認(rèn)值。首先進行初始化,選擇端口,設(shè)定輸入輸出緩沖區(qū)大小、數(shù)據(jù)讀取方式、觸發(fā)串口事件的緩沖區(qū)字符閾值、設(shè)定波特率和幀格式,然后進行通信。為了對機器人進行運動控制和傳感器數(shù)據(jù)的采集,服務(wù)端、客戶端和下位機需要約定運動控制指令對應(yīng)的字符以及傳感器信息的發(fā)送格式。
客戶端使用Eclipse集成開發(fā)環(huán)境和Java語言編寫,用戶界面使用XML進行布局。Android SDK自帶的Video-View控件本身具有訪問RTSP視頻流的功能,但不同的手機支持的音視頻編碼不同,并且經(jīng)過測試,視頻監(jiān)控延遲較大,實時性不理想。VLC播放器的Android版本針對不同的ARM指令集 (ARMv5、ARMv6、ARMv7)進行了優(yōu)化,提升了流媒體播放速度。因此,本系統(tǒng)采用VLC開源框架實現(xiàn)RTSP視頻流的接收、解碼和播放。
為了將VLC的流媒體播放功能移植到自己的Android程序中,需要在Linux系統(tǒng)下對VLC的源代碼進行編譯,得到so庫,編譯過程詳見參考文獻[14]。編譯成功后,在工作目錄下將生成vlc-android的工程。將工程中的assets、jni和libs三個文件夾以及src.org.video.vlc文件夾下相應(yīng)的Java文件復(fù)制到自己的工程中,然后利用Android的JNI技術(shù)調(diào)用VLC提供的函數(shù)實現(xiàn)視頻流的解碼和播放。流媒體播放流程如圖5所示。

圖5 流媒體播放流程
客戶端包含服務(wù)器登陸和遠(yuǎn)程控制兩個界面,如圖6所示。在登陸界面文本框中輸入服務(wù)器IP地址或預(yù)先在域名解析服務(wù)商注冊的域名,點擊登陸跳按鈕轉(zhuǎn)至控制界面。從上到下依次為視頻監(jiān)控區(qū)、傳感器信息顯示區(qū)和運動控制區(qū)。在為運動控制按鈕增加事件監(jiān)聽器時,需要根據(jù)點擊手機屏幕的事件進行判斷,如果是按下事件,則發(fā)送相應(yīng)的運動控制指令,如果是抬起事件,則發(fā)送停止指令,以此控制機器人的運動。
系統(tǒng)在登陸界面成功連接服務(wù)器時會建立一個Socket,然后跳轉(zhuǎn)到控制界面,為了在控制界面中使用Socket,需要將該Socket設(shè)置為全局變量。視頻顯示放在主線程中運行,傳感器數(shù)據(jù)接收需要新建子線程運行。由于更新UI等操作只能在主線程中進行,因此主線程和子線程之間的數(shù)據(jù)傳遞需要使用Handler機制。在子線程中接收數(shù)據(jù),并將數(shù)據(jù)封裝成消息,發(fā)送給主線程,主線程中收到消息后,進行UI的更新操作。

圖6 客戶端界面
為了保證服務(wù)器程序運行時,客戶端總能連接到服務(wù)器,必須保證客戶端在每次退出后,需要發(fā)送一個結(jié)束指令給服務(wù)器,告知客戶端已下線。服務(wù)器接收到結(jié)束指令后,關(guān)閉當(dāng)前套接字,并重新打開一個套接字開始重新監(jiān)聽,等待客戶端的下一次連接。
下位機控制板主控芯片為ATmega128,通過RS232串口和上位機通訊,通過PWM驅(qū)動12V直流電機,通過DHT11溫濕度傳感器采集環(huán)境溫濕度數(shù)據(jù),如圖7所示。

圖7 下位機控制板
下位機程序使用ICCAVR軟件和C語言編寫,僅實現(xiàn)傳感器采集、串口通信和運動控制功能,路徑規(guī)劃、自主避障等功能不在本文研究范圍內(nèi)。運動指令的接收和處理操作放到串口中斷中進行,當(dāng)串口接收到數(shù)據(jù)后,觸發(fā)中斷,在中斷函數(shù)中判斷運動控制指令,控制兩個電機正反轉(zhuǎn),實現(xiàn)前進、后退、左轉(zhuǎn)和右轉(zhuǎn)動作。傳感器數(shù)據(jù)的采集放到定時中斷中,每隔5s采集一次數(shù)據(jù),發(fā)送給上位機,然后轉(zhuǎn)發(fā)到Android手機上。
分別在WIFI和3G網(wǎng)絡(luò)下對系統(tǒng)進行了測試。為了便于調(diào)試,使用帶有兩個驅(qū)動輪和一個萬向輪的簡易小車代替機器人 (不影響最終效果),如圖8所示。平板電腦和Android手機均采用中國電信的3G網(wǎng)絡(luò),接入Internet后得到外網(wǎng)IP。測試使用的Android手機型號為三星I699(GALAXY Trend),搭載 Android2.3.6系統(tǒng),CPU 頻率1024MHz,ARMv7指令集,測試效果見圖9。

圖8 系統(tǒng)實物

圖9 系統(tǒng)測試效果
分別在 WIFI和3G網(wǎng)絡(luò)下,針對H.263和H.264兩種視頻編碼格式以及QCIF (176×144)和CIF(352×288)兩種分辨率,對數(shù)據(jù)延遲情況進行了測試,其中視頻幀率設(shè)定為5幀/秒,測試結(jié)果見表1。
從實驗結(jié)果來看,無論是WIFI還是3G下,運動控制指令和傳感器信息延遲時間都非常短。在WIFI下,H.264比H.263編碼延遲時間長很多,這與手機處理器的性能有關(guān)。H.264編碼節(jié)省了帶寬,但解碼對硬件性能要求比較高。在3G下,使用H.263編碼可以實現(xiàn)視頻流暢傳輸,使用H.264格式,在176*144分辨率下可以傳輸,但在352*288分辨率下,由于帶寬和處理器性能的限制,無法流暢傳輸和解碼顯示。

表1 不同網(wǎng)絡(luò)下數(shù)據(jù)傳輸延遲情況
本文利用開源VLC框架實現(xiàn)了基于3G網(wǎng)絡(luò)的從Windows平板電腦到Android手機的實時視頻流傳輸。同移植FFMPEG解碼庫相比,采用VLC框架相對簡便,開發(fā)周期短,易于擴展,并且VLC提供的函數(shù)接口可以在多種平臺上使用。利用基于TCP協(xié)議的Socket實現(xiàn)了服務(wù)器與客戶端之間的通信。利用RS232串口實現(xiàn)了服務(wù)器同下位機的通信。該系統(tǒng)省去了一般的遠(yuǎn)程控制系統(tǒng)中轉(zhuǎn)發(fā)服務(wù)器的環(huán)節(jié),實現(xiàn)了端到端的直接傳輸,增強了實時性,適合用于家用機器人的遠(yuǎn)程控制。
[1]XIONG Guanghui.Design and realization of remote video surveillance base on android phone[D].Chengdu:University of E-lectronic Science and Technology of China,2012 (in Chinese).[熊光輝.基于Android平臺手機遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].成都:電子科技大學(xué),2012.]
[2]Kumar S.Development and research implementation of remote object monitoring through video streaming based on android mobile[J].International Journal of Internet Computing,2011(2):61-65.
[3]LI Gang.Designing and implementation of streaming media player client of smart phone based on android platform[D].Nanjing:Nanjing University of Posts and Telecommunications,2012(in Chinese).[李剛.基于Android平臺的智能手機流媒體播放器的研究及實現(xiàn)[D].南京:南京郵電大學(xué),2012.]
[4]WANG Hongxia.Design and implementation of real-time moni-toring client based on Android and H.264[D].Harbin:Harbin Institute of Technology,2011 (in Chinese).[王紅霞.基于Android和H.264的實時監(jiān)控客戶端的設(shè)計與實現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2011.]
[5]GAO Yu.Research of intelligent medical monitoring system based on ARM and Android platform[D].Taiyuan:Taiyuan University of Technology,2012 (in Chinese).[高 宇.基 于ARM和Android平臺的智能醫(yī)療監(jiān)控系統(tǒng)的研究[D].太原:太原理工大學(xué),2012.]
[6]WU Jing.Application software design for webcam monitor system in android mobile platform[D].Shanghai:Shanghai Jiaotong University,2012 (in Chinese).[吳晶.Android手機端遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].上海:上海交通大學(xué)軟件學(xué)院,2012.]
[7]YANG Guangping.Design and implementation of mobile streaming media real-time transmission system base on Android[D].Xi'an:Xi'an Jiaotong University,2012 (in Chinese).[楊光平.基于Android的移動流媒體實時傳輸系統(tǒng)設(shè)計與實現(xiàn)[D].西安:西安電子科技大學(xué),2012.]
[8]Vun N,Ooi Y H.Implementation of an Android phone based video streamer[C]//Green Computing and Communications IEEE/ACM Int'l Conference on & Int'l Conference on Cyber,Physical and Social Computing,2010:912-915.
[9]DENG Rui.Research and implementation of video surveillance based on Android[D].Xi'an:Xidian University,2011 (in Chinese).[鄧蕊.基于Android的視頻監(jiān)控的研究與實現(xiàn)[D].西安:西安電子科技大學(xué),2012.]
[10]CHANG Zhipei.Design and implementation of video monitoring system based on Android smart phone[D].Dalian:Dalian Maritime University,2011 (in Chinese).[常志沛.基于Android的智能手機視頻監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].大連:大連海事大學(xué),2011.]
[11]VideoLAN.VideoLAN-VLC:Official site-free multimedia solutions for all OS![EB/OL].[2013-04-02].http://www.videolan.org.
[12]Kurze A,Knauf R.A scalable open source framework for live media production and distribution[C]//14th ITG Conference on Electronic Media Technology,2011:1-4.
[13]VideoLAN.LibVLC-VideoLAN Wiki[EB/OL].[2013-04-02].http://wiki.videolan.org/Libvlc.
[14]VideoLAN.AndroidCompile-VideoLAN Wiki[EB/OL].[2013-04-02].http://wiki.videolan.org/AndroidCompile.