HLA(High Level Architecture)介绍与简要案例

HLA(High Level Architecture)介绍

图文均参考网上公开资料,仅供个人学习整理使用

关于HLA(High Level Architecture)的学习,关注其数据和交换上。其他方面不专门记录。
The topology of HLA
HLA大致拓扑结构如上图所示

HLA 关键术语解释

一些关键概念的翻译和解释:

  • Runtime Infrastructure (RTI)
    RTI 算是个软件,充当分布式仿真系统中不同联邦成员(Federate)之间的通信中介。其主要作用是确保将正确的数据传递给正确的接收者。RTI 管理数据流和同步,提供诸如时间管理、数据分发和协调等服务。RTI 是不同模拟器在一个联邦中实现交互的关键。
  • Federate
    联邦成员是任何连接到 RTI 并参与分布式仿真的单个系统(通常是模拟器)。每个联邦成员可以在仿真中模拟一个或多个对象,比如一架飞机或一队飞机。联邦成员可以是专用的模拟器,或是通用工具,如数据记录器、3D 可视化工具,甚至指挥控制系统。每个联邦成员独立运行,但通过 RTI 与其他联邦成员进行通信和交互。
  • Federation
    联邦指通过 RTI 连接并按照共同的联邦对象模型(FOM)进行互操作的所有联邦成员。这本质上是一个体系(SoS),在其中不同的模拟器共同执行一个联合仿真或任务。例如,在军事训练演习中,多台模拟器(如飞机、坦克、地面部队)可以一起在同一个联邦中运行。
  • Federation Object Model (FOM)
    FOM 是一个文件,它描述了联邦内部将要交换的数据,包括仿真中对象、属性和交互的定义。FOM 实际上充当所有联邦成员在仿真过程中用于理解和交换信息的“语言”或“模式”。它确保所有联邦成员能够有效地进行通信,定义了一套共同的数据结构和交互规则。
  • Federation Execution
    联邦执行指指某一特定的会话。例如,这可以是一次飞行员训练会话,其中多个飞行模拟器相互连接并同时运行作为联合演习的一部分。如果联邦被多次运行,则每次实例都被视为一个独立的 联邦执行。这个概念类似于使用相同的一组联邦成员和相同的 FOM 进行的不同仿真会话或迭代。
  • Federation Agreement
    当连接多个仿真系统时,需要明确决定联邦成员之间如何交换服务。这种交换方式因应用领域不同而有所不同,需要制定联邦协议(Federation Agreement)来达成一致。联邦协议中的重点是联合对象模型FOM,FOM定义了需要交换的数据类型和结构。
    Different FOMs for different domains

FOM具体内容

FOM遵循的是基于XML的HLA Object Model Template的格式(HLA 标准中对这种格式进行了说明,同时还提供了XML Schema 来验证对象模型的格式。),在 FOM(联邦对象模型)中,最重要的三个部分是对象类、交互类和数据类型,如下图 所示。
Sample contents of an HLA FOM

  • 对象类:对象是指在整个仿真过程中持续存在并可以更新属性的实体。例如,一辆车可以作为一个典型的对象类,其属性可以包括名称、位置和速度等。
  • 交互类:交互是指那些不持续存在的事件。例如,开始、停止、爆炸和无线电消息都是典型的交互类。交互通常伴随着一些参数。
  • 数据类型:数据类型描述了对象类的属性和交互参数的语义和技术表示。在 HLA 中,有许多预定义的数据类型,可以用于构建特定领域的数据类型,包括复杂的数据类型如记录(record)和数组(array)。

FOM 还包含如关于 FOM 的目的、版本、作者的基本信息等。

FOM 可以随着时间逐步扩展,而不会破坏现有的仿真。这种逐步扩展互操作性的需求非常常见。为了提高标准化和重用的效率,FOM 可以被划分为多个模块,每个模块关注特定的方面。例如飞机仿真之间的信息交换。通过这种模块化结构,可以在新的模块中扩展现有模块,增加更精细的概念。例如,一个定制化的飞机模块可以基于一个标准化的模块进行扩展。

