HLA仿真中的多联邦

经常有人问我HLA仿真中的多联邦问题,本讲对此进行解答。

1. HLA标准中的联邦指单个联邦

在HLA标准中,联邦定义如下。简单地说,一个联邦用于完成一定的仿真功能,包含一组仿真成员和一个FOM文件。在HLA1.3中,FOM文件的后缀为.fed。

Federation: A named set of federate applications and a common Federation Object Model that are used as a whole to achieve some specific objective.

图1是基于KY-RTI启动两个联邦的简单演示,运行环境为“飞腾 + 银河麒麟操作系统V10”。

(1)图1(a)表示执行./RTIManager.sh启动控制台程序;

(2)图1(b)表示启动KY-RTI软件包中的聊天程序,联邦名称为chat,两个仿真成员名称为c++和java,两个仿真成员分别用对应的编程语言实现;

(3)图1(c)表示启动KY-RTI软件包中的时间管理程序,联邦名称为TimeManagementExample,两个仿真成员名称为t1和t2;

(4)图1(d)表示执行ps -eaf命令查找后台运行的两个KY-RTI进程;每个进程就是DMSO RTI中提到的FedExec进程。

(5)图1(e)表示执行./RTIManager.sh的终端信息。

以上表明,两个联邦chat和TimeManagementExample是两个独立的仿真,相互之间没有任何关联。每个联邦由一个独立的KY-RTI后台服务器进程管控;服务器进程的信息显示在控制台中,也可以从运行RTIManager.sh的终端中查看。从终端中看到的信息更加详细,特别是程序的加入、正常退出、异常退出过程。正常退出是指程序结束仿真后调用resignFederationExecution和destroyFederationExecution服务退出;异常退出是指在程序运行过程中按ctrl+c强制退出,KY-RTI能够监控此行为并在退出信息之前标识“Monitor”。

(a)启动RTIManage控制台

(b)创建chat联邦

​​​​​​​(c)创建TimeManagementExample联邦

(d)两个KY-RTI进程

(e)RTIManage控制台终端信息

图1 基于KY-RTI的两个联邦

2. FED文件在仿真过程中不能修改

一个FED文件定义了在一个仿真中仿真成员之间能够交换的信息(对象类、交互类等)。当仿真成员调用createFederationExecution服务时,RTI会进行初始化,包括初始化对象类表、交互类表,给对象类、交互类分配句柄,给对象类属性、交互类参数分配句柄等。

如果在仿真过程中修改FED文件,譬如删除一个对象类,再添加另外的对象类,则会影响之前的初始化工作;实际上,HLA并没有一个这样的服务,仿真成员通过调用该服务来修改FED。

FED文件中定义的对象类、交互类代表了整个仿真涉及到的数据交换信息;仿真就像电影一样,可以写一个脚本,在脚本中描述整个仿真的演示过程。没有什么东东是不能在脚本中描述的,即使它可能是一个未知的物体,但它与外界交互的数据、对外界造成的影响是可以通过对象类、交互类来描述的,虽然它的属性值、参数值可能是变化的或随机的;如果不可描述,它就不能对其他仿真成员产生影响,在仿真中就没有存在的必要。

3. 多个HLA联邦之间的交互需要修改RTI

在一个遵循HLA规范的RTI中,多个联邦之间是不能交换信息的。如果这些联邦之间需要交换信息,则完全可以将它们合并为一个联邦。

如果修改RTI,确实能够做到在多个联邦之间交换信息。多个联邦交换数据可以有两种方式:

(1)一是通过仿真成员在多个联邦之间交换信息。譬如,当仿真成员从一个联邦收到回调信息后,再调用HLA服务转发到另外一个联邦。之前在“附录2 大联邦”一文中介绍了仿真成员在多个联邦之间的数据交换。

(2)通过RTI服务器进程在多个联邦之间交换信息。该情况较为复杂。譬如,是否需要定义一个类似下面的服务来在两个联邦之间发送交互,该服务定义了两个联邦名称,表示从联邦executionName1将theInteraction类的交互(<参数句柄,参数值>集合为theParameters)发送到联邦executionName2。另外,联邦executionName2如何识别联邦executionName1中的交互,又涉及到FED文件中的FOM数据。添加了这样的服务,意味着该RTI不再是HLA规范下的RTI。

void sendInteraction (

        const char           *executionName1,

        const char           *executionName2

        InteractionClassHandle    theInteraction,

        const ParameterHandleValuePairSet& theParameters,

        const char           *theTag);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值