周 攀,谢国富,蔡伟健
(中国直升机设计研究所,江西 景德镇 333001)
随着计算机科学与技术的迅猛发展,以及军事需求的强大推动,虚拟现实技术应运而生。在这些虚拟世界中,传统的时空法则不再起作用,任何事物都可以通过编程进行模拟。虚拟现实技术是一种包含有可交互虚拟对象的虚拟仿真技术,普遍应用于现代军用仿真中。
直升机飞行模拟器作为虚拟现实技术的一种典型应用,是指直升机飞行员不需要使用真实的飞机或机场就能获得合格的飞行技能的训练系统。模拟器可用于训练飞行员进行紧急情况或危险情况下的特情处置或新机型的飞行驾驶。飞行模拟器的结构复杂,需要对包括航电仪表、飞行动力学系统、导航系统、天气系统、运动系统、发动机系统及视景系统在内的几大实时系统进行精确建模和集成。性能良好的飞行模拟器在沉浸感和交互性方面完全可以满足直升机飞行员对飞行和训练的要求,在单兵作战水平训练方面作用显著。
当单兵虚拟战场环境发展到一定水平后,为了提高训练效果,建立具有一定规模的多兵种联合作战综合演练环境变得越来越重要。国外对这方面的研究已经达到一定的专业水平,在虚拟战场环境中进行的仿真训练范围相当广泛,小到飞行员的飞行模拟训练、地面战斗车辆操作员的模拟训练,大到战斗、战术和战役的模拟演练[1]。
随着我军现代化水平的提高,一批技术含量较高的先进武器系统,包括直升机,陆续装配到部队。这些装备价格昂贵,系统复杂,操作人员面临操作步骤繁多、难以迅速掌握的问题,操作稍有不善就有可能导致装备的损坏,因此开发武器操纵训练系统便十分必要。在掌握了单台武器设备的使用后,如何在战场上配合其他武器联合作战才是取得战场胜利的关键点。在此背景下,本文进行了了利用高层体系结构技术(HLA)将多台直升机飞行模拟器加入到大型分布式仿真环境中的分析和实现,为建立一个包含多型直升机在内的综合作战演练环境做铺垫。
1.1.1 HLA仿真研究
在计算机仿真迅速发展的今天,仿真系统的日益复杂和仿真规模的不断扩大,使得完全从头开发一个大型仿真系统变得越来越困难。为了实现各仿真应用的综合集成,需要建立一个新的体系结构以及一系列新的标准,来实现各种类型的仿真应用之间的互操纵性以及仿真应用与其部件的重用。因此,美国国防部的国防建模与仿真办公室在1995年10月确立的建模与仿真主计划DSMP[2]中,提出为国防领域的建模与仿真制定一个通用的技术框架,HLA即是该技术框架的核心。
1.1.2 直升机飞行模拟器研究
直升机飞行模拟器是重要的航空武器装备论证仿真系统,它是能够复现直升机及空中环境并可以进行操作的模拟装置。飞行模拟器飞行安全可靠,可以降低训练或科研费用并缩短训练或科研周期。作为飞行训练和科研设备,飞行模拟器已显示出了巨大的作用。并且受到世界上许多国家的重视。
飞行模拟器通常由模拟座舱、运动系统、视景系统、计算机系统及教员控制台等五大部分组成。一个典型的飞行模拟器组成如图1所示。
图1 典型的飞行模拟器系统组成
对直升机飞行模拟器的研究已经发展到一定水平,能够实现对多型号直升机的飞行性能、操纵性能、故障性能、航电仪表及某些作战性能进行仿真模拟,在仿真沉浸感和交互性方面能够满足基本要求。随着科学技术的发展以及飞行员对仿真训练效果要求的提高,如何利用现有的资源建立一个复杂的综合仿真环境变得极为迫切。如果实现不同型号的飞行模拟器仿真互联,将能够大大提高模拟器的使用性能和训练效果,对未来建立多兵种联合作战综合演练环境有着极大的帮助。
HLA是一个开放的、支持面向对象的体系结构,可实现应用系统的即插即用,易于新的仿真系统的集成和管理,并能根据不同的需求实现联邦的快速组合和重新配置,保证了联邦范围内的互操作和重用[3]。HLA不规定对象由什么构成以及对象交互的规则,它考虑的重点是如何实现成员之间的互操作性,即如何将已有的联邦成员集成为联邦。这些特点能够满足对模拟器仿真互联的要求,在多台模拟器仿真互联系统中,可以将多台模拟器分别作为一个联邦成员加入到仿真联邦中[4],利用HLA的互操纵性实现多台模拟器互联的仿真需求。
以两台IPT模拟器作为联邦成员加入到仿真联邦中(见图2),各个模拟器联邦成员的系统组成如下:
1)模拟器A:①仿真管理系统;②飞行仿真系统;③航电仿真系统;④视景系统;⑤教员台系统;⑥操纵负荷系统。
2)模拟器B:①仿真管理系统;②飞行仿真系统;③航电仿真系统;④视景系统;⑤任务仿真系统;⑥教员台系统;⑦操纵负荷系统。
图2 系统整体结构图
两台模拟器均由仿真管理系统、操纵负荷系统、飞行仿真系统、航电系统等组成。HLA不关注各台模拟器自己的架构,只关注模拟器整体如何作为一个联邦成员加入到联邦应用中。软件采用C++语言编写,主要包括FDD文件的创建、联邦的创建与加入、对象类的公布与订购、对象类属性的更新与反射等步骤[5]。图3给出模拟器联邦成员创建流程图。
2.2.1 初始化成员数据
图3中,初始化成员数据主要是创建联邦数据文件,包括仿真对象模型SOM和联邦对象模型FOM两部分。
图3 模拟器联邦成员创建流程图
其中,SOM描述了联邦成员可以对外公布或需要订购的对象类、对象类属性、交互类、交互参数的特性,这些特性反映了联邦成员在参与联邦执行时所具有的能力;FOM描述联邦成员之间的信息交换。联邦数据文件一半采用XML文件格式,便于数据的解释与维护。在文件中,用
系统中两台模拟器均需识别对方直升机的实时位置、姿态等信息,因此我们在FOM中添加了position对象类,该对象类有6个属性xPos、yPos、zPos、phi(俯仰角)、theta(横滚角)、psi(航向角),分别标识各个模拟器相对于基准坐标系的当前位置和飞行姿态信息。
2.2.2 联邦的创建与加入
在本研究中,我们建立了模拟器A和模拟器B两个成员。成员之间要通过RTI进行交互,必须首先创建并加入联邦。在创建联邦之前,成员首先要连接到RTI,并将Federate Ambassador的地址传递给RTI,以便RTI向成员发送回调;然后由第一个成员来创建联邦并加入,其他成员依次加入联邦。创建联邦时需向RTI提供FOM文件。模拟器联邦成员创建并加入联邦的关键代码如下文所示。
FederateAmbassador gFederateAmbassador;
RTIAmbassador* rti;
//连接RTI,其中strIp和strPort分别为RTI的IP地址和端口号
try
{
rti = new RTI::RTIAmbassador(&gFedarateAmbassador,strIp,strPort);
}
//创建联邦
try
{
rti->createFederationExecution(strFederationName,strFDD);
}
//加入联邦
try
{
rti->joinFederationExecution(strFederateName,strFederationName);
}
2.2.3 对象类的公布与订购
模拟器A成员要获取模拟器B成员(简称飞机)的位置信息,则模拟器A成员必须订购我们前面创建的FOM中的position对象类属性,同时由飞机公布该对象类属性,并向RTI注册position对象类实例。成员在公布/订购对象类属性时需要先获取对象类和属性句柄,飞机公布并注册对象类属性的关键代码如下所示。
ObjectClassHandle hPlaneClass;
ObjectInstanceHandle g_hInstance;
AttributeHandle g_hxPos;
AttributeHandle g_hyPos;
AttributeHandle g_hzPos;
AttributeHandle g_hphi;
AttributeHandle g_htheta;
AttributeHandle g_hpsi;
//获取plane对象句柄
try
{
hPlaneClass=rti->getObjectClassHandle("plane");
}
//获取xPos、yPos、zPos、phi、theta、psi对象类属性句柄
try
{
g_hxPos=rti->getAttributeHandle(hPlaneClass,"xPos");
g_hyPos=rti->getAttributeHandle(hPlaneClass,"yPos");
g_hzPos=rti->getAttributeHandle(hPlaneClass,"zPos");
g_hphi=rti->getAttributeHandle(hPlaneClass,"phi");
g_htheta=rti->getAttributeHandle(hPlaneClass,"theta");
g_hpsi=rti->getAttributeHandle(hPlaneClass,"psi");
}
//创建公布对象类属性句柄集
AttributeHandleSet theAttributes;
theAttributes.push_back(g_hxPos);
theAttributes.push_back(g_hyPos);
theAttributes.push_back(g_hzPos);
theAttributes.push_back(g_ hphi);
theAttributes.push_back(g_ htheta);
theAttributes.push_back(g_ hpsi);
//公布对象类属性xPos、yPos、zPos、phi、theta和psi
try
{
rti->publishObjectClassAttributes(hPlaneClass,theAttributes);
}
//注册plane对象实例
try
{
g_hInstance = rti->registerObjectInstance(hPlaneClass);
}
2.2.4 对象类属性的更新与反射
飞机位置发生变化时,模拟器A成员要监视飞机位置的变化,则需要由飞机成员更新其注册的plane对象实例属性,模拟器A成员通过RTI发送的反射对象属性回调函数,来更新其显示的飞机位置。飞机成员更新对象属性的关键代码如下所示。
//飞机成员更新plane对象属性的代码
AttributeHandleValueMap theValue;
UserSuppliedTag tag;
//设置属性值,其中xPos、yPos和zPos为飞机新的位置,phi、theta和psi为飞机新的姿态
setValue(theValue,g_hxPos,&g_hxPos,sizeof(long));
setValue(theValue,g_hyPos,&g_hyPos,sizeof(long));
setValue(theValue,g_hzPos,&g_hzPos,sizeof(long));
setValue(theValue,g_hphi,&g_hphi,sizeof(long));
setValue(theValue,g_htheta,&g_htheta,sizeof(long));
setValue(theValue,g_hpsi,&g_hpsi,sizeof(long));
//将飞机的方向信息保存在tag中,orientR为飞机当前的方向
setValue(tag,&orientR,sizeof(bool));
//更新plane对象实例属性
try
{
rti->updateAttributeValues(g_hInstance,theValue,tag);
}
在仿真结束后,调用rtiAmb.resignFederationExecution()退出联邦执行,并调用rtiAmb.destroyFederationExecution()撤销联邦执行。至此,完成联邦成员的创建、加入并退出全过程。
系统采用已研的AC310型综合程序训练器和AC311型综合程序训练器加入联邦,并实现2台模拟器互联。成员加入示意图如图4所示,效果图如图5所示。
图4 模拟器联邦成员加入示意图
图5 模拟器联邦成员加入效果图
对每个联邦成员而言,加入联邦执行的操作步骤和操作内容都是相似的,所不同的只是它们所公布和订购的数据信息。因此,我们可以开发一个通用的HLA成员框架来完成这些工作,目的是将这些基本过程封装起来,以减小编写成员代码的工作量,提高联邦开发效率,也为进一步开发大型的综合仿真环境带来了可能。
由于模拟器数量有限,可以将计算机生产兵力CGF模型作为联邦成员加入到整个联邦执行中,利用后者出色的战场环境模拟和计算机兵力生产技术,使大范围内复杂作战环境的仿真成为可能。相信随着仿真技术的发展和模型的不断完善,直升机模拟器将在飞行训练和作战训练中发挥重要的作用,直升机等其他高精端武器也一定会在未来战场中发挥更关键的作用。
本文所描述的基于HLA的飞行模拟器仿真互联技术具有很大的发展前景,简单的联邦成员加入联邦执行程序已经在某型军机效能评估项目中得到了验证。
我国要想跻身于世界强国之列,就必须要有强大的、现代化的国防力量和军事威胁手段,这就要求将军事训练和战斗演习作为日常的训练科目。虚拟战场以其在军事训练演习上特有的科学性、经济性、对抗性、直观性、交互性、实时性等诸多优点,为军队提供了在新时期实现战略、战役、战术想定演练的有效途径。这也是我国仿真专业未来的发展需求和方向。