gige vision协议数据流控机制的分析与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 113

GigE Vision协议提供了高性能工业相机数据通信的标准接口,本文基于GigE Vision协议设计并实现了一种流控机制,该机制主要作用于PC客户端,可满足相机发送端发送图像数据、图像信息或其他信息给接收端的需求,同时保证数据传输的高效可靠。

该机制在传输层上使用UDP协议,避免了传输层复杂的流控带来延迟,实现数据包的高速传输;在应用层上实现了GVCP控制协议和GVSP数据流协议两种不同的可靠传输机制,在连续高速采集数据的同时,能有效检测并处理丢包情况。

通过搭建ZC702相机开发板和PC客户端应用程序测试平台,连续发送多幅图像数据,采用Wireshark抓包软件分析并验证了该设计方案达到了100Mbps的平均吞吐量,能够满足可靠传输的要求并具有良好的实时性。

1.引言
随着新一轮制造业的变革与科技革命的到来,制造业需要向智能化、数字化加快转变,工业生产中工业相机的应用顺应了这一时代潮流,通过工业相机将产品制造、物流、销售等各个环节加以控制,从而提升生产与工作效率,为了能够对相机进行实时控制以及数据获取,需要为管理软件和相机之间的通信提供可靠的数据传输机制。

常用的相机数据通信协议有GigE Vision、CoaXPress、Camera Link等等,GigE Vision协议基于UDP协议开发,是一种高性能工业相机接口标准,相比其他协议,它有更好的兼容性(吴远波,黄劼,辛军强,一种基于GigE Vision的多路图像采集系统设计:信息与电脑,2018),可以提供更长的传输距离,可以使用价格低廉的标准以太网线缆进行快速的数据通信(Thryft,Ann R.GigE Vision expand in machine vision:Test & Measurement World,2008)。

UDP协议是在网络层IP协议的基础上,增加了多路复用/分解和差错校验功能,所以只能为上层调用它的应用程序提供不可靠、无连接、基于数据报的服务(James F.Kurose,Keith puter Networking:A Top Down Approach:Boston:PEARSON Education,2013)。

UDP虽然保证了数据的高速传输,但无法避免数据包出现乱序和丢失的情况,也就无法保证数据的完整准确送达,针对通信过程中这类现象的发生,GigE Vision协议在应用层上制定了控制协议和数据流协议两个标准,通过两种协议的相互配合,可以实现数据的快速可靠传输。

根据GigE Vision协议的内容,本文采用C/C++语言设计实现了数据流控机制,在ZC702开发板与PC客户端之间通过以太网线建立通信连接,在PC客户端中完成了控制命令消息的准确发送和相机采集图像数据的完整高速获取,并有效的处理了丢包现象,达到了工业相机高性能实时传输数据的要求。

2.GigE Vision协议的基本概念
GigE Vision协议是一种用于工业相机进行数据通信的标准接口,通过GigE Vision协议提供的相机通信总体框架,可以开发出使用以太网来高速传输视频、图像、控制命令等数据的相机设备软件。

工业相机的使用场景一般是工业产品生产线、物流管理等产品制造流程最为核心的环节,既需要实时进行控制指令的发送与结果反馈,也需要短时间内取得大量的图像视频数据,需要极高的网络传输带宽和速率来满足实际的生产需求(彭佩红,基于GigE Vision相机的嵌入式图像采集系统的设计:东南大学,2015)。

所以作为工业相机数据通信的标准,GigE Vision协议根据现实情况,在传输层采用了UDP协议完成端到端通信,同时在应用层建立一系列传输机制实现相机设备与客户端程序间数据的有效传输。

GigE Vision协议位于应用层,在用户空间中实现,所以流控机制的实现可以完全建立在应用程序本身中,而不必涉及到内核部分的操作(游双,Linux高性能服务器编程:机械工业出版社,2013)。

GVCP协议用于控制命令的发送与接收,GVSP在实现数据流的连续传输时,通过结合GVCP发送控制命令实现了GVSP数据传输的流控机制,避免了数据包的乱序和包丢失等问题。

3.GigE Vision协议通信机制的分析
图1 三种通道的基本模型
GigE Vision协议数据流控机制的分析与实现
南京邮电大学电子与光学工程学院 吕 鹏
• 114

GigE Vision 的通信机制需要建立三种类型的通道,通道表示一种虚拟连接,可以通过两个不同设备的UDP 套接字接口来实现连接,如图1所示,三种通道分别是控制通道,流通道和消息通道。

控制通道用于客户端应用程序向相机设备发送控制命令,同时在控制通道上建立数据包确认机制,保证控制命令的可靠传输。

流通道主要用于GVSP 协议,数据流由发送端经由流通道传输到接收端。

消息通道的作用是由相机设备主动发出的消息,经由消息通道传送到客户端程序,可以允许相机设备报告一些异常错误或者特殊信息给客户端软件进行处理(GigE Vision Specification Version 2.0:USA:AIA,2012)。

而GVSP 流控协议的实现中,只需要控制通道和流通道的相互配合,消息通道并不作为主要部分。

一般而言,相机设备作为发送端取得实时数据,而客户端应用程序作为接收端请求得到数据,数据流在传输过程中,GVSP 保证数据包在PC 客户端的按序到达,而超时重传命令通过控制通道发送给相机设备。

4.数据流控制机制的详细设计过程
4.1 数据传输的主体结构设计
图2 应用程序采集图像流程图
整个GVSP 数据流的传输过程如图2所示,首先,GVSP 数据包的大小需要符合实际的网络环境,从而优化带宽效率;其次,数据流从发送端传到接收端时,传输层UDP 数据包会连续不断的进入网络,所以如果网络性能稍差,很可能会造成网络拥堵,增加了丢包出现的概率,如果发生丢包情况,可判断此时网络状况不良,如果立即要求重传,会加剧网络的拥堵,因此选择延时发送重传命令,同样的,发送端收到数据包重传指令后,在重传数据包的同时也会降低发送速率以缓解网络性能不佳的状况。

最后,在数据包重发过程中,为了保证要求重发的命令能够准确抵达发送端,需要在控制通道完成这一过程,而丢失数据包的重传仍然由流通道完成,这样在GVSP 接收端看来是一个普通数据包到达,可以同处理其他数据包一样处理重传数据包。

4.2 数据流快速传输的包处理机制
GVSP 协议的基本规则是通过数据包序号来保证数据的完整性,如图3所示,每个数据包都有一个编号,这些编号也反映了一段连续的内存数据,序号出现中断则代表发生数据包丢失的情况,则通过包重发消息来要求相机设备将丢失的数据包重新发送到应用程序端。

GVSP 数据包有三种类型,分别是GVSP 头帧、GVSP 负载帧和GVSP 尾帧。

以传输一幅图像数据为例,GVSP 头帧必须是一个单独的GVSP 数据帧,头帧中主要承载关于图像的有效信息,例如图像的大小、分辨率、位深度等等,客户端应用程序可根据读取到的首帧信息分配内存空间。

GVSP 负载帧中承载的是这幅图像的有效数据,每个负载包都有对应的id 号,以供客户端程序保证图像数据的正确按序存储和判断是否存在包丢失以发送重传命令,除了最后一个负载包外,每个负载包所携带的数据大小都应该相同,这个数值没有明确的规范,应该根据数据链路层可提供的链路层帧长度来设置一个合理的大小,以最大利用网络性能。

目前很多网络设备在链路层都提供了对巨型包(Jumbo Packet )的支持,巨型包支持最大的包尺寸为65535字节,所以如果能够使用巨型包,可以大大提高网络的利用率(周黎,基于千兆网的高性能嵌入式图像处理技术研究:中国科学院大学,2016)。

GVSP 的尾帧需要携带数据结束发送的信息,客户端应用
程序读取到尾帧后判断一幅图像数据已经接收完毕。

图3 GVSP数据包主体结构图
使用GVSP 传输数据时,需要独立于GVCP 创建专用于数据传输的流通道,同时传送多个文件可以同时开辟多个流通道,流通道端口号可以在[49152,65535]之间任意选择,流通道创建的工作模型为多线程同步I/O 模型,因为每个流通道传输速度极快,每个数据流线程工作很短的时间就会退出,属于典型的短连接,所以多线程以及线程切换的开销比较小,基于多线程的同步I/O 模型足以满足
实际要求(尹圣雨著,金国哲译,TCP/IP 网络编程:人民邮电出版社,2014)。

对于客户端,首先应建立GVSP 流通道套接字,并绑定客户端IP 地址和端口号,设置初始端口号49155,其他流通道建立时可以在它的基础上递增,以防止出现端口号使用重复的情况。

通过GVCP 控制通道向相机设备发送传输图像的命令,相机设备端的地址信息在设备发现步骤中获得。

在套接字的初始化过程中,需要通过setsockopt(socketSrv,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv_out,sizeof(tv_out))函数设置超时,因为数据传输过程中使用的是阻塞I/O ,数据在底层准备阶段和从缓冲区拷贝阶段,receive 函数都会阻塞,为了避免程序长时间停止而影响性能,所以应设置一个超时时间,超过时间后便放弃此次接收,继续执行下一轮循环。

客户端发出命令后,接收到的第一个数据包是GVSP 头帧,根
• 115

据头帧中提供的图像高度,宽度和位深度信息就可以得出该图像的大小,然后为其分配内存。

处理完头帧数据后,图像内存也分配完毕,接下来进行连续数据采集,接收函数执行一个无限循环,持续接收数据,循环终止条件为收到尾帧,客户端根据id号依次将数据打包放入到内存空间中,直到接收到尾帧,完成组帧的过程。

在实际传输过程中,由于为了保证传输的速度,GVSP协议是基于UDP 传输,不可避免地会产生丢包现象,丢包问题一定要在应用层上作基本的处理。

4.3 数据包丢失重传处理机制
接收端丢包是最常见的,如果接收缓存小而数据包到达速度快,套接字缓冲区会很快填满,而应用程序会进行一系列的逻辑处理,此过程会延缓拷贝缓冲区数据到上层应用的时间,这样就会造成缓冲区溢出,所以在GVSP套接字初始化阶段,需要通过setsockopt(socketSrv,SOL_SOCKET,SO_RCVBUF,(const char *)&nRecvBuf,sizeof(int))函数将套接字设置的输入缓冲区初始值尽
可能调大,以减少类似情况的丢包现象。

图4 数据丢包重传流程图
当丢包现象发生时,需要进行包重传的过程,如图4所示,接收端执行recvfrom()函数接收数据,每次到达一个数据包,首先读取数据包的ID号,通过ID号可以识别该包到达顺序,如果是依次到达,则将该包数据存入图像内存中。

如果该包跨越了几个ID号,则可粗略的认为发生了丢包现象,因为数据包先于前面包到达有可能是网络中的乱序,这里先视作丢包处理,将前面暂未到达的数据包的ID号存入预先分配的丢包缓存中。

后续包到达后,当ID号小于之前到达的最大ID号,意味着之前因拥堵或因丢失而重传的数据包到达,如果该包已经存在,接收端直接丢弃,否则,正常将其写入到图像内存中。

数据包重传命令的发送需要设置定时器,定时器使用了steady_clock类实现,命名为Timer,同时使用哈希结构unordered_map构造名为resendnum的词典将重传的ID号与定时器相关联,定时器Timer类中定义了重传等待时间和该ID号的数据包已经重传的次数。

5.通信传输测试与结果分析
相机部分使用了ZC702开发板与图像传感器的组合,可以采集图像并进行初步的处理,PC端应用程序使用基于MFC开发的上位机程序,通信模块基于GigE Vision协议开发,使用以太网与开发板建立连接,在PC机平台上使用Wireshark抓包软件测试并分析发端
与收端的数据传输情况。

图5 抓取重传命令与重传数据包
图6 传输一幅图像的吞吐量情况
根据Wireshark软件给出的结果,由图5可以得出GVSP流控机制有效的发挥了作用,在数据传输过程中,出现了序号为10的负载类型数据包丢失的情况,由GVCP控制通道发送了重传命令给相机设备,而流通道在这之后重发了包序号为10的数据包,由图7可以分析出整个通信过程网络情况良好,传输速率很快,峰值达到了每毫秒传输1.5个数据包,传输一幅位深度为8,分辨率1080P,大小大概为1.98MB的原始图像平均用时为0.16秒,平均吞吐量可以达到100Mbps,达到了测试时可用设备的最优性能。

6.结束语
随着工业相机在生产生活中发挥着越来越重要的作用,对数据传输也提出了更高的要求,相机通信领域也制定了多种标准协议来满足实际工程的需要。

本文基于GigE Vision协议设计并实现了一套可靠的数据流传输控制机制,该机制建立在GVCP控制协议和GVSP数据流协议上,根据GVCP通道负责命令消息的发送和GVSP 通道负责数据流传输的不同特点,分别实现了两种不同的可靠传输机制,通过GVCP与GVSP的互相配合,并采用多线程同步处理数据接收和丢包重发,同时保证了相机与客户端通信的可靠性与高速率。

测试实验结果表明,该流控机制能够实现高速的数据连续采集,并有效处理数据流丢包现象,充分发挥了底层通信设备的性能,具有良好的工程应用价值,值得进一步扩展功能和推广应用。

相关文档
最新文档