基于MFC的Vega Prime航空飞行器动态视景仿真

2019-10-14 11:14旺,刘西,南
指挥控制与仿真 2019年5期
关键词:飞行器轨迹救援

孙 旺,刘 西,南 英

(南京航空航天大学航天学院,江苏南京 210016)

Vega Prime由Multigen-Paradigm公司开发,当前被CA公司并购。Vega Prime是一款实现高性能三维视景仿真的软件,它取代了之前版本的Vega,引进了较新的编译器和新的图形学相关理念和技术,使得用户可以更加方便地配置视景仿真,能够满足各种背景条件下的实时仿真要求[1]。

MFC是微软基础类库,采用MFC对话框程序可以方便地构建人机交互界面[2],实现对Vega Prime API的充分利用,同时扩展了Vega Prime的交互性,便于人对仿真过程的参数设置,由于MFC的封装效果,操作人员可以通过改变输入参数和文件实现在不接触代码的情况下改变仿真场景以达到相应的视景仿真效果要求。

Vega Prime在提供高级仿真功能的时候满足:支持跨平台性,可以在任意操作系统平台上开发,且无需更改即可换平台使用;与C++STL兼容,这也使得MFC框架构建以及运行成为可能;具有多种可扩展模块以满足不同的仿真要求;同时支持OpenGL 1.2和Direct3D 8等。

本文在构建视景仿真时使用Vega Prime2.2及配套的开发工具VS2005,主要完成了以下工作:设计开发的基本流程,从两个方面研究了航空飞行器动态视景仿真:三维数字高程地图模型中的飞行轨迹展示,海上空投数据的实时刷新,视角动态切换和目标帧的捕获。

1 航空飞行器动态视景仿真

1.1 发展背景及意义

近年来,各种类型航空飞行器已经不仅仅运用于军事背景下,同时还服务于社会生产生活,在越来越多的任务中验证飞行过程以及目标完成的可靠性时,需要繁杂且费力的实验,而通过航空飞行器视景仿真可以减少经费开支,确保安全。

同时在航空数据处理方面,科学技术的发展使得航空数据量包含的信息越来越多,而视景仿真可以将其转换成直观的几何图像信息,便于综合分析,解决问题。

因此,航空飞行器的视景仿真在整个任务系统中显得越来越重要。

1.2 Vega Prime系统结构

Vega Prime的应用主要由应用程序、应用配置文件和模型包等组成。其中,应用程序控制场景等动态模型,如通过VC7创建应用程序,而应用配置文件包含了应用在初始化和运行过程中的一切信息,配置成.ACF文件,模型包则是通过类似Creator创建的几何模型(.Flt文件或大面积地形文件),三者共同作用即可实现相应任务要求。其配置关系如图1所示。

图1 Vega Prime的系统构成

1.3 基于MFC的视景仿真开发基本流程

Vega Prime视景仿真的开发可以从应用配置文件开始,在这里配置文件使用Lynx Prime,它可以通过图形界面简单地配置仿真的基本构架,大大简化了开发的过程。通过对Lynx Prime图形界面的配置满足基本的框架要求,保存相应的.ACF文件,之后对于更高要求的视景仿真需要根据该.ACF文件生成相应的.cpp文件,直接生成的.cpp文件不能直接运行,需要经过些许改造,同时改正相应的错误,包括头文件中包含的

#include "vpPathWayPointSet-WayPoint.h"

注释该头文件,并将涉及的所有该类型改为vpPathWayPointSet::WayPoint类型,在文件路径presagisVega-Prime-2-2-1-VC8includevegaprime下修改头文件VppatthFileWriter.h,提取其中名为vpPathSetSelector的部分并新建该名称的头文件。

同时对于.cpp中的部分函数:

SetRenderState()

直接生成的cpp文件该函数存在参数错误问题,可以通过重新定义的方式:

vpPathRenderState*state-lineyes=new

vpPathRenderState();

state-lineyes->setLineColor(…)

……∥配置渲染状态

state-lineyes->setLineEnable(true); pPathWay-PathWay->setRenderState(state-lineyes);

以及addWayPointSet()函数的参数可能在自动生成过程中类型有误。

之后设计需要满足仿真要求的MFC框架,并将之前生成的.cpp文件改造为类中的静态成员,根据基本要求相应地改造代码实现视景仿真,基本流程如图2所示。

图2 开发基本流程

1.4 Vega Prime基本工作流程

Vega Prime基本工作流程在主函数中可以分为初始化、定义场景、配置场景、设置窗体、帧循环,退出[3]。对于不同的仿真要求,场景的定义存在很大差别[4],同时对于要求更高的仿真可以在帧循环中对场景进行控制,图2中的最后MFC界面及Vega Prime代码配置框架具体如图3所示。

图3 Vega Prime主函数配置框架

2 飞行器山地机动飞行

2.1 大地形Open Flight模型制作

飞行器在山地机动飞行,根据地理高程数据优化得到的飞行轨迹在展示过程中,需要与地形模型相搭配才能体现飞行轨迹优化的效果,地形制作对于视景仿真来说显得格外重要。

Vega Prime有支持大地形数据库的模块vpLADBM,用于管理地形几何数据,从MetaFlight格式文件读取相应的信息。该地形制作方法功能强大,可以实现地形、贴图、文化特征等的配置,但对于在Lynx Prime中的配置和MetaFlight的制作相对复杂。这里,采用OpenFlight格式数据文件实现对飞行场景的构建,功能较少但简单可靠。

采用Creator软件[5]制作OpenFlight格式的地形文件,关键在于飞机飞行区域跨度大,要求能够在区域内任意优化出的飞行轨迹都能有对应的地图场景模型。纬度范围在25.690 849 753 6°-28.115 0°,经度范围在99.178 938 259 5°-101.607 2°,经度、纬度的跨度都在数百公里。同时飞机的轨迹优化精度为30 m左右,需要保持地形精度与该精度相近。地形大,精度要求高,在电脑性能(8G内存)相对不足的情况下,采用地图分块制作[6-7],加载的方法可以满足制作要求,在视景仿真过程中通过部分地图块加载来减小系统负担,分块如图4所示。

图4 地图分块情况

划分完毕后,需要通过Global Mapper软件将数据信息.ASC文件转化为数字高程模型.DEM,在Creator的Terrain模块中先由DEM文件生成对应的.DED文件,在新建的各个地图块中选择地图生成模式和间隔距离,高度差异由颜色深浅区分,可以得到上述36块地形OpenFlight模型,其中A1模型如图5所示。

图5 A1地图制作情况

2.2 轨迹数据及地图模型加载

地图数据库建立完成后,需要构建MFC框架,基本流程参考图2、图3,对于MFC的按钮及相应的入口消息函数分别指定为:地图数据库模型文件、飞行器模型文件、飞行器轨迹数据文件、涉及地图信息文件,运行及关闭按钮。对于前四种处理函数都是返回一个文件地址或者一个文件夹地址留出接口给用户自由配置,运行按钮定义了主线程,同时添加了关闭控制参数用于关闭按钮,地址返回消息处理函数可参照:

UpdateData(TRUE);∥写入数据

∥指定文件限制类型

Char szFilters[]="vehicle-on-Earth-Orgn(*.m)|*.m|All Files (*.*)|*.*||";

∥定义路径选择对话框对象

CFileDialog objFileDialog(TRUE,NULL,NULL,OFN-HIDEREADONLY,szFilters,this);

int nRet=objFileDialog.DoModal();

if(nRet !=IDOK)

return;

CString strFileName=objFileDialog.GetPathName();

∥文件路径赋值给CEdit类型控件变量

mfc-guijidatapath=strFileName;

∥赋值给全局变量 LX-global::lx-guijidatapath=mfc-guijidatapath;UpdateData(FALSE);∥显示数据

构架完成后,已经配置好对外接口,内部数据传递通过定义全局函数LX-global将MFC的输入信息传递到Vega Prime的Public-Member类中,同时LX-glob-al可以实现数据存储,便于其他类的调用,其基本框架如图6所示。

图6 类关系图

飞行器飞行轨迹以及地图块的配置在定义场景中,具体可以参照图3中的PublicMember::CTS-Define()函数,在该函数中实现对飞行轨迹及地图的加载。

输入接口中包括四个文件,首先读取涉及地图信息文件,该文件含括地图编号,并按照向南飞顺序排列,向北飞倒序排列,使得第一项始终为飞行起点位置,同时还包含所有地图的总量。读取所有涉及数据信息,并获得所涉及地图块的左下角经纬度坐标。配置过程根据地图数据块的数量进行循环配置,将轨迹的起点位置所在的地图块作为偏移量为0的地图块,这样可以减小轨迹与地图模型之间的误差。同时记录该地图块的经纬度坐标作为基准,偏移函数:

PObject-dixing[j]->setTranslate(0,0,0);

其中,PObject-dixing[]是vpObject定义的对象,j是循环次数变量从0开始,当为0时设置偏移量为0,之后根据该地图经纬度与起始块经纬度的差值设置地图块加载的偏移量:

Ix=(ll[0]-a[0])*cos(a[1]/180*3.14)*111 000;

Iy=(ll[1]-a[1])*111 000;

PObject-dixing[j]->setTranslate(Ix,Iy,0);

其中,ll是当前地图块的经纬信息,a是起始块的经纬信息,其余配置默认,并将其添加到定义的myScene的子类下。

轨迹的读取配置有两种方法:其一通过坐标转换vpCoordSys模块,将经纬度坐标直接配置到路径之中,通过该转换将坐标投影到以起始经纬度为基准的路径当中,该方式实现轨迹效果良好,但对姿态不可控。这里采取第二种方法,直接坐标转换,坐标转换方式同上,变量名换为mx,my,mz为高度:

Pathway-pointset[i]->setPosition(mx,my,mz);

Pathway-pointset[]为vp::PathwayPointSet::Way Point定义的对象,i为第i个点,同样可以控制姿态:

Pathway-pointset[i]->setOrientation(h,p,r);

实现了航空飞行器的6D飞行轨迹展示,具体流程参照图7。

图7 地图-轨迹配置流程

剩余文件即飞机模型的配置,对于任意飞行器模型只要确定文件路径,即可加载到视景仿真系统中。

2.3 仿真实验效果图

对于完整的MFC程序框架,须在程序非正常执行时返回到就绪状态。这就要求在定义场景中,有错误检测,一旦触发就提示消息,并返回到初始状态。本程序通过LX-global全局类函数记录程序运行错误信息,并在返回线程主函数时进行消息提示,如图8所示。

图8 非正常运行错误提示图

对于起点位置经纬度99.8°,26.4°,终点位置经纬度100.5°,27.5°,正确配置文件后得到仿真结果如图9所示。

图9 仿真结果

3 飞行器海上空投救援物资

3.1 飞行器海上空投视景仿真

飞行器海上空投视景仿真的主要目的是完整展现空投的整个过程,对于由不同的初始条件引起的空投结果区别,可以通过视景仿真进行直观的观察,从而对不同初始条件下的空投效果进行比较,尤其是对落体在空中的姿态变化和落点位置的变化。

与飞行器山地飞行相同的是开发的基本流程,如图2、图3。区别在于:飞行器山地飞行关键在于任意飞行轨迹与相应的地形相契合,而飞行器海上空投重点在于仿真背景构建及相应控制功能的实现,因此两者侧重点不同,涵盖了更多关于航空飞行器视景仿真的要点。

3.2 Lynx Prime配置仿真框架

海上空投救援物资的基本背景包括:海洋,飞行器,救援物资模型,遇难船只模型,环境等。由基本流程框架图2可知,首先在Lynx Prime中基本实现整个视景仿真的框架,该框架是为了之后在MFC中添加控制功能以实现完整的视景仿真,Lynx Prime的基本配置过程如图10所示。

图10 Lynx Prime配置过程

在窗口下定义不同的通道,以从不同角度分别展示空投救援物资的过程,包括固定视角俯视,其可用于观察救援物资落点位置与目标位置以及救援物资下落轨迹的偏航情况;固定视角侧视,其可用于观察落体的轨迹在初始速度方向所在的铅锤面的轨迹。从以上两个视角可以完整的观察到轨迹情况,对于最后一个窗口用来观察救援物资在下落时的姿态变化,而姿态变化的镜头配置上先采取vpMotion运动模式,以落体中心为旋转中心,可以通过鼠标调整角度以及视角相对下落物体的距离。各个窗口占比,姿态观察窗口占右半窗口,轨迹观察窗口平分左半窗口。

海洋环境Vega Prime中有两种方式:1)直接使用自带的ocean.flt文件;2)使用Vega Prime的海洋模块vpMarine。ocean.flt文件配置简单方便,但是效果远不如海洋模块。这里配置使用海洋模块,具体需要设置海洋位置为以观察者为中心,海浪生成参数等,同时需要将三个通道的观察者配置到海洋模块下,防止部分通道缺少海洋景象,或者配置三个海洋模块分别与相应的通道观察者结合。除了海洋场景,还有云层、太阳等一些其他的环境因素,同样配置在各个观察者中。

配置各个模型在该场景下的运行轨迹,飞机的飞行轨迹设为高度不变且没有偏航的直线,救援物资的轨迹由轨迹文件给出,小船是为增加场景的完整度,其轨迹尽可能靠近落点目标区域。Lynx Prime中配置轨迹使用vpPath模块按照相应的顺序,在运动对象文件下进行配置,包括导航器、路径、插值算法、路径集合选择器、路径点集合、路径点。可以通过手动配置各个数据点,也可以通过.WAY和.NAV文件直接配置,当路径点数较多又需要在搭建框架时考量路径时,考虑使用.WAY文件,该文件的格式是XML超文本标记语言,生成该类文件只需通过VC对轨迹数据文件进行相应的读取,同时对.WAY文件严格按照所给格式要求写入即可,使用时直接import该.WAY文件再配置到正确位置即可。对于还要生成C++文件进行动态配置轨迹的视景仿真来说,可以在二次开发的过程中进行轨迹加载,此时不能通过预运行检验基本框架。

仿真过程缺少特效,仿真的逼真程度大打折扣。救援物资落水后会产生相应的水花,实现该效果需要使用vpFx特效模块和vp模块中的碰撞检测[8-10]。由于救援物资的外包装为长方体,因此使用包围盒算法,将救援物资视为长方体包围盒,将碰撞对象海面视为水平面,则判断救援物资与海面是否碰撞的依据是:长方体的8个顶点中是否有一个点或多个点在海面的下方。具体情况如图11-图13所示。图11中,整个长方体在平面上方,表示救援物资与海面没有发生碰撞;图12中,长方体的一个顶点在平面上,其余顶点都在平面上方,表示救援物资与海面没有发生碰撞;图13中,长方体的一个顶点在平面下方,表示救援物资与海面发生碰撞。

图11 未发生碰撞

图12 临界情况

图13 发生碰撞

当长方体包围盒与平面相接触时会产生一个信号,产生相应的落水特效,通过vpFx特效模块可以产生任意形态的水花。相关水特效即溅起水花的形态(角度、高度等),与落水物体的形状、质量、落水时的姿态与速度等有关,可由流体力学计算得出。本文只作救援物资落水的特效展示,水花的细节并非经过严格计算得出。

碰撞对象只能在海洋模块下添加Ocean.flt模型,小船的模型添加vpFx火焰与烟雾的特效,在海洋模块中还配置其生成的舰首破浪和舰尾尾浪特效,均使用海洋模块中的特效。

视点与轨迹距离较远,无法具体看到落体的实时位置,因此,为观察完整的轨迹,对落体进行相应的标记,使用vpOverlay模块中的“LineStrip”,根据各个点的排列顺序形成一个“X”形标记,设置标记对象为落体,在仿真过程中即可以看到落体在轨迹上的实时位置。

Lynx Prime配置如图14所示。

图14 Lynx Prime配置图

运行后效果图如图15所示。

图15 Lynx Prime预运行示意图

3.3 VC实现控制功能

Lynx Prime搭建完成框架后,输出为.CPP文件,并构建MFC基本框架,其流程如图3,而类之间的关系参照图6。VC实现控制功能具体包括添加多条轨迹、对于不同轨迹设置不同的投放时间,即延时投放或提前投放,同时设置投放倒计时时间,将以上两项设置为输入,实时显示当前速度值,当前时间以及根据设置的投放倒计时显示当前的倒计时时间,在程序运行时作为输出显示;设置视角切换,可以在视景仿真运行时切换视角观察不同的落体下落情况;设置获取当前帧,定格当前帧画面以便分析。

在MFC对话框类中,配置窗口界面的输入和输出信息,可参照图16。

图16 VC控制功能

定义开始,退出按钮,其中在开始按钮的消息响应函数中获取ID为IDC-grScene的分组框句柄,并赋值给CTS-RunningWindow,以此作为Vega Prime应用程序的运行场所,为控制变量赋值,即允许帧循环并将退出标志置假,最后启动线程主函数。

定义切换视角按钮,在消息响应函数中对标志位进行重复的取反赋值操作,实现对两条不同轨迹观察视角的来回切换,同理定义获取当前帧按钮,实现对当前帧的暂停与继续。

设计输入为投放延时时间和设置倒计时时间,投放延迟时间决定两个救援物资投放时间的差值,以区别两条下落轨迹,设置倒计时时间,模拟飞行过程中投放时机判断。在MFC框架中,定义数据显示按钮,并在其消息响应函数中通过while循环不断地对编辑框变量进行赋值,并手动推动消息循环,直到有仿真结束的信号为止。

在PublicMember类中主要针对场景定义函数CTS-Define()以及主线程函数中的帧循环进行配置。

开始按钮按下后,进入主线程并按照如图3所示进行相应的配置,在主线程中设有关闭控制变量,由退出按钮改变该变量继而控制程序的退出。

在主线程中的CTS-Define()函数下实现对之前由Lynx Prime配置的.ACF输出的.CPP的修改,包括轨迹点的加载,对照轨迹的设计。倒计时时间决定投放前的飞行时间,延迟时间决定投放物资的时间间隔,通过这两个输入值实现对上面函数的改造,具体过程可参照图17。

图17 CTS-Define()轨迹点配置

路径点配置完成后,画面的配置完成,在帧循环中实现对仿真过程中每一帧的展示,同时还要实现MFC程序中的数据刷新,视角切换和目标帧获取。

在主线程函数的帧循环中实现对于数据的更新,仿真时间的更新从0开始计数,在帧循环的开始时刻设置仿真时间为0。

vpKernel::instance()->setSimulationTime(0);

在帧循环内部,首先获取当前的时刻,采用:

vpKernel::instance()->getSimulationTime();

并将该函数的返回值最终赋到mfc类的变量当中,投放倒计时与当前时间相关,帧号,帧率等与时间函数设置类似:

vpKernel::instance()->getActualFrameRate();

对于实时显示的速度值,可以采用多种方式获取。一元区间不等距插值,或自带函数获取。

由按钮实现视角的切换,在两条飞行轨迹中进行视角切换,具体方法包括:1)在定义场景的过程中定义镜头的轨迹,并控制策略使能为真,即按照预定义的飞行轨迹点飞行,当设置切换时,更改对应镜头的飞行轨迹路径。该方法实用性好,切换速度快,并且切换后稳定性好,缺点是对于场景定义配置。2)实时获取镜头当前位置,并再次为镜头配置切换后视角的位置。该实现方法灵活性较大,适用于变化较多的实时场合,但是切换后的镜头稳定性与电脑的处理速度相关。

3.4 仿真实验效果图

根据以上的配置来展现海上空投的整个过程,可以实现数据的实时刷新,视角动态切换和目标帧的捕获,仿真结果如图18所示。

图18 海上空投视景仿真

4 结束语

本文详细介绍了Vega Prime结合MFC应用程序的开发流程。针对视景仿真中大范围地图的飞行仿真加载问题,给出了大地图制作及飞行轨迹生成的详细过程;针对海上空投过程完整展现的问题,给出了仿真背景的构建及相应控制功能的实现。本文为相关Vega Prime视景仿真的开发提供一定的参考。

猜你喜欢
飞行器轨迹救援
紧急救援
解析几何中的轨迹方程的常用求法
高超声速飞行器
基于支持向量机的飞行器多余物信号识别
3D打印大救援
轨迹
轨迹
救援行动
神秘的飞行器
紧急救援