Fuel Economy Federation 案例

燃油经济性Federation用于评估来自不同制造商的汽车在使用有限燃料的情况下可以行驶多远。每个汽车制造商都提供了一个模拟所选模型的模拟器。下图是一个联合体的示意。
The Fuel Economy Federation
Master这个federate用于管理,设置场景并控制模拟启停。
MapViewer的联合,用于显示包含汽车及其燃料状态的地图。

The HLA module of a simulation
不要尝试开发一个通用的HLA模块来适应所有的仿真情况,会导致Federation可扩展性问题。因针对特定的Federate来开发专门的HLA模块,更有效的管理和处理数据。

如下图所示,RTI由两类软件组件组成
The CRC and the LRC
每个仿真系统所在的计算机都必须安装 LRC 库。
可以将多个联邦成员和 CRC 安装在同一台计算机上,但必须确保 LRC 库安装在每台运行联邦成员的计算机上。

  • 本地 RTI 组件(LRC):LRC 是安装在每个联邦成员(federate)所在计算机上的本地库文件。在 C++ 环境中,LRC 是一个 “dll” 或 “so” 文件,而在 Java 环境中则是一个 “jar” 文件。LRC 负责与本地仿真系统进行通信,将数据传输到 RTI 并接收其他联邦成员的数据。
  • 中央 RTI 组件(CRC):CRC 是一个应用程序,它负责协调整个联邦体的执行,并跟踪已加入联邦体的各个联邦成员。CRC 通常安装在一台有固定 IP 地址的计算机上,必须先启动 CRC,联邦成员才能加入联邦。CRC 的用户界面为查看联邦运行状态提供了一个良好的总览界面。

FOM

典型FOM包含标识表、对象类、交互类和数据类型。
标识表描述了 FOM 的用途、作者和版本等内容
与参数的交互在类树中描述
称为 MIM 的预定义 FOM 模块包含标准数据类型,如HLAunicodeString
对于整数和浮点数,我们需要创建简单数据类型

在燃油经济性Federation这个案例中,会对以下信息进行建模

  • 交互类对用于启动和停止模拟以及管理场景的消息进行建模
  • 对属性和参数的许多数据类型进行建模
  • 使用对象类对汽车进行建模

首先构建标识表、与参数的交互、数据类型

标识表

标识表可能有的属性:姓名、类型、版本、修改日期、保密级别、目的、应用领域、描述、使用权限、备注

与参数的交互

案例中定义了五个交互类型,是预定义的HLAinteractionRoot的子类
Interaction classes

  • LoadScenario用于通知所有参与的联合体要运行的方案。它提供目的地的名称以及开始前要加注的燃料量
  • ScenarioLoaded交互来确认方案已加载
  • ScenarioLoadFailure的交互,用于指示无法加载方案
  • StartStop交互来控制执行。

聚焦于LoadScenario,其交互将在Federation中由Federate进行发布和订阅。它有两个参数:
ScenarioName,使用预定义的数据类型 HLAunicodeString。
InitialFuelAmount,使用用户定义的数据类型 FuelInt32。

为什么要专门定义看似通用的Int32数据类型呢?这其实非常的关键,下面给出解释。

数据类型

需要为燃料水平定义一个数据类型。通过使用一个统一的燃料数据类型,可以确保所有与燃料水平相关的参数和属性都有清晰且一致的定义。

以下几个属性字段可为参考:

  • Representation 描述了在不同联邦成员之间交换数据时的确切表示方式。在这种情况下,使用预定义的表示方式 HLAinteger32BE,这是一种 32 位的大端整数表示。在这个联邦中,我们主要选择使用 32 位整数和大端表示的浮点数。
  • Unit:燃料的计量单位是公制升。
  • Resolution:值的分辨率是 1 升。
  • Accuracy(即与真实值的正确度)为 1 升。

这些字段看似不重要,且过于详细,但实际上它们极为重要。
向一个期望接收 32 位数据的Federate发送 16 位的数据可能会导致崩溃;以加仑而不是升为单位发送数据会使联邦的输出无效;发送精度过低的数据可能会导致计算错误。

