摘 要: 针对ROS系统平台的接口局限性,结合USB接口的通用性和普及性,采用USB摄像头作为系统的视频采集设备,设计和实现了一种基于ROS(机器人操作系统)平台的视频监控系统方案。基于UVC视频类协议的图像采集系统具有良好的兼容性,实现了USB视频采集设备在ROS系统平台上的免驱使用。视频采集程序的设计采用针对UVC协议的V4L2框架,有效地利用了ROS系统提供的应用编程接口。系统应用结果表明,本文提出的ROS视频监控方案具有良好的实用性和方便性,视频传输效果良好。
关键词: ROS;视频监控;UVC视频类协议;V4L2
0 引言
视频监控系统一直是嵌入式平台研究中的一个重要方向,Linux系统具有源代码开放、内核稳定、可裁减性、支持硬件广泛及驱动丰富等特点[1],嵌入式视频监控多采用Linux作为其软件平台[2]。机器人操作系统ROS(Robot Operating System)是一种次级操作系统[3],易用性、开发效率高、跨平台、代码可复用成为ROS的主要优点,目前已有多款嵌入式机器人平台使用ROS作为其控制系统,如PR2、TurtleBot等。
本文设计实现了应用于ROS平台的视频监控系统。ROS系统为FireWire(IEEE1394)摄像头提供了官方支持,1394也称火线接口,优点是传输速度快,缺点是其针形接口兼容性差。相比之下USB摄像头兼容性强,安装方便,且价格便宜,本课题的视频采集设备采用USB摄像头。
本文从系统结构设计、UVC(USB Video Class)视频类协议传输方法、V4L2(Video for Linux 2)视频采集程序几个方面来完成系统设计,最后设计出应用于ROS上的uvc_cam视频采集功能包,实现图像采集与视频监控功能,为嵌入式ROS机器人平台的视频监控开发提供一种有效的方法。
1 系统结构设计
本文的目的是设计实现基于ROS系统平台的视频监控系统。ROS起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目之间的合作[4]。ROS主要支持Ubuntu系统,提供类似操作系统所提供的功能。
本文设计的视频监控系统采用USB视频采集设备,设计基于UVC视频类协议的视频数据传输方法,并利用ROS系统底层提供的V4L2视频编程接口完成视频采集程序的设计,最后根据ROS的系统构架完成视频采集功能包uvc_cam的设计,实现ROS操作系统平台的视频监控功能。
系统结构如图1所示。
2 基于UVC协议的视频传输方法
2.1 UVC标准及支持
由于视频采集模块不同、传输协议不同等原因,ROS系统需要安装不同的USB驱动程序,这给移动机器人平台的使用带来很多不便。针对此问题,本文设计基于UVC协议规范的视频传输方法,使ROS系统为符合UVC视频类标准的USB摄像头提供通用驱动,方便安装和使用。
2.2 UVC协议视频端口描述符设计
一个USB视频类设备接入ROS平台后需要通过描述符让ROS主机获得它的属性和被确认为标准的USB类设备,这些描述符是标准的USB描述符,并在其子描述符中定义了USB设备的各种功能[5]。对于视频设备的每个功能,需要一个视频控制端口和一个或多个视频流端口实现[6]。本文系统设计的视频接口描述符及功能如下:
(1)输入终端描述:一个实体代表数据流的开始端点,描述了图像视频流数据的来源。
(2)相机终端描述:相机终端控制传输视频流的设备组件的机械特性。
(3)选择单元描述:起着源选择器的作用,选择多个输入数据流并路由它们到单一的输出流。
(4)处理单元描述:描述了对图像亮度、色调、对比度、平移、变焦等参数的处理。
(5)输出终端描述:将终端描述为前面的几个部分和主机之间的端口,将视频数据输出,通过显示屏显示。
2.3 UVC设备拓扑结构
UVC标准的视频控制接口包含了USB视频采集、处理、输出相关组件,视频流接口包含了与主机之间实现交互的组件,这些组件构成本文系统设计的UVC设备拓扑结构,如图2。
一个符合UVC规范的USB摄像头插入到ROS平台接口时,从视频传感器得到的数据流由相机终端输入,复合视频设备得到的数据流从输入终端进入,在本系统的设计中,相机终端和输入终端两个功能组件由USB视频采集模块来完成。然后经过选择单元路由后交给处理器进行亮度、对比度等优化,最后由输出终端绑定到USB端点并与ROS主机进行交互,完成视频流处理,ROS主机获取该USB摄像头的属性和功能。
3 基于V4L2的视频采集程序设计
3.1 V4L2应用编程接口
V4L2是由Bill Dirks[7]设计完成的针对Linux的视频捕捉应用程序接口。V4L2是V4L的升级版本[8],与V4L相比,有更好的扩展性和灵活性。V4L2对V4L做了彻底改动,因此两者并不兼容,V4L2最大的优势是可以自定义设备驱动缓存数量,支持的硬件设备也更多[9]。
本系统的视频采集程序设计部分采用V4L2标准框架,V4L2不仅是针对UVC免驱USB设备的编程框架,同时ROS操作系统底层也提供了V4L2编程接口。
3.2 V4L2视频采集模型
V4L2在视频采集中用到的两个重要系统调用函数是ioctl()和mmap()。ioctl()是设备接口控制函数,对设备的I/O通道进行控制,视频采集过程中获取设备功能、设置帧格式、申请帧缓冲等操作函数都将通过该系统调用实现。
ioctl()语法为:ioctl(int fd,int request,void*argp),fd为通过open()函数获得的设备文件描述符;request为系统调用类型,用于告诉系统操作的动作,如VIDIOC_QUERYCAP是获取设备功能;argp是用户数据指针,用于参数传递和数据接收。
mmap()系统调用使得进程之间通过映射同一普通文件来实现共享内存,实现从内核空间到用户空间的映射,不需要任何数据拷贝,提高了数据传输效率。在本系统设计中,还会用到几个V4L2常用的API函数:open()用于打开一个设备,close()函数用于关闭一个设备,read()函数用于从设备读取数据。
3.3 V4L2视频采集程序设计
基于V4L2编程规范和视频采集模型,本文设计的视频采集程序流程及其对应的操作函数如图3。
4 ROS视频传输实现方法
4.1 ROS系统构架
ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS可以分成两层,低层为操作系统层,高层则是广大用户群贡献的实现不同功能的各种软件包,例如定位绘图、行动规划、感知、模拟等。ROS是一种分布式处理框架(又称Nodes),这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。
计算图级是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及它们所进行的数据处理将会通过一种点对点的网络形式表现出来。主要包括以下几个重要概念:
(1)节点(node):一些执行运算任务的进程。
(2)消息(message):节点之间通过传送消息进行通信。
(3)主题(topic):消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。
4.2 uvc_cam功能包结构及设计
结合ROS系统构架,本节将叙述基于UVC协议的ROS视频传输功能包uvc_cam的设计方法。上节讲解了节点、消息等概念,ROS中有无数的节点、消息、服务、工具和库文件,需要有效的结构去管理这些代码。ROS文件系统级指的就是在硬盘上面查看的ROS源代码的组织形式,而功能包(packge)就是ROS中组织软件的主要形式。一个简单的ROS功能包包括一个存放源代码的src文件夹、一个CMakelists.txt文件、一个manifest.xml文件。
图4是uvc_cam功能包的设计结构图。
(1)src文件夹存放源程序,包括视频采集程序uvc_cam.cpp、视频采集节点实现程序uvc_cam_node.cpp、头文件uvc_cam.h。
(2)CMakeList.txt文件包含了用于安装动态链接库和生成可执行文件的语句。下面是该文件中的两条核心语句:
rosbuild_add_library(uvc_cam src/uvc_cam/uvc_cam.cpp),由uvc_cam.cpp编译建立视频采集的链接库。
rosbuild_add_executable(uvc_cam_node src/uvc_cam_ node.cpp),该句的功能是由uvc_node_cam.cpp编译添加可执行的视频采集节点文件uvc_cam_node。
(3)manifest.xml提供关于uvc_cam功能包的元数据,包括它的许可信息以及与其他功能包之间的依赖关系。
4.3 结果验证
前面已经描述了ROS系统构架计算图级和点对点的数据处理方式。图5是本文设计实现ROS视频监控的节点拓扑关系图。
一个终端打开视频采集节点uvc_cam_node,另外一个终端打开图像显示节点image_view,两个节点之间通过/camera/rgb/image_color进行话题发布和消息订阅,uvc_cam_node节点实现视频采集,在image_view节点的终端显示,效果如图6。
5 结束语
本文设计并实现了ROS平台上的视频监控系统,介绍了ROS在结构和功能上的优越性。结合本文的系统结构,设计了基于UVC视频类协议的视频数据传输方法,实现了UVC规范的USB摄像头与ROS系统平台的即插即用,避免了ROS系统接口兼容性和驱动安装等问题带来的不便。详细描述了V4L2视频采集程序设计流程和系统调用函数,有效地利用了ROS系统提供的应用编程接口。最后根据ROS的系统构架,设计了uvc_cam视频采集程序功能包,实现视频采集和传输功能。该系统有良好的设备兼容性和实用性,视频采集性能稳定,实时性好,是嵌入式ROS系统平台上实现视频监控的一种有效方法。
参考文献
[1] 刘志华.基于ARM和Linux的视频图像采集系统[J].微型机与应用,2014,33(3):12-14.
[2] 王飞,孔聪.基于V4L2的Linux摄像头驱动的实现[J].电子科技,2012,25(2):86-92.
[3] 张建伟.开源机器人操作系统:ROS[M].北京:科学出版社,2012.
[4] MARTINEZ A. Learning ROS for robotics programming[M].Birmingham: Packt Publishing Ltd, 2013.
[5] 殷开亮.基于UVC协议的USB3.0图像采集系统设计[D].苏州:苏州大学,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] 刘登诚,沈苏彬,李莉.基于V4L2的视频驱动程序设计与实现[J].微计算机信息,2011,27(10):56-58.
[9] 冬雷.DSP原理及开发技术[M].北京,清华大学出版社,2007.