郑元珠
(南京电子技术研究所,南京210013)
基于光栅扫描雷达显示器的优越性,现代雷达的终端一般采用光栅扫描雷达显示器。目前雷达的终端显示技术向小型化方向发展,并且集雷达分系统多种功能于一体。用户对雷达终端显示软件的功能需求越来越复杂。
现代战争中,空情目标复杂多变,雷达目标常常是多方向、多批次和高速度的。操作员人工录取目标已经不适合战场需求,一般雷达系统已经实现对目标半自动录取和自动录取。同时希望对当前的一些特殊空情态势以静态数字化图片的形式真实保存下来供事后分析。终端画面不仅具有实时显示雷达信息功能,而且要求对画面二次航迹图形信息进行保存,即雷达终端的显控软件必须具有“抓屏”功能。在系统运行过程中,当用户按下键盘上某个功能按键或者鼠标选择某个菜单项时,显控软件能够将当前屏幕的航迹信息以某种图像文件的格式保存到计算机硬盘上,该图像文件供事后情报分析处理使用。
雷达终端操作系统选择必须充分考虑实时性、稳定性、可靠性、安全性及多任务处理的需求。雷达小型化终端集数据处理、设备操作控制、显示及情报上报等多功能于一体。该终端承担与上级指挥所之间数据交换的功能,因此要求该终端系统必须具有很强的实时性。由于终端系统各个功能模块间有一定的离散性和耦合性,因此要求系统中实现各个功能模块的任务之间具有相对的独立性和“并发性”,且各个任务根据不同“紧迫感”应具有不同的优先级。综上所述,雷达系统要求终端系统具有实时处理多任务的能力。
根据以上多方面的要求和特点,基于优先级抢占式的多任务实时操作系统VxWorks便成为小型化雷达终端首选操作系统。它很好地解决了以往单任务模式的操作系统和以时间片为调度基础的多任务操作系统在多任务处理和实时性之间的矛盾。与VxWorks实时操作系统配套的Tornado集成开发环境在软件开发和调试方面所具有的灵活性,使得软件开发周期大大缩短。
VxWorks操作系统是当前应用比较广泛的嵌入式操作系统之一,其图形环境接口支持OpenGL规范。目前嵌入式操作系统对图形界面接口功能支持较弱,效率不高,这是目前业界研究的一个热点。在Windows操作系统下,操作系统直接支持屏幕截图功能,用户只需按下键盘“Print Screen”按键,操作系统便能够自动将当前屏幕信息拷贝到系统的剪贴板中,用户再从剪贴板将该数据拷贝到相关应用程序(如画图软件或其它图形软件),再以指定的文件格式保存所截取的图形数据。可惜VxWorks操作系统不提供该方面的接口功能,一切需要应用程序自己实现。
对于雷达光栅显示系统,若想获得屏幕的所有显示信息,最直接的方法是获得显卡中显存的像素数据,依据该数据的格式进行解包,然后再编码以某种图像文件格式保存到计算机硬盘。这需要显卡的底层驱动支持,而且开发人员必须熟悉显示芯片的寄存器结构及使用方法,同时厂家必须提供这方面的技术资料,实际上显示芯片的一些关键资料常常是很难得到的。
针对上述情况,只有另僻蹊径,尝试从其它途径寻找解决问题的方法。经过努力,发现使用Open-GL的帧缓存技术可以获得雷达终端显示画面目标二次航迹信息,从而使该问题得到较完美的解决。
OpenGL是图形硬件的一个软件接口,目前有多种操作系统支持该规范,VxWorks操作系统提供对该规范的接口功能。它的主要作用是将二维或三维的对象绘入一个帧缓冲区中。对象被描述为一系列的顶点(用来定义几何对象)或像素(用来定义图像)。OpenGL对数据进行几个步骤的处理从而将其转换成像素,这些像素在帧缓冲区中形成最终需要的图形。
在OpenGL中,图形操作的基本对象(实体)为图元,图元分为几何图元和非几何图元。OpenGL基于所谓的“管道模型”(pipleline model)。图形图元在应用程序内部生成,并经由管道传送。管道中包含一系列模块,每个模块都对经过的图元采取一项或多项操作。有些模块提供转换功能,能旋转、转换或缩放对象,有些模块负责对于OpenGL的照相机来定位对象;另一些模块则判断对象是否在照相机的视界内。在管道的末尾,那些可见的图元会被转换成屏幕上的彩色像素。图1表示了一种管道模型。
图1 OpenGL管道模型
在OpenGL中,每个图像系统的背后都有一个用于生成图像的帧缓存。帧缓存实际上是一个缓存集合。对于屏幕空间上的每个x,y值,都有与之相对应的位组,该位组可以看作是通用图片图元或像素。这些像素可以由32位前台缓存RGBA值、32位后台缓存RGBA值和32位深度缓存值各位的合成。位组的大小通常是字节的整数倍。可以根据帧缓存中写操作执行的位置写入深度像素或 RGBA像素。OpenGL允许使用一次函数调用来读取或者写入该类像素的矩形块。该操作被称为位块传输操作。
读取像素操作包括定位到帧缓存的正确位置并从该位置提取数据。然而实际情况并不是如此简单,必须考虑像素格式在应用程序、文件及帧缓存内部的差别,还必须考虑不同体系存储离散数据方式的差异给处理带来的复杂性。
像素管道处理过程如图2所示。
图2 OpenGL像素管道模型
OpenGL提供了3个处理图像数据的基本函数:
(1)glReadPixel():从帧缓存中读取一个矩形像素阵列,并将其存储到处理器内存中。
(2)glDrawPixel():从处理器内存中读取一个矩形像素阵列,并根据glRasterPos*()指定的当前光栅位置,将其写入到帧缓存中去。
(3)glCopyPixel():将一个矩形像素阵列从帧缓存的一个地方复制到另一个地方;其功能类似于调用glReadPixel()和glDrawPixel(),但不将数据写入到处理器内存。
在应用程序中,主要用到glReadPixel()函数,将像素从帧缓存转移到系统内存。该函数的原型为:
Void glReadPixels(Glint x,Glinty,GLsizei w,GLsizei h,GLenum format,Glenum type,GLvoid*array)。
该函数功能是从帧缓存的(x,y)开始,读取w×h个像素矩形,放入计算机缓存array。像素格式由format指定,写入数据类型是type。
雷达终端显示软件使用该函数获取当前帧缓存中颜色缓存数据,然后进行解包、编码,保存图像文件,实现屏幕“抓屏”功能。
BMP图像文件最早应用于Microsoft Windows系统,由于桌面操作系统的普及,对BMP图像文件系统支持越来越多。BMP文件格式有以下特点:
(1)设备独立性,它以一种独立于设备的方法描述位图;
(2)可用非压缩格式存储图像数据,保证解码速度快;
(3)支持多种图像的存储。
BMP图像文件由以下几部份组成:位图文件头(BITMAPHEADER)数据结构;位图信息(BITMAPINFO)数据结构;位图阵列。
各数据结构的详细格式及含义参见相关资料。由于BMP文件格式对图像数据没有压缩,多操作系统支持,从OpenGL帧缓存所得到的数据不需要特殊处里,可以直接保存为bmp格式文件,所以选用该格式保存图像数据。
程序部分代码如下所示:
像素读取的返回值受帧缓存分辨率限制。读取像素值时,首先应该检查当前像素颜色分辨率位数,可以使用类似下面查询函数来确定位数:glGetIntegerv(GL_RED_BITS,&nbits)。
读写RGBA值时,在帧缓存中处理颜色缓存。当应用程序在单缓存模式时,默认情形下,在Open-GL前台颜色缓存(GL_FRONT)执行读和写操作。在双缓存模式中,默认情形是在后台(GL_BACK)绘制对象。
大多数OpenGL还支持其它颜色缓存。所以在程序中必须指定所操作的缓存对象,使用函数gl-ReadBuffer()为读操作选择一个缓存。
使用函数glReadPixels()来读取RGBA或颜色索引时,必须指出要从哪个缓存中读取。例如,如果使用了双缓存,必须指出要从前缓存还是后缓存读取数据。为此,可使用函数glReadBuffer()选择要读取的缓存类型。
在本应用程序中,每屏抓取后保存的BMP格式图像文件大小计算如下:
假设雷达终端屏幕显示分辨率为1600×1 200,每像素颜色采用24位表示,以非压缩格式保存。位图文件头为14字节,位图信息结构体长度为40字节,则保存后文件大小为:1 600×1 200×3+14+54=5 760 054字节。
上述文件占用空间较多,在任务执行完毕,可以将上述文件拷贝到Windows操作系统下,运行其它图像处理软件(如PhtoShop,ACDsee等软件),将上述BMP文件进行压缩或者转换为其它格式图形文件(如JPEG格式)。
之所以没有进行实时压缩,主要考虑到图像压缩处理运算需要消耗较多的计算机资源,对显示软件的其它任务运行会产生一定的影响,所以留到任务结束后再处理。因为只要获得了显卡的原始显示数据,图像数据的后续处理技术途径较多,不再赘述。
采用OpenGL帧缓存操作技术和BMP图像文件技术解决了VxWorks操作系统下雷达终端显示软件对目标航迹图像获取及保存问题。实践证明在目前应用条件下,该项技术的应用满足用户对雷达系统的功能需求。图3所示为VxWorks操作系统下所获得的雷达屏幕二次航迹图像信息文件在Microsoft Window s操作系统下的显示。图像文件格式为BMP,用普通的图像文件浏览器就能查看。该二次航迹信息与屏幕航迹信息一致,无信息丢失。目前在显示软件中仅用到OpenGL帧缓存中的颜色缓存,没有使用到深度缓存、累积缓存等其它缓存。帧缓存中其它缓存对屏幕“截图”结果的影响及处理有待后续工作中进一步探索。
图3 雷达二次航迹图像文件在Microsoft Windows下恢复显示(部分画面)
[1]丁鹭飞.雷达原理[M].第3版.西安:西安电子科技大学出版社,2002.
[2]Edward Angel(美).OpenGL程序设计指南[M].第2版.李桂琼译.北京:清华大学出版社,2005.
[3]董士海.图像格式编程指南[M].北京:清华大学出版社,1995.