摘 要: 針對(duì)ROS系統(tǒng)平臺(tái)的接口局限性,結(jié)合USB接口的通用性和普及性,,采用USB攝像頭作為系統(tǒng)的視頻采集設(shè)備,,設(shè)計(jì)和實(shí)現(xiàn)了一種基于ROS(機(jī)器人操作系統(tǒng))平臺(tái)的視頻監(jiān)控系統(tǒng)方案?;?a class="innerlink" href="http://forexkbc.com/tags/UVC視頻類協(xié)議" title="UVC視頻類協(xié)議" target="_blank">UVC視頻類協(xié)議的圖像采集系統(tǒng)具有良好的兼容性,,實(shí)現(xiàn)了USB視頻采集設(shè)備在ROS系統(tǒng)平臺(tái)上的免驅(qū)使用。視頻采集程序的設(shè)計(jì)采用針對(duì)UVC協(xié)議的V4L2框架,,有效地利用了ROS系統(tǒng)提供的應(yīng)用編程接口,。系統(tǒng)應(yīng)用結(jié)果表明,,本文提出的ROS視頻監(jiān)控方案具有良好的實(shí)用性和方便性,,視頻傳輸效果良好。
關(guān)鍵詞: ROS,;視頻監(jiān)控,;UVC視頻類協(xié)議;V4L2
0 引言
視頻監(jiān)控系統(tǒng)一直是嵌入式平臺(tái)研究中的一個(gè)重要方向,Linux系統(tǒng)具有源代碼開(kāi)放,、內(nèi)核穩(wěn)定,、可裁減性、支持硬件廣泛及驅(qū)動(dòng)豐富等特點(diǎn)[1],,嵌入式視頻監(jiān)控多采用Linux作為其軟件平臺(tái)[2],。機(jī)器人操作系統(tǒng)ROS(Robot Operating System)是一種次級(jí)操作系統(tǒng)[3],易用性,、開(kāi)發(fā)效率高,、跨平臺(tái)、代碼可復(fù)用成為ROS的主要優(yōu)點(diǎn),,目前已有多款嵌入式機(jī)器人平臺(tái)使用ROS作為其控制系統(tǒng),,如PR2、TurtleBot等,。
本文設(shè)計(jì)實(shí)現(xiàn)了應(yīng)用于ROS平臺(tái)的視頻監(jiān)控系統(tǒng),。ROS系統(tǒng)為FireWire(IEEE1394)攝像頭提供了官方支持,1394也稱火線接口,,優(yōu)點(diǎn)是傳輸速度快,,缺點(diǎn)是其針形接口兼容性差。相比之下USB攝像頭兼容性強(qiáng),,安裝方便,,且價(jià)格便宜,本課題的視頻采集設(shè)備采用USB攝像頭,。
本文從系統(tǒng)結(jié)構(gòu)設(shè)計(jì),、UVC(USB Video Class)視頻類協(xié)議傳輸方法、V4L2(Video for Linux 2)視頻采集程序幾個(gè)方面來(lái)完成系統(tǒng)設(shè)計(jì),,最后設(shè)計(jì)出應(yīng)用于ROS上的uvc_cam視頻采集功能包,,實(shí)現(xiàn)圖像采集與視頻監(jiān)控功能,為嵌入式ROS機(jī)器人平臺(tái)的視頻監(jiān)控開(kāi)發(fā)提供一種有效的方法,。
1 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)
本文的目的是設(shè)計(jì)實(shí)現(xiàn)基于ROS系統(tǒng)平臺(tái)的視頻監(jiān)控系統(tǒng),。ROS起源于2007年斯坦福大學(xué)人工智能實(shí)驗(yàn)室的項(xiàng)目與機(jī)器人技術(shù)公司W(wǎng)illow Garage的個(gè)人機(jī)器人項(xiàng)目之間的合作[4]。ROS主要支持Ubuntu系統(tǒng),,提供類似操作系統(tǒng)所提供的功能,。
本文設(shè)計(jì)的視頻監(jiān)控系統(tǒng)采用USB視頻采集設(shè)備,設(shè)計(jì)基于UVC視頻類協(xié)議的視頻數(shù)據(jù)傳輸方法,,并利用ROS系統(tǒng)底層提供的V4L2視頻編程接口完成視頻采集程序的設(shè)計(jì),,最后根據(jù)ROS的系統(tǒng)構(gòu)架完成視頻采集功能包uvc_cam的設(shè)計(jì),實(shí)現(xiàn)ROS操作系統(tǒng)平臺(tái)的視頻監(jiān)控功能,。
系統(tǒng)結(jié)構(gòu)如圖1所示,。
2 基于UVC協(xié)議的視頻傳輸方法
2.1 UVC標(biāo)準(zhǔn)及支持
由于視頻采集模塊不同,、傳輸協(xié)議不同等原因,ROS系統(tǒng)需要安裝不同的USB驅(qū)動(dòng)程序,,這給移動(dòng)機(jī)器人平臺(tái)的使用帶來(lái)很多不便,。針對(duì)此問(wèn)題,本文設(shè)計(jì)基于UVC協(xié)議規(guī)范的視頻傳輸方法,,使ROS系統(tǒng)為符合UVC視頻類標(biāo)準(zhǔn)的USB攝像頭提供通用驅(qū)動(dòng),,方便安裝和使用。
2.2 UVC協(xié)議視頻端口描述符設(shè)計(jì)
一個(gè)USB視頻類設(shè)備接入ROS平臺(tái)后需要通過(guò)描述符讓ROS主機(jī)獲得它的屬性和被確認(rèn)為標(biāo)準(zhǔn)的USB類設(shè)備,,這些描述符是標(biāo)準(zhǔn)的USB描述符,,并在其子描述符中定義了USB設(shè)備的各種功能[5]。對(duì)于視頻設(shè)備的每個(gè)功能,,需要一個(gè)視頻控制端口和一個(gè)或多個(gè)視頻流端口實(shí)現(xiàn)[6],。本文系統(tǒng)設(shè)計(jì)的視頻接口描述符及功能如下:
(1)輸入終端描述:一個(gè)實(shí)體代表數(shù)據(jù)流的開(kāi)始端點(diǎn),,描述了圖像視頻流數(shù)據(jù)的來(lái)源,。
(2)相機(jī)終端描述:相機(jī)終端控制傳輸視頻流的設(shè)備組件的機(jī)械特性,。
?。?)選擇單元描述:起著源選擇器的作用,選擇多個(gè)輸入數(shù)據(jù)流并路由它們到單一的輸出流,。
?。?)處理單元描述:描述了對(duì)圖像亮度、色調(diào),、對(duì)比度,、平移、變焦等參數(shù)的處理,。
?。?)輸出終端描述:將終端描述為前面的幾個(gè)部分和主機(jī)之間的端口,將視頻數(shù)據(jù)輸出,,通過(guò)顯示屏顯示,。
2.3 UVC設(shè)備拓?fù)浣Y(jié)構(gòu)
UVC標(biāo)準(zhǔn)的視頻控制接口包含了USB視頻采集、處理,、輸出相關(guān)組件,,視頻流接口包含了與主機(jī)之間實(shí)現(xiàn)交互的組件,這些組件構(gòu)成本文系統(tǒng)設(shè)計(jì)的UVC設(shè)備拓?fù)浣Y(jié)構(gòu),,如圖2,。
一個(gè)符合UVC規(guī)范的USB攝像頭插入到ROS平臺(tái)接口時(shí),從視頻傳感器得到的數(shù)據(jù)流由相機(jī)終端輸入,,復(fù)合視頻設(shè)備得到的數(shù)據(jù)流從輸入終端進(jìn)入,,在本系統(tǒng)的設(shè)計(jì)中,相機(jī)終端和輸入終端兩個(gè)功能組件由USB視頻采集模塊來(lái)完成,。然后經(jīng)過(guò)選擇單元路由后交給處理器進(jìn)行亮度,、對(duì)比度等優(yōu)化,最后由輸出終端綁定到USB端點(diǎn)并與ROS主機(jī)進(jìn)行交互,,完成視頻流處理,,ROS主機(jī)獲取該USB攝像頭的屬性和功能。
3 基于V4L2的視頻采集程序設(shè)計(jì)
3.1 V4L2應(yīng)用編程接口
V4L2是由Bill Dirks[7]設(shè)計(jì)完成的針對(duì)Linux的視頻捕捉應(yīng)用程序接口,。V4L2是V4L的升級(jí)版本[8],,與V4L相比,有更好的擴(kuò)展性和靈活性,。V4L2對(duì)V4L做了徹底改動(dòng),,因此兩者并不兼容,V4L2最大的優(yōu)勢(shì)是可以自定義設(shè)備驅(qū)動(dòng)緩存數(shù)量,,支持的硬件設(shè)備也更多[9],。
本系統(tǒng)的視頻采集程序設(shè)計(jì)部分采用V4L2標(biāo)準(zhǔn)框架,V4L2不僅是針對(duì)UVC免驅(qū)USB設(shè)備的編程框架,,同時(shí)ROS操作系統(tǒng)底層也提供了V4L2編程接口,。
3.2 V4L2視頻采集模型
V4L2在視頻采集中用到的兩個(gè)重要系統(tǒng)調(diào)用函數(shù)是ioctl()和mmap()。ioctl()是設(shè)備接口控制函數(shù),,對(duì)設(shè)備的I/O通道進(jìn)行控制,,視頻采集過(guò)程中獲取設(shè)備功能、設(shè)置幀格式,、申請(qǐng)幀緩沖等操作函數(shù)都將通過(guò)該系統(tǒng)調(diào)用實(shí)現(xiàn),。
ioctl()語(yǔ)法為:ioctl(int fd,int request,,void*argp),,fd為通過(guò)open()函數(shù)獲得的設(shè)備文件描述符;request為系統(tǒng)調(diào)用類型,,用于告訴系統(tǒng)操作的動(dòng)作,,如VIDIOC_QUERYCAP是獲取設(shè)備功能;argp是用戶數(shù)據(jù)指針,,用于參數(shù)傳遞和數(shù)據(jù)接收,。
mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過(guò)映射同一普通文件來(lái)實(shí)現(xiàn)共享內(nèi)存,實(shí)現(xiàn)從內(nèi)核空間到用戶空間的映射,,不需要任何數(shù)據(jù)拷貝,,提高了數(shù)據(jù)傳輸效率。在本系統(tǒng)設(shè)計(jì)中,,還會(huì)用到幾個(gè)V4L2常用的API函數(shù):open()用于打開(kāi)一個(gè)設(shè)備,,close()函數(shù)用于關(guān)閉一個(gè)設(shè)備,,read()函數(shù)用于從設(shè)備讀取數(shù)據(jù)。
3.3 V4L2視頻采集程序設(shè)計(jì)
基于V4L2編程規(guī)范和視頻采集模型,,本文設(shè)計(jì)的視頻采集程序流程及其對(duì)應(yīng)的操作函數(shù)如圖3,。
4 ROS視頻傳輸實(shí)現(xiàn)方法
4.1 ROS系統(tǒng)構(gòu)架
ROS的首要設(shè)計(jì)目標(biāo)是在機(jī)器人研發(fā)領(lǐng)域提高代碼復(fù)用率。ROS可以分成兩層,,低層為操作系統(tǒng)層,,高層則是廣大用戶群貢獻(xiàn)的實(shí)現(xiàn)不同功能的各種軟件包,例如定位繪圖,、行動(dòng)規(guī)劃,、感知、模擬等,。ROS是一種分布式處理框架(又稱Nodes),,這使可執(zhí)行文件能被單獨(dú)設(shè)計(jì),并且在運(yùn)行時(shí)松散耦合,。這些過(guò)程可以封裝到數(shù)據(jù)包(Packages)和堆棧(Stacks)中,,以便于共享和分發(fā)。
計(jì)算圖級(jí)是ROS處理數(shù)據(jù)的一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式,。程序運(yùn)行時(shí),,所有進(jìn)程以及它們所進(jìn)行的數(shù)據(jù)處理將會(huì)通過(guò)一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式表現(xiàn)出來(lái)。主要包括以下幾個(gè)重要概念:
?。?)節(jié)點(diǎn)(node):一些執(zhí)行運(yùn)算任務(wù)的進(jìn)程,。
(2)消息(message):節(jié)點(diǎn)之間通過(guò)傳送消息進(jìn)行通信,。
?。?)主題(topic):消息以一種發(fā)布/訂閱的方式傳遞。一個(gè)節(jié)點(diǎn)可以在一個(gè)給定的主題中發(fā)布消息,。
4.2 uvc_cam功能包結(jié)構(gòu)及設(shè)計(jì)
結(jié)合ROS系統(tǒng)構(gòu)架,,本節(jié)將敘述基于UVC協(xié)議的ROS視頻傳輸功能包uvc_cam的設(shè)計(jì)方法。上節(jié)講解了節(jié)點(diǎn),、消息等概念,,ROS中有無(wú)數(shù)的節(jié)點(diǎn)、消息,、服務(wù),、工具和庫(kù)文件,需要有效的結(jié)構(gòu)去管理這些代碼,。ROS文件系統(tǒng)級(jí)指的就是在硬盤(pán)上面查看的ROS源代碼的組織形式,,而功能包(packge)就是ROS中組織軟件的主要形式。一個(gè)簡(jiǎn)單的ROS功能包包括一個(gè)存放源代碼的src文件夾,、一個(gè)CMakelists.txt文件,、一個(gè)manifest.xml文件,。
圖4是uvc_cam功能包的設(shè)計(jì)結(jié)構(gòu)圖。
?。?)src文件夾存放源程序,,包括視頻采集程序uvc_cam.cpp、視頻采集節(jié)點(diǎn)實(shí)現(xiàn)程序uvc_cam_node.cpp,、頭文件uvc_cam.h,。
?。?)CMakeList.txt文件包含了用于安裝動(dòng)態(tài)鏈接庫(kù)和生成可執(zhí)行文件的語(yǔ)句,。下面是該文件中的兩條核心語(yǔ)句:
rosbuild_add_library(uvc_cam src/uvc_cam/uvc_cam.cpp),由uvc_cam.cpp編譯建立視頻采集的鏈接庫(kù),。
rosbuild_add_executable(uvc_cam_node src/uvc_cam_ node.cpp),,該句的功能是由uvc_node_cam.cpp編譯添加可執(zhí)行的視頻采集節(jié)點(diǎn)文件uvc_cam_node。
?。?)manifest.xml提供關(guān)于uvc_cam功能包的元數(shù)據(jù),,包括它的許可信息以及與其他功能包之間的依賴關(guān)系。
4.3 結(jié)果驗(yàn)證
前面已經(jīng)描述了ROS系統(tǒng)構(gòu)架計(jì)算圖級(jí)和點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)處理方式,。圖5是本文設(shè)計(jì)實(shí)現(xiàn)ROS視頻監(jiān)控的節(jié)點(diǎn)拓?fù)潢P(guān)系圖,。
一個(gè)終端打開(kāi)視頻采集節(jié)點(diǎn)uvc_cam_node,另外一個(gè)終端打開(kāi)圖像顯示節(jié)點(diǎn)image_view,,兩個(gè)節(jié)點(diǎn)之間通過(guò)/camera/rgb/image_color進(jìn)行話題發(fā)布和消息訂閱,,uvc_cam_node節(jié)點(diǎn)實(shí)現(xiàn)視頻采集,在image_view節(jié)點(diǎn)的終端顯示,,效果如圖6,。
5 結(jié)束語(yǔ)
本文設(shè)計(jì)并實(shí)現(xiàn)了ROS平臺(tái)上的視頻監(jiān)控系統(tǒng),介紹了ROS在結(jié)構(gòu)和功能上的優(yōu)越性,。結(jié)合本文的系統(tǒng)結(jié)構(gòu),,設(shè)計(jì)了基于UVC視頻類協(xié)議的視頻數(shù)據(jù)傳輸方法,實(shí)現(xiàn)了UVC規(guī)范的USB攝像頭與ROS系統(tǒng)平臺(tái)的即插即用,,避免了ROS系統(tǒng)接口兼容性和驅(qū)動(dòng)安裝等問(wèn)題帶來(lái)的不便,。詳細(xì)描述了V4L2視頻采集程序設(shè)計(jì)流程和系統(tǒng)調(diào)用函數(shù),有效地利用了ROS系統(tǒng)提供的應(yīng)用編程接口,。最后根據(jù)ROS的系統(tǒng)構(gòu)架,,設(shè)計(jì)了uvc_cam視頻采集程序功能包,實(shí)現(xiàn)視頻采集和傳輸功能,。該系統(tǒng)有良好的設(shè)備兼容性和實(shí)用性,,視頻采集性能穩(wěn)定,實(shí)時(shí)性好,,是嵌入式ROS系統(tǒng)平臺(tái)上實(shí)現(xiàn)視頻監(jiān)控的一種有效方法,。
參考文獻(xiàn)
[1] 劉志華.基于ARM和Linux的視頻圖像采集系統(tǒng)[J].微型機(jī)與應(yīng)用,,2014,33(3):12-14.
[2] 王飛,,孔聰.基于V4L2的Linux攝像頭驅(qū)動(dòng)的實(shí)現(xiàn)[J].電子科技,,2012,25(2):86-92.
[3] 張建偉.開(kāi)源機(jī)器人操作系統(tǒng):ROS[M].北京:科學(xué)出版社,,2012.
[4] MARTINEZ A. Learning ROS for robotics programming[M].Birmingham: Packt Publishing Ltd,, 2013.
[5] 殷開(kāi)亮.基于UVC協(xié)議的USB3.0圖像采集系統(tǒng)設(shè)計(jì)[D].蘇州:蘇州大學(xué),2014.
[6] USB Implementers Forum,, Inc. Universal Serial Bus Device Class Definition for Video Devices: Revision 1.5[S]. 2012.
[7] DIRKS B. Video for Linux Two API specification: Draft0.12[S]. Michael H Schimek.
[8] 劉登誠(chéng),,沈蘇彬,李莉.基于V4L2的視頻驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,,2011,,27(10):56-58.
[9] 冬雷.DSP原理及開(kāi)發(fā)技術(shù)[M].北京,清華大學(xué)出版社,,2007.