直升机CBT系统主要采用计算机仿真、计算机控制和图像处理显示等高新技术,实现一个融图形、图像、文字、曲线、图表、声音为一体的多媒体仿真平台。它可以为飞行员提供多方位的信息流,充分发挥飞行员多感官接收信息、应用信息的能力。
直升机CBT系统的组成包括主控计算机系统、网络通讯系统、环境音响系统、座舱、航电及操纵系统、视景系统等。座舱、航电及操纵系统采用软硬结合的方法进行设计,座舱中仪表板" title="仪表板">仪表板和中央操纵台上的分立仪表均为触摸响应的虚拟仪表" title="虚拟仪表">虚拟仪表,用GL Studio进行虚拟仪表开发。座舱结构、座椅、飞行操作联动机构、驾驶杆、总距杆等均做成硬件结构,通过网络将硬件机构的控制信号传给主控计算机进行处理。
直升机CBT系统中的分立仪表有气压高度表、空速表、陀螺地平仪、综合显示器、多功能键盘、油量控制板等,下面将详细介绍虚拟仪表DLL的设计开发过程,以及在GL Studio中进行调用的方法。
1 GL studio开发平台简介
直升机本文基于仿真平台GL Studio,其是Disti公司为仪表仿真软件开发提供的一套系统解决方案。用户可以利用其图形交互界面以所见即所得的方式完成仪表面板的制作,通过其代码编辑器" title="编辑器">编辑器完成仪表内部的逻辑仿真。其代码生成器能够将用户的制作结果自动生成C++和Op-enGL源代码,用户既可以将代码进行单独编译,也可以嵌入到其他程序中进行编译,从而避免了大量繁琐的底层OpenGL开发过程。
GL Studio工程可以生产两种类型的文件:一种可执行文件.exe;另一种是可独立使用的文件即DLL。在用GL Studio进行直升机CBT系统中虚拟仪表开发的时候,各分立仪表都做成单独的DLL,将虚拟仪表的输入和输出接口定义为属性。在最后的主程序开发时,只需在GLStudio的图形界面上插入各虚拟仪表DLL,根据飞行模型的需要传递参数即可。GL Studio开发虚拟仪表DLL的流程如图1所示。
2 创建虚拟仪表DLL
2.1 制作纹理
制作纹理有多种方法,一般采用数码相机拍摄实物照片,然后运用图形编辑软件处理。获取高质量的实物照片是制作纹理的关键,所以在拍摄直升机座舱仪表照片时需要设置好背景,调节好光线,选取合适的角度。制作纹理时,将仪表照片经过图形编辑软件处理后保存为*.png格式。
在进行纹理制作的过程中,采用3D MAX和Photoshop制作仪表纹理非常方便。以直升机仪表中最常见的气压高度表为例,介绍仪表纹理的制作过程。
首先,在3D MAX中,创建一个圆柱体作为盘底,再创建一个白色的小长方体作为长刻度。调整好长方体大小,将旋转轴心设为表盘中心。选择工具中的阵列选项,设置好旋转角度为36°,阵列维数为1D,数量10,按确定。同理阵列出短刻度。对立体图进行渲染,保存为*.png格式。用Photoshop打开进行编辑,添加相应的刻度数字。这种方法制作出来的表盘非常美观,而且比处理仪表照片的效率高。
2.2 设计图形界面
设计图形界面即创建仪表模型,创建的模型分为静态模型和动态模型。以气压高度表为例,高度表盘为静态模型,仪表上的指针、旋钮、气压表盘为动态模型。
GL Studio设计器支持的所见即所得绘制方式,使开发仪表工作变得简单、直观。在GL Studio中进行绘制图形和添加纹理。纹理添加完毕后,注意调整各元件之间的层次关系,确定图形的正确显示。仪表界面的最终效果如下,给气压高度表每个独立的部件进行合理命名,以方便行为代码的编写。
场压选择旋钮的制作方法:在设计面板“Geometry”栏中,高亮“PBS”点功能键“Converts Selected to GlsKnob”创建旋钮。右击生成的旋钮,在“Knob”选项卡中设置旋钮转动的角度及连续性。
2.3 定义接口
气压高度表只有一个输入接口:气压值。最少只需要添加一个属性,Baro_hPa(),通过飞行动力学模型给该属性接口传值,单位统一为hPa。
2.4 编写行为代码
气压表左下角的旋钮为场压选择旋钮。仪表右边的气压表盘会随着场压选择旋钮转动指示设定的场压值。添加变量PBS_hPa,该变量记录设定的场压值。
(1)场压选择旋钮代码编写。
旋钮的位置范围为0~100,用来设定场压PBS_hPa,气压修正范围为950~1 050 hPa。在设计气压高度表的时候,假设初始场压在1 013 hPa。
>场压选择旋钮的初始化代码
self->PositionVal(63.of);//旋钮初始位置设为63PBS_hPa=950.0+(self->PositionVal());//63.0对应场压1 013 hPa
PBSDisc->DynamicRotate(2.4 * self->Posi-tionVal(),Z_AXIS);
//气压刻度盘初始旋转角151.2°,即1 013 hPa气压值所在角度
>场压选择旋钮回调函数代码
if(ObjectEventIs(ev,“PositionVal”))
{
PBS hPa=950.0+(self->PositionVal());
//旋钮位置范围0~100,对应的气压修正范围为950~1 050 hPa。
PBSDisc->DynamicRomte(2.4 * self->Posi-tionVal(),Z_AXIS);
//气压刻度盘通过换算在0~240°逆时针旋转,与气压表盘950~1 050 hPa场压对应
}
(2)Baro_hPa()属性函数编写。
Baro_hPa()为输入接口,用来接收主程序传来的外界气压大小(静压" title="静压">静压)。3 000m以下,每升高12m气压下降133.3Pa。通过静压和旋钮设定的场压,即可算出直升机所在的高度。
>Baro_hPa()属性函数的行为代码
_baro_hPa=value;
float altitude=(PBS_hPa*100-_baro_hPa * 100)*12.0/133.3://通过静压和场压差算出高度
float alt_long=(float)fmod(altitude,1 000.of);
longNeedle->DynamicRotate(-(alt_long*(360.0/1 000)),Z_AXIS);//长指针根据高度值大小旋转,1 000 m转动360°
float alt_short=(float)fmod(altitude,10 000.Of);
shortNeedle->DynamicRotate(-(alt_short*(36.0/1 000)),Z_AXIS);
//短指针根据高度值大小旋转,1 000m转动36°
2.5 生成代码、发布DLL
选择菜单栏中code->Generate All生成代码,在Microsoft Visual Studio.NET 2003中选择编译选项为Live Component Release,编译、连接,即可生成气压高度表DLL,在Licensed LiveComponent Release文件夹下可以找到生成的Barometric Altimeter.dll。
3 DLL的加载" title="加载">加载
3.1 插入虚拟仪表DLL
在程序中,有以下两种加载动态链接库的方式:隐式链接和显式加载。而GL Studio中对DLL的加载方式更加简便,程序员不需要了解底层的加载方式即可对DLL进行操作。
在工具栏中点击“ (Inserts a Component)”,选中需要加载的仪表DLL,即可将该虚拟仪表插入到GL Studio编辑器中。调整该虚拟仪表的大小,放到仪表板底板合适的位置。插入进来的虚拟仪表DLL实际上是一个类对象指针。
3.2 给虚拟仪表DLL传递参数
插入虚拟仪表DLL并进行合适的命名后,剩下的工作就是在Calculate()对该虚拟仪表的接口进行读写操作,即传递控制参数。
在GL Studio中,Resource()函数可以读写DLL的属性,这也是在创建虚拟仪表DLL的时候将所有输入输出接口定义为属性的原因。调用方式如下:
在总仪表板程序的calculate()中给各虚拟仪表DLL传递参数,以model_作为前缀的变量是根据直升机飞行动力学模型解算出来的值:
3.3 调试并完善
在项目后期联合调试和完善的过程中,如果需要对某个仪表的功能进行修改和扩充,只需要修改该虚拟仪表的程序代码,编译连接生成新的DLL。用新的DLL替换原有的DLL文件即可。
4 结束语
当CBT系统越来越逼真,每个虚拟仪表的设计也必然会越复杂。这时采用本文所介绍的方法,将各分立仪表做成单独的DLL。采用DLL编程可以使程序层次清晰,既细化了前期开发过程中项目的分工,又使得项目后期的修改和扩展变得简单方便,极大地提高了程序的可扩充性和可维护性。