这里有一个BE大端的概念,稍微查了(AI问了下)以下大概内容如下:大端整数"(Big-endian integer)指的是一种数据的存储方式。在计算机系统中,数据可以以不同的顺序存储在内存中,特别是在涉及多个字节的数据类型时(例如 32 位整数)。大端(Big-endian)和小端(Little-endian)是两种不同的字节存储顺序。

  • 在分布式仿真或跨平台开发时,数据交换往往需要在不同的计算机系统之间进行。而不同的系统(比如 x86、ARM、PowerPC)可能使用不同的字节序。如果不统一字节序,就可能导致错误的解析。
    • 大端(Big-endian):最重要的字节(即最高位的字节)存储在最低的内存地址处,剩下的字节依次存储在更高的内存地址处。换句话说,高位字节在前,低位字节在后。
      比如:如果一个 32 位整数为 0x12345678,在大端系统中,内存的存储顺序是:12 34 56 78
    • 小端(Little-endian):最低位的字节(即最低位的字节)存储在最低的内存地址处,剩下的字节依次存储在更高的内存地址处。换句话说,低位字节在前,高位字节在后。
      比如:对于同样的整数 0x12345678,在小端系统中,内存的存储顺序是:78 56 34 12

交互——发送和接收的调用

不是很关注这一部分,只是需要知道:发送交互相对容易,但接收交互会更加复杂

对象——创建 FOM

以创建汽车对象类为例

汽车对象类

包含多个汽车属性,在这个文档中汽车对象类是预定义的HLAobjectRoot子类。
属性本身的字段可以参考对象模型模板规范,如下图所示
Attribute table
简要列出的汽车属性如下:

  • NameLicensePlateNumber 使用了预定义的数据类型 HLAunicodeString。
  • FuelLevel 使用了 FuelInt32,这也是一个交互中使用的数据类型。
  • FuelType 描述了汽车使用的燃料类型,这是一个枚举类型,我们稍后将详细讨论。
  • **Position **是一个记录类型,我们也将对其进行详细说明。

具体细节不在此列出

后续对象相关调用内容不关注

后续测试和调试内容不关注

要提的一点是,HLA更侧重的是测试Federate的互操作性方面。而验证Federation的整体仿真功能是另一个方面,它更特定于领域。

面向对象的 HLA

是一种设计模式,而非标准。旨在通过代理对象提供对共享信息的方便和类型安全的访问。

HLA 模块通常以两种方式工作:

  • 如果其他Federate注册了 HLA 对象实例,例如汽车类(Car),则 HLA 模块会提供一个对应于该实例的 C++ 或 Java 对象。随着更新的接收,该对象的属性会被填充。要获取这些值,可以使用类型安全的“获取”操作,例如 Car.getName。从技术上讲,这可以看作是一个远程或代理对象。
  • Federate可以创建自己的“本地”对象实例。HLA 模块随后将在Federation中注册该对象。可以使用类型安全的“set value”操作来更新该对象的属性值。这些属性值将自动发送给其他Federate。

DSEEP——构建Federation的过程

在这个教程中的提到了一个现实实际的流程,用于分布式模拟设计、开发和执行的过程,称为 DSEEP。如下图所示DSEEP Process for Simulation Interoperability
它包含七个步骤:

  1. 定义Federation目标和约束。在此步骤中,我们指定目标和任何约束,如时间或预算。
  2. 进行概念分析。在此步骤中,我们开发一个模拟的典型场景并生成概念模型。
  3. 设计Federation。在此步骤中,我们选择联邦,分配它们的责任,并决定是否开发新的联邦。
  4. 开发模拟环境。在开发FOM、Federation Agreement并适应或开发Federate。
  5. 集成和测试模拟环境。在此步骤中,我们进行测试,解决错误并验证联邦是否按预期工作。
  6. 执行模拟。在此步骤中,我们最终执行模拟。
  7. 分析数据并评估结果。

这个流程也是IEEE 1730-2022标准,有机会再学习

理解有错误的地方随时联系作者,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值