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

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

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

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

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

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

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

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

圖8 系統實物

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

表1 不同網絡下數據傳輸延遲情況
本文利用開源VLC框架實現了基于3G網絡的從Windows平板電腦到Android手機的實時視頻流傳輸。同移植FFMPEG解碼庫相比,采用VLC框架相對簡便,開發周期短,易于擴展,并且VLC提供的函數接口可以在多種平臺上使用。利用基于TCP協議的Socket實現了服務器與客戶端之間的通信。利用RS232串口實現了服務器同下位機的通信。該系統省去了一般的遠程控制系統中轉發服務器的環節,實現了端到端的直接傳輸,增強了實時性,適合用于家用機器人的遠程控制。
[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平臺手機遠程監控系統的設計與實現[D].成都:電子科技大學,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平臺的智能手機流媒體播放器的研究及實現[D].南京:南京郵電大學,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的實時監控客戶端的設計與實現[D].哈爾濱:哈爾濱工業大學,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平臺的智能醫療監控系統的研究[D].太原:太原理工大學,2012.]
[6]WU Jing.Application software design for webcam monitor system in android mobile platform[D].Shanghai:Shanghai Jiaotong University,2012 (in Chinese).[吳晶.Android手機端遠程監控系統的設計與實現[D].上海:上海交通大學軟件學院,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的移動流媒體實時傳輸系統設計與實現[D].西安:西安電子科技大學,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的視頻監控的研究與實現[D].西安:西安電子科技大學,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的智能手機視頻監控系統的設計與實現[D].大連:大連海事大學,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.