流处理数据获取系统中的通用显示模块实现
2021-04-17汪洪潮杨俊峰王天星孙正阳宋克柱
汪洪潮,杨俊峰,王天星,孙正阳,宋克柱
(1.中国科学技术大学核探测与核电子学国家重点实验室,合肥230026;2.中国科学技术大学近代物理系,合肥230026)
引 言
数据获取是指将现实世界中的信号进行采样以便后续的传输、分析、处理和存储的过程。目前数据获取系统已广泛地应用于日常生活、工业生产以及科学研究的各个领域中。一个典型的数据获取系统由传感器阵列、数据采集设备和监控系统3个部分组成[1]。
数据显示单元是监控系统中的重要组成部分,操作人员可以通过数据显示单元对前端电子学系统所上传的数据进行查看和分析,从而掌握实验数据或对整个电子学系统的运行状况进行监控。
在过去的数据获取系统中,针对不同的显示需求和数据类型,往往会单独设计数据显示模块。例如在大亚湾中微子实验中搭建了基于Web的远程监测软件,利用直方图和数据表格对前端电子学系统的数据进行显示,提供状态监测、数据流监测等功能[2];中国散裂中子源项目基于Qt设计与实现了高通粉末衍射仪的图形用户界面[3];在一个Blackfin DSP的图像采集与实时显示系统中其直接利用写液晶显示器RAM的方法实现显示功能[4]。
上述几种数据获取系统有着不同的数据格式、数据接口以及数据显示需求,所以针对各系统实现了定制的数据显示模块,重复工作较多,且难以实现系统间的通用。本文在流处理的自研通用数据获取系统框架下,设计和实现一种通用的数据显示模块。此数据显示模块相对独立于前端电子学系统,在不同的系统中做一些简单配置便可以即插即用,极大减小了系统设计和实现的重复工作量,缩短开发周期。
1 数据显示模块简介
通用数据显示模块的设计与实现基于自研的数据获取架构D-Matrix系统,此数据获取架构下的系统结构如图1所示,其基本设计思想是采用一系列级联的流处理节点(FPGA实现或软件实现)来构建数据获取系统。在系统设计阶段使用不同的参数来描述各个节点所在数据域的具体属性,包括数据的时间空间尺度、数据内容的组织和编码方式等,在同一个数据域下的流处理节点之间采用相同的数据格式定义和标准的数据接口,可以自由地进行互连,从而组合出数据获取过程中需要的各种数据处理操作。
图1 流处理数据获取系统结构框图Fig.1 Structure of stream processing DAQ system
此数据获取架构主要面向传感器阵列由大量相同的传感器构成的数据获取系统。传感器阵列作为整个流的数据产生节点,上传的数据具有相同的数据格式和特点,数据处理节点汇聚所有相同的传感器数据形成数据流进行统一的处理。数据以结构相同的数据矩阵的格式在节点间流动,数据矩阵的格式和接口由自研的D-Matrix协议详细、严格规定,在第2节有进一步的描述。基于此类数据获取系统在数据组织上的相似性,不同的数据获取系统或数据获取系统中不同层级的传感器所输出的数据仅仅在数据尺度上不同而在格式上相同,所以可以采用相似的数据处理和显示方法,使得通用数据显示模块的实现成为可能。
在这样的数据获取系统中,数据显示模块可以看成一个只有数据流入、没有数据流出的用于实现数据可视化的通用数据处理节点。只要系统中数据处理节点与数据显示模块具有相同的数据域属性,其数据接口模式由已有的数据协议规定为相同,那么使用相同数据接口的数据显示节点就可以实现对任何一个数据处理节点输出的数据流进行显示,做到即插即用。数据显示模块内部由两种独立的流处理节点构成,分别为数据生成节点和数据显示节点。
由于数据流中的数据有时不直接用于显示,所以设计了显示数据生成节点连接数据显示节点和数据处理节点,用于从一般的数据流中提取或统计监控人员感兴趣的数据信息生成显示数据流。显示数据流独立于产生显示数据的数据流,在系统中作为单独的流存在,具备自己的数据域相关属性。如果需要直接显示数据处理节点输出的结果而不需要任何抽取和统计的操作,则可以省略数据生成节点。
数据显示节点则提供多种不同的数据显示方法。显示数据生成节点和数据显示节点分别在第2、3节有详细描述。通过配置上述两个节点所形成的数据显示模块可以实现在不同数据获取系统间或不同的数据处理节点间的通用。
2 显示数据生成节点
为了从一般的数据流中获取显示所需要的数据,本文统一了数据结构并设计了显示数据生成节点。
2.1 标准流数据帧和数据矩阵
基于第1节中对流处理数据获取系统的描述,将所采集的数据进行抽象概括。普遍地,一个基本数据单元都包含以下的信息:
(1)数据时间信息。描述数据产生时刻的信息。
(2)数据空间信息。描述数据产生的空间信息。理论上,不论实际的传感器阵列的空间排列是一维(如单条拖缆中的水听器阵列)、二维(如相机传感器中的光传感器阵列)或三维(如高能物理实验中的探测器阵列),都可以用一个一维的数组对所有的传感器进行编号,将高维的空间坐标转换成一维空间信息来进行处理。
(3)数据信息。用于记录某一时刻某一个传感器生成的电信号经数字化之后的数据本身。
在数据处理系统中,某一时刻某一个传感器产生的数据可以用时间-空间-数据这样的三维方式进行完全的描述。考虑一个传感器阵列在一段时间内连续工作的情况,其产生的数据可以看成是上述最小数据单元的合并,此时用一个数据矩阵可以实现全部数据信息的描述。
如图2所示是一般的数据矩阵模型,由多个时刻、多个传感器所生成的数据合并而成。节点间流动的数据都由一个具体的数据矩阵描述,这样可以统一所有节点的数据接口。数据矩阵的时间、空间尺度可以根据数据处理节点的性能和需求进行合理、灵活地配置。理论上一个无限延伸的数据矩阵可以描述一个数据获取系统持续工作的状态下产生的所有数据。
在D-Matrix架构下,各流处理节点之间传输的标准流数据帧是由某个时间和空间尺度范围的数据矩阵和对数据矩阵的描述信息构成的。根据数据矩阵的稀疏性,在D-Matrix中提供二维数组和时间-空间-数据三元组两种方式来分别描述稠密的数据矩阵(如海洋地震勘探数据获取系统)和稀疏的数据矩阵(如高能物理实验数据获取系统)。
图2 数据矩阵Fig.2 Data matrix
2.2 显示数据生成节点
根据2.1节所描述的数据矩阵的特点,数据矩阵中包含时间、空间、数据3个维度的信息。数据显示模块中显示的信息可能不包含数据矩阵中所有维度的信息,显示的数据可能也不是数据幅值本身。显示数据生成节点从数据中抽取一定维度的信息,同时可以进行一些常用的数据计算,生成直接用于显示的数据。
如图3所示,显示数据生成节点维护一个空间长度为S、时间长度为T的二维矩阵,其大小与其对应的数据显示节点每次图表刷新的数据尺度相同,此时间、空间尺度也作为输入数据的过滤条件。输入数据不需要计算时,数据过滤部分会根据数据的时间、空间坐标进行过滤,若数据符合条件则将其直接按照时间、空间坐标写入数据矩阵相应的位置中保存;不符合条件则直接丢弃。节点提供二操作数运算功能。若输入数据的坐标(s,t)符合条件,则根据坐标从数据矩阵中读出上一个时间戳的数据(s,t-n)进行计算,计算的方式包括累加、条件计数、差分等,并将得到的结果写到数据矩阵的原位置中。
图3 显示数据生成节点Fig.3 Display data generation node
显示数据生成节点向数据显示节点发送数据的模式分为主动和被动两种。主动发送模式下,显示数据生成节点按照一定的时间间隔将数据矩阵中的数据主动打包发送给数据显示节点;被动发送模式下,仅当数据符合一定条件时,例如数据矩阵中所有的数据都经过至少一次刷新时,数据被打包发送给数据显示节点。
这样的显示数据生成节点,可以实现前端上传的数据速率或容量与数据显示节点所需要显示的数据速率和容量的相互独立,例如在前端数据率过高时进行数据抽取,在前端数据零碎时进行数据缓冲,以此实现数据显示节点对不同速率、容量的数据获取前端的匹配。
设计中利用FPGA硬件逻辑和C++程序两种不同的方式实现了显示数据生成节点,当利用FPGA硬件实现时,此节点可以对数据流进行无抽取的实时处理,处理范围覆盖整个数据空间。利用显示数据生成节点,对于不同的数据流输入,都可以形成一个有限尺度的二维数据流发送给数据显示节点。
3 数据显示节点的图形界面设计
根据第2节的分析,数据显示节点的功能是对一个时间、空间尺度为T×S的不断刷新的有限数据矩阵中的数据实现可视化。
二维数据中的信息包括时间、空间、数据幅值3个维度。因为数据幅值必须被显示,在T=1或S=1的情况下,三维数据退化为二维,这也是数据显示模块所面对的最低数据维度。
在数据可视化过程中,原本被拉伸成一维的空间维度可能重新被折叠成为二维或三维,数据显示模块所面对的最高数据维度为五维。考虑显示时图表中的最高显示维度为四维,即3个空间维度加上颜色维度,所以设计以下3种显示方法。
3.1 二维数据显示
此显示方法适用于时间尺度T=1或空间尺度S=1的二维数据显示。
如图4所示,数据显示节点提供折线图、直方图两种方式用于显示二维数据。图表中横坐标被设定为时间或空间坐标,纵坐标为数据幅值。这种二维显示方法可以直观地看到某一通道随时间的变化趋势或某一时刻所有通道的数据分布。
图4 二维数据显示界面Fig.4 Graphic interface for 2-D data
3.2 三维数据显示
此方法适用于时间尺度、空间尺度均不唯一或时间尺度T=1且空间尺度被再次折叠成二维的三维数据显示。数据显示节点提供二维热力图、多通道折线图和三维直方图3种方法显示三维数据(图5)。
使用二维热力图显示三维数据时,数据幅度通过矩形色块的颜色形式显示,色块颜色与幅值的具体关系标尺在热力图右侧。二维热力图的两个坐标轴可被设置为时间-空间坐标,可以清晰地观察多个传感器通道在一定时间范围内的变化趋势。当时间尺度T=1且空间坐标被折叠成二维时,二维热力图的两个坐标轴被设置为两个空间坐标,这种显示更适用于原传感器阵列的空间位置分布为二维平面的数据获取系统。其显示具体效果如图5(a)所示。类似地,在使用三维直方图显示三维数据时,三维直方图的3个坐标轴被设置为时间、空间、幅度或空间1、空间2、数据幅度,其具体显示效果如图5(c)所示。在多通道折线图中,横坐标被设置为时间坐标,不同的折线图代表不同的空间位置,显示效果如图5(b)所示。多通道折线图不适用于空间坐标折叠的情况。
图5 三维数据显示界面Fig.5 Graphic interface for 3-D data
3.3 四维数据显示
此方法适用于四维数据的显示,包括:
(1)空间坐标折叠成二维的情况下,时间-空间1-空间2-数据幅值的四维数据显示;
(2)时间尺度T=1且空间坐标折叠成三维的情况下,空间1-空间2-空间3-数据幅值的四维数据显示。
数据显示节点提供三维散点图用于四维数据显示。在一些高能物理实验中,数据幅值用于记录粒子的轨迹或分布概率,仅用0和1来表示,可以使用单色三维散点图来显示,三维散点图的3个坐标轴根据数据被设置成两个空间坐标、一个时间坐标或3个空间坐标,显示效果如图6所示。需要显示更多的数据幅值时可以利用散点的颜色维度。当数据过于密集时,图中的散点可能会相互遮盖,不利于观察,此时尽量采取其他显示方法。
图6 四维数据显示界面Fig.6 Graphic interface for 4-D data
4 数据显示节点
如图7所示为数据显示节点的结构及其接口。节点间通过消息队列和共享内存实现数据传输,具体的数据帧格式由已有的协议规定清楚。显示数据生成节点创建任务消息队列和数据共享内存,将数据流中的数据按照特定的数据帧格式写入数据共享内存中,并将数据帧的头地址作为任务内容发送到任务消息队列中。打开数据显示单元后,软件内核按照头文件中配置好的名称连接任务消息队列和数据共享内存。同时创建任务获取线程,启动线程持续从任务队列中获取任务消息,若队列中任务消息数量为零,线程陷入阻塞等待;若队列中存在消息,则立刻从任务消息中解读出此数据帧的地址信息,交给数据显示主界面,并进入下一次任务等待。
图7 数据显示节点Fig.7 Data display node
数据显示主界面负责读取数据共享内存中的数据用于图表的显示和刷新。数据显示主界面刷新图表的方式分为被动刷新模式和主动刷新模式。在被动刷新模式下,当数据显示主界面收到任务获取线程传来的数据帧地址信息后,立刻按照地址信息读取数据帧数据,并立刻根据数据刷新显示图表,所以图表刷新的频率取决于任务消息到来的频率,图表为被动刷新;在主动刷新模式下,数据显示主界面会相应地维护一个本地用于存放数据的数组,当其收到任务获取线程传来的数据帧地址信息后,也会立刻按照地址信息读取数据帧数据,但只用于更新本地数组中的数据信息,而不会立即刷新图表;同时软件会创建刷新定时器,利用定时器定时发出刷新信号,控制数据显示主界面根据本地数组中的数据对图表进行刷新,此时图表的刷新频率取决于定时器的配置,图表为主动刷新。
目前有多种不同的方法可以实现一个数据获取系统的显示模块,包括基于Qt的实现方法[5-7]、基于LabView的实现方法[8-10]以及基于Python的实现方法等[11]。面向高能物理实验时,鉴于CERN ROOT软件包在数据处理、存储、统计分析和可视化方面的强大功能[12],通常基于CERN ROOT进行开发[13-15]。本文采用在Qt中嵌入CERN ROOT软件包的方法开发通用数据显示模块,可以同时利用二者的优点[16-17]。
5 数据显示模块应用实例
图8是地震数据采集系统的结构图。前端的水听器阵列的输出信号被ADC转换成数字信号,再由数据合并节点将零碎的数据合并成数据矩阵上传[18]。根据深海地震拖缆的结构特点和对数据显示的需求,将其数据显示部分划分为以下4个数据显示模块,都可以通过配置前文所述的数据显示模块来实现。
图8 地震数据采集系统结构Fig.8 Structure of seismic DAQ system
(1)振子数据显示节点
由显示数据生成节点配置实现了振子数据抽取节点,其创建并维护一个时间尺度为1,空间尺度为2 400的数据矩阵,对数据矩阵中的数据持续刷新,在命令流的控制下以0.125 s的间隔将数据矩阵中的全部数据打包发送给振子数据显示矩阵,用于持续监控每个通道的工作状态。由于数据矩阵中时间尺度为1,所以这是一个典型的二维数据显示,利用3.1节中描述的二维直方图可以进行振子数据显示,其显示效果如图9(a)所示。
(2)地震数据显示节点
由显示数据生成节点配置实现了地震数据截取节点,其创建并维护一个时间尺度为16 384、空间尺度为2 400的数据矩阵,即可以存放地震波生成之后8 s内2 400个通道产生的所有数据,并将其传输给地震数据显示节点进行显示,地震数据同时也流向FFT节点进行快速傅里叶变换。这是一个三维数据显示,利用3.2节中的多通道折线图可以实现地震数据显示,效果如图9(b)所示。
图9 地震数据采集系统的数据显示节点Fig.9 Data display node for seismic DAQ system
(3)频域数据显示节点
频域数据显示节点会对前端生成的频域数据进行全部显示,故不需要显示数据生成节点。频域数据显示节点面对的数据维度是频率-空间-数据幅值3个维度,利用3.2节中的多通道折线图可以完成对多个通道的频域数据显示。
(4)测试结果显示节点
与频域数据显示节点相同,测试结果显示节点对前端生成的所有测试结果数据进行显示,不需要显示数据生成节点。测试结果生成节点获得通道的频域数据后进行计算并得到通道的IQC(Instrument quality control)测试结果,包括系统噪声、串扰系数、检波器噪声等,输出给测试结果显示节点进行显示。由于对于一次IQC测试,每个通道仅有一个数据幅值用于记录测试结果,所以测试结果生成节点仅需维护一个时间尺度为1、空间尺度为2 400的数据矩阵,用于记录每个数据通道的测试结果,并发送给测试结果显示节点。这是二维数据显示,利用3.1节中的二维直方图可以实现测试结果显示。
本文对数据显示节点进行了软件性能测试。在测试环境(CPU:酷睿i7-7700k,内存:16 GB,无独立显卡,系统为ubuntu18.04)中,振子数据显示节点可以同时显示全部2 400道振子数据,此时帧数据文件较小,约为9.4 KB,此时图表能够以50帧/s刷新速率流畅运行和缩放,数据量约为470 KB/s。在这种每帧数据率较小的情况下,图表能够维持很高的刷新速率,超过监控人员肉眼能够观察的极限。地震数据显示节点可以对每条拖缆中2 400个通道、16 384个时间点的数据进行显示,同时最多显示4条拖缆的实时数据,此时帧数据文件较大,约为600 MB。在这种帧数据文件较大的情况下,节点能够以每次8 s的速率流畅刷新,平均每秒数据达到75 MB。两个节点均可以稳定运行10 h以上,完全可以满足项目需求。通过配置通用数据显示模块所构建的振子数据显示节点和地震数据显示节点,证明此数据显示模块在大数据文件和高刷新速率两个相对极端的情况下都能够实现所需要的功能,可以在一定程度上证明其通用性。
6 结束语
本文分析了不同的数据获取系统中对数据显示单元的普遍需求,提出了在流处理的数据获取系统中实现相对通用的数据显示单元的方法,设计了通用的数据显示模块及与其他节点的接口结构,并在深海地震拖缆的项目背景下对其进行了实现和测试,数据显示模块显示清楚,运行稳定可靠,刷新速率高,可扩展性强,证明了所提出方法的切实可行。
基于文中描述的方法针对深海地震拖缆项目开发的显示单元将在此项目后续的联调测试中使用,同时将针对实测联调中出现的问题持续地进行改进和完善。此方法能够广泛地应用于其他不同的数据获取系统中,诸如多个高能物理实验的数据显示中,具有较强的通用性,能够极大地减小不同的数据获取系统显示单元的开发周期,减轻工作量。