李 强,张 超,钱 鸥
(中国船舶集团有限公司第八研究院,南京 211153)
随着部队作战使用需求不断提高,对雷达的主被动探测能力提出了新的需求,其中就包括舰船一维像的绘制。一维像获取方式简单,并具有很高的实时性。通过一维像可直观地观察远距离舰船目标的特性,并对舰船目标进行识别分类,对海上侦察及警戒有着重要意义。因此,研究舰船一维距离像的实时绘制具有现实意义。
现代化雷达对程序的可移植性要求不断提高,传统的在单一平台运行的一维像绘制程序已不能满足应用的需求。此外,随着现代化雷达信息传输速率和数据处理实时性能力的提高,终端软件的运行及绘制效率也应不断进步。因此,在各平台上进行复杂图形的绘制急需一个功能强大且高效的图形开发标准。
针对现代化雷达对舰船一维像绘制的需求,将QT和开放式图形库(Open Graphics Library,OpenGL)绘图工具相结合,提出了一种基于国产化的舰船一维像绘制方法。通过与雷达传统一维像绘制方法比较,本文提出的方法在满足软件可跨平台的同时绘制效率也有了显著提高,满足现代化雷达对国产化的要求,具有重要的工程应用价值。
雷达系统一般为微波高分辨率雷达,其工作频率位于高频区,工作波长远小于舰船的尺寸。此时舰船目标将连续占据多个距离单元,散射的回波形成可视化的目标图形,又称一维距离像。[1]如图1所示,它是目标精细的结构特征,描述了目标散射中心沿视线方向的分布。
图1 目标的一维距离像示意图
显控终端显示的距离像为功率距离像,是实数的一维距离像。雷达回波在经过 Dechirp处理后在 FPGA中完成 I/Q正交工作, I/Q正交之后复信号再经过IFFT加窗处理后即可形成舰船目标的一维距离像。[2]显控终端通过网络报文接收和存储一维像数据,并通过绘图软件将一维像图形显示在终端界面中。
雷达传统的一维像绘制方法有两种,一种是基于MFC开发环境使用D3D(Direct 3D)工具进行绘制,另一种基于QT开发环境使用QPaint工具进行绘制。为适应现代化雷达的应用需求,本文结合上述两种方法的优点设计了基于QT开发环境使用OpenGL工具进行绘制的方法。
D3D是一款基于Windows系统的绘制3D图形的应用程序接口。它具有良好的硬件兼容性和友好的编程方式等优点,现在几乎所有具有3D加速功能的主流显卡都能够和D3D良好的兼容。D3D工具最主要的缺点是只支持Windows平台,这极大地限制了嵌入式设备的选择,同时也有使用复杂等缺陷。
QPaint是QT二维图形绘制引擎的基类,包含了大量高度优化后的绘制函数。无论是简单的线还是复杂的形状都可调用里面的函数进行绘制,并可在多平台进行移植。由于QPaint利用CPU资源和软件技术结合,在高频绘画时占用CPU资源较高,会造成绘制复杂图形时卡顿的现象。
OpenGL是一个专业的图形程序接口,具有跨编程语言、跨平台的优点。[3]它独立于窗口系统和操作系统,拥有一个调用方便、功能强大的底层图形库,集成了曲面造型、图形变换、纹理、融合、雾化等一系列复杂的图形函数。[4]OpenGL的工作流程如图2所示。
图2 OpenGL基本工作流程图
如图3所示,一维像的绘制过程包括数据接收与转存、图像绘制、操控响应及重绘4个过程。一维像图形可根据数据处理软件发送的一维像数据报文进行实时更新。
图3 一维像绘制流程
雷达前端设备在获取回波信息后由数据处理分机转换成实数数据通过网络报文发送至显控终端。显控终端在对数据预处理后存储在缓存区域中,便于软件调用及修改。本文通过UDP通讯方式进行数据的传输。由于UDP单包发送数据量有限,将单幅一维像数据拆分成不同数据包进行发送,并通过报文触发号进行数据拼接实现全部信息的获取。报文数据接收格式如下:
Unsigned short usTriggerNum
unsigned short usCurrTriggerNo
unsigned char bykdfxData[DATASIZE]
其中,usTriggerNum为报文触发总数,用来告知接收方一维像数据拆分成的报文个数;usCurrTriggerNo为当前报文的触发序号,用来进行数据的拼接;bykdfxData为存储一维像的数据结构体;DATASIZE为每条报文中传输一维像数据的大小。
将接收到的报文个数与触发总数进行对比判断报文传输的准确性,若数据传输无误则通过触发序号进行数据的拼接。拼接后的数据格式包含10个一维原始像,其数据格式如下:
float*m_XData[HorReserveNum]
float*m_YData[HorReserveNum]
其中,m_XData用来存储X轴数据;m_YData用来存储Y轴数据;HorReserveNum值为10。最终,将拼接后的数据转存为绘制一维像图像的数据格式,格式为GLfloat vertices[verNum][2]。数据结构为二维数组,verNum为所需绘制点的总个数,vertices[i][0]为点i在X轴上的坐标位置,vertices[i][1]为点i在Y轴上的坐标位置。
完整的一维像显示界面应包含一维距离像、对应的坐标网格、两点测距线及相关的文字描述。一维距离像数据成周期性变化,而其对应的坐标网格及文字描述基本不变,加上两点测距信息根据人工操作实时改变,对界面的刷新造成一定的困难。本文将上述图形分为不同的图层进行显示。绘制单幅一维像时,不同一维距离像幅度和距离变化范围不同,需计算每副一维像的坐标网格及两点距离。绘制10副一维距离像时需计算10副一维像的综合坐标网格信息。最终,将转存后的数据调用OpenGL中的绘制函数,完成视频的最终绘制。
3.2.1 图形分层
QT提供基于图元的Model/View架构的GraphicsView框架,可将绘制的图形分层,并依据图层的层叠顺序使用Graphics Scene进行管理。完整的一维像图形包括以下功能:一维像的绘制、描述文字的绘制、两点测距线的绘制及坐标网格的绘制,依据上述功能可分为描述文字图层、测距线图层、坐标网格图层及一维像图层。如图3所示,图层的层叠顺序由上而下依次是:
(1) 描述文字图层:绘制辅助文字,如坐标轴单位、测量距离信息等;
(2) 测距线图层:实现两点测距功能,并绘制测距线;
(3) 坐标网格图层:绘制一维像的X轴、Y轴以及辅助网格线;
(4) 一维像图层:绘制一维距离像。
图4 一维像绘制分层架构
3.2.2 绘制一维像的计算公式
(1) 坐标网格
绘制坐标网格时,需计算出X轴及Y轴的最大值及最小值。以计算Y轴(幅度)最大值为例,计算公式为
MaxY=max (MaxY1,MaxY2,…,MaxY10)
(1)
式中,MaxYi为单幅一维像的幅度最大值,每副一维像都包含151 024组数据,计算公式为
MaxYi=max (Yi1,Yi2,…,Yi151024)
(2)
(2) 两点测距
两点测距线的绘制需计算两点间距离,具体方法是两点间的像素点个数与每个像素点距离的乘积,以计算Y轴幅度差值为例,其计算公式为
(3)
式中,NP为单幅一维像图形Y轴所需像素点,Y1、Y2分别为起点和终点的位置信息。
(3) 数据的转存
需将拼接后的数据转存为绘制一维像坐标位置的二维数组,以计算第i个点的Y轴坐标为例,其计算公式为
vertices[i][1]=((YData[i]-MinY/fYCell)+
TopSize)/AllSize
(4)
式中,YData[i]为第i个点的Y轴数据,TopSize为绘制一维像界面窗口相对于总体界面上端距离的像素点数,AllSize为总体界面宽度所具有的像素点个数,fYCell为单个像素点代表的Y值,其计算公式为
fYCell=(MaxY-MinY)/(AllSize-TopSize-DownSize)
(5)
式中,DownSize为绘制一维像界面窗口相对于总体界面下端距离的像素点数。
3.2.3 视频绘制
调用OpenGL绘图工具使用转存后的数据进行绘制一维像图像,具体方法如下:
(1) glBegin(GL_LINE_STRIP)开始调用OpenGL工具进行图像的绘制;
(2) glEnableClientState( GL_VERTEX_ARRAY)启用顶点数组进行图像的绘制;
(3) glVertexPointer( 2, GL_FLOAT, 0, vertices)将转存后的一维像数组数据上传至OpenGL工具中;
(4) glDrawArrays( GL_LINE_STRIP, 0, count)进行绘制一维距离像图像。
一维像图形的操控主要包括两点测距、图形放大、图形还原及一维像图形切换。
(1) 两点测距操控
将异形刀片加工成形,安装到实际割草车上开展试验研究,验证其割草效果。虽刀片扭矩有一定下降,但刀口的切割速度依然很高,实际割草效果仍能达到要求。经试验测试结果表明,优化后刀片上的扭矩减小了18%左右,与仿真计算的误差小于5%,证明仿真结果有效。另外刀片功率减小了216 W,节能约8.5%,达到了满意的节能效果。图15(a)是试验用割草车,图15(b)是优化后的异形刀片。
mousePressEvent(QMouseEvent*event)用来处理鼠标单击事件的响应函数。当鼠标在一维像图形上进行右击时将该点设置为需进行测距的点,连续点击两次表示依次选取测距的起点和终点。
(2) 图形放大操控
mouseReleaseEvent(QMouseEvent*event)用来处理图像放大时间的响应函数。当使用鼠标进行区域选择操作时将该事件的起始点信息作为需放大的图像的起始范围。
(3) 图形还原操控
mouseDoubleClick(QMouseEvent*ev)用来处理鼠标双击事件的响应函数。当鼠标在一维像图形上双击时该一维像图形还原成原始图形。
(4) 一维像图形切换操控
一维像的重绘包括定时器的调用、窗口的重新布置及重新绘制等函数,具体函数如下:
(1) initializeGL()用来初始化窗口部件,例如设置显示窗口大小,给一维像数据开辟存储空间等。
(2) paintGL()用来绘制OpenGL的窗口。数据产生变化需更新图像时调用该函数,里面包含绘制10个一维像的函数和绘制单个一维像的函数。
(3) resizeGL(int width, int height)为用来处理窗口大小变换的函数,width和height分别表示新窗口的宽和高。
(4) timeEvent(QTimeEvent *ev)为定时器函数,每两秒判断一次,若有新数据更新或有键盘、鼠标等图形操控等事件发生调用图形更新程序。
模拟器读取存于本地文件中的一维像数据,通过UDP报文形式发送至显控终端来进行仿真实验。一组一维像数据包含10副一维像图形,每副一维像图形又分为10个UDP数据包,每幅一维像的数据大小为151 024 Bit,以图形标识号进行区分。
图5、6和7分别为使用D3D绘制、使用QPaint绘制和使用OpenGL绘制的一维像图形。
图5 D3D绘制单幅一维像效果图
图6 QPaint绘制单幅一维像效果图
图7 OpenGL绘制单幅一维像效果图
使用OpenGL绘制单幅一维像图形幅度介于0~122之间,距离介于0~35 000 m之间,与D3D及QPaint绘制的一维像图形基本一致。
进一步查看操控后的一维像图形实时绘制功能,图8和图9分别为使用OpenGL画的10副一维像图像和维像放大后的图像。
图8 OpenGL绘制10副一维像效果图
图9 OpenGL绘制10副一维像区域放大效果图
在绘制10副一维像和进行放大操控时,绘制执行时间小于10 ms,整体运行流畅无卡顿。其他方法绘制效果统计如表1所示。
表1 各方法绘制效果统计表
由表1可知,在绘制能力上,D3D与OpenGL方法绘制效率较高,绘制方法比较稳定;QPaint方法只适用于绘制简单图像。在可移植性能上,QPaint与OpenGL方法可移植性高,适用于大多数系统;而D3D方法只适用Windows系统。综上所述,本文提出的方法满足现代化高分辨率雷达对一维距离像的绘制要求,可应用于国产化平台。
实验表明,本文提出的基于QT与OpenGL的舰船一维像绘制方法能够有效解决一维像的绘制效率问题及程序的可移植性问题,满足现代化雷达显示软件国产化的需求。目前,该一维像绘制软件实现了窄带、宽带雷达一维距离像绘制,将来可扩展应用作为宽带一维像图形识别研究的基础。