KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

2023-05-16

       基于当前的RTI构建1000个以上成员的仿真系统在一些人看来似乎是极具挑战性的一个问题。如果你对当前的计算机技术、网络技术、仿真技术真正了解的话,其实构建这样的一个大规模仿真系统是完全可行的。本章以聊天程序为例,介绍了基于KY-RTI构建1000个仿真成员的两种方法:基于单个RTI服务器的大联邦;基于桥接程序实现多个RTI服务器的大联邦。从HLA的概念来讲,每个RTI服务器及其所有仿真成员可以称之为一个联邦,联邦之间不会发生数据通信;然而,本章的桥接程序能够实现多个RTI服务器之间的数据通信,也可以理解为多个联邦之间的数据通信;从而为大规模仿真提供了强有力支持。本章最后部分介绍了KY-RTI的桥接程序加入两个RTI服务器并将从一个RTI服务器接收到的数据转发到另外一个RTI服务器的源代码实现方法。另外,本章还简单探讨了以KY-RTI为代表的国产自主软件和DDS的个人看法。

11.1基于单个RTI服务器的大联邦

       单个RTI服务器能否支持1000个成员的仿真系统,这一点与RTI本身的实现技术、仿真精度、仿真步长、网络延时、网络带宽等密切相关。通常,一般的RTI都无法做到这一点。下面是1000个仿真成员基于银河麒麟操作系统加入KY-RTI的示意图。上图是1000个仿真成员加入之前RTI服务器的状态;下图是1000个仿真成员加入RTI服务器之后的状态。从这一点也可以看出KY-RTI的大规模仿真支持能力。

                                                图11.1 1000个仿真成员加入单个RTI服务器

       通过单个RTI服务器实现1000个成员的仿真系统,与多个RTI服务器相比似乎具有一定的“瓶颈”特征,即数据集中于单个服务器不如分散于多个服务器。其实,随着网络技术的发展,特别是万兆以太网、5G技术的发展,网络延时大幅降低、网络带宽大幅提高,有些以前不可能实现的技术会成为可能;甚至具有同样计算能力的超级计算机的规模也会因此变小。

11.2基于桥接程序的多个RTI服务器的大联邦

       KY-RTI除了单个RTI服务器支持1000个仿真成员外,也可以基于桥接程序把多个RTI服务器连接起来,从而实现更大规模的仿真系统。该方法特别适合于集群系统和部署于多个仿真应用机构的大规模仿真系统。

       图11.2是基于银河麒麟操作系统进行的两个RTI服务器之间互操作演示示例,图11.3是相应的逻辑结构图。该例涉及到两个RTI服务器(RTI1和RTI2)和3个仿真成员(chat1、bridge、chat2)。两个RTI服务器RTI1、RTI2使用的端口号分别是10000和20000。

       仿真成员chat1和bridge加入到RTI1;仿真成员chat2和bridge加入到RTI2。这3个仿真成员可以实现相互之间的聊天功能。从图11.2可以看到,当chat1说“I’m chat1”,bridge说“I’m bridge”,chat2说“I’m chat2”时,其他两个仿真成员都能够收到该仿真成员的聊天内容。

       在这样的仿真系统中,桥接成员bridge起到了关键的作用,它可以把原本相互隔离的两个RTI服务器连接起来,共同实现更大规模的仿真。

                                                 图11.2 一个桥接程序加入两个RTI服务器的示例

                  

                                                 图11.3 一个桥接程序加入两个RTI服务器的逻辑结构图

       按照HLA的概念,每个RTI服务器及其仿真成员可以称之为一个联邦;两个RTI服务器涉及到两个联邦;联邦之间一般是不会通信的。因此,上图所示的联邦之间的通信不仅需要bridge支持,RTI本身也需要进行修改才能够实现。一般的RTI不会支持多联邦通信,除非你对其进行适当的改造。

       在理解了前面两个图之后,使用桥接程序可以将多个RTI服务器以各种各样的方法进行互联,实现更大规模的仿真。

       图11.4是图11.3的另外一种表示形式,一个桥接成员连接了两个RTI服务器,每个RTI服务器拥有1个仿真成员和1个桥接成员。桥接成员其实也是1个仿真成员,只是它的作用与一般的仿真成员不同,这里暂时把它们区分开吧。

                       

                                                  图11.4 图11.3的另外一种表示形式

       在图11.5中,每个RTI服务器拥有32个仿真成员和1个桥接成员。

                   

                                                  图11.5 2个RTI服务器各自拥有32个仿真成员和1个桥接成员

       图11.6是图11.5的简化形式。

                                 

                                                  图11.6 图11.5的简化形式

       图11.7是3个RTI服务器通过桥接程序互联的情形。

                              

                                                  图11.7 3个RTI服务器

       图11.8是1个大联邦,中心是1个RTI服务器,它拥有32个桥接成员,每个桥接成员连接到另外一个RTI服务器;每个这样的RTI服务器除桥接成员外,含有32个仿真成员。这样,如果忽略桥接成员,整个系统共有32*32=1024个仿真成员。

       由1000个以上仿真成员构成的大联邦可以采用各种各样的结构,图11.8只是其中的一种形式。可以采用层次式结构、网状结构、条状结构等。

       图11.8适合集群部署方式,可以采用33个节点,每个节点部署1个RTI服务器。其中,一个节点部署32个桥接成员;其他节点各部署32个仿真成员和1个桥接成员。该图也适合大规模分布式仿真,可以部署于互联网上的多个地点。

     
           

                                                  图11.8 由1024个仿真成员构成的大联邦

11.3关于软件和DDS

       在本文结束之前,就KY-RTI软件和DDS说点儿看法。

       (1)可执行码。正如麒麟、中标、深度等国产操作系统一样,可执行码可以免费提供给大家使用;但不会得到更多的技术支持,并且可能存在部分限制;以麒麟操作系统为例,图11.2中的“[Unauthorized System]”表明这并不是一个得到了技术支持的操作系统,然而通常并不影响用户使用。国产操作系统在推广使用的过程中,得到了国内很多有实力单位的大力支持,包括项目和资金的支持,正是有了你们的支持,以国产操作系统为代表的自主软件才能够更好地发展,这对于研制和使用双方而言是共赢的。

       (2)源代码。源代码不免费提供,需要者请联系作者(walt_lbq@163.com)。对于用户而言,即使获得了国产自主软件的源码,但没有技术支持,你会很难理解并做出本文所说的这么多事情。随着技术的进步,RTI的设计方法和性能都会得到进一步的发展和提高;除了把KY-RTI换个名外,你真的知道怎么做吗? 如果针对你的仿真系统做进一步的功能扩展,或者裁剪RTI功能,你能顺利做到吗?

       (3)DDS(Data Distribution Service,数据分发服务)。DDS定义了一套用于分布式程序基于主题的发布订阅机制,相当于HLA中的公布订购机制。从仿真应用程序接口API角度来看,DDS仅相当于实现了HLA的部分功能;并且需要用户定义自己的API,这样就会导致不同的仿真系统难以集成到一起的问题;而这正是为什么要提出HLA标准的重要原因。当前,国内部分仿真系统采用DDS来取代RTI的实现方法,RTI似乎落后了;其实,DDS从提出到第1个软件实现,比HLA标准的提出还要早好几年,如果DDS能够取代RTI,那么提出HLA的那些DMSO仿真专家难道是一堆傻瓜吗?有人说,DDS似乎在QoS(Quality of Service服务质量)和实时性方面更胜一筹;实际上,这是软件层面的事情,能不能做到这两点,与具体的实现软件有关系,与一个标准有多大关系呢?如果你觉得DDS不错,你可以把它用在RTI的底层;或者在RTI的底层采用DDS软件的一些实现方法。HLA基于已经设定的API实现程序之间的互操作,能够很好地支持仿真应用程序的互联互通;这一点是DDS所不具备的。

11.4桥接程序的源代码实现方法

       大家应该对桥接程序的源代码实现方法比较好奇吧,相信绝大多数人都没有见过。该程序其实非常简单,熟悉HLA/RTI编程的用户一看就懂。本节的桥接程序对应图11.2中的桥接成员,采用GNU C++实现,当然也可以采用其他程序设计语言实现。一个桥接成员可以加入到两个RTI服务器,而这两个RTI服务器可能运行于不同地点的不同操作系统主机上;譬如一个是北京的Windows机器,一个是长沙的银河麒麟机器。

       桥接程序包含3个.cpp文件:Chat.cpp、HwFederateAmbassador1.cpp和HwFederateAmbassador2.cpp。

       (1)Chat.cpp负责在两个RTI服务器上创建联邦、加入联邦、公布和订购数据、像一般仿真成员一样发送数据;仿真完成时退出联邦。

       (2)HwFederateAmbassador1.cpp负责从RTI1服务器接收数据,并将其转发到RTI2服务器。

       (3)HwFederateAmbassador2.cpp负责从RTI2服务器接收数据,并将其转发到RTI1服务器。

                                                           表11.1  大联邦聊天示例:chat.cpp

  1. #include "HwFederateAmbassador1.hh"
  2. #include "HwFederateAmbassador2.hh"
  3. #include <RTI.hh>
  4. #include <fedtime.hh>
  5. #include <iostream>
  6. using namespace std;
  7. RTI::InteractionClassHandle     hChatClass_1;  
  8. RTI::ParameterHandle             hChatName_1;
  9. RTI::ParameterHandle             hChatSentence_1;
  10. RTI::InteractionClassHandle     hChatClass_2;  
  11. RTI::ParameterHandle             hChatName_2;
  12. RTI::ParameterHandle             hChatSentence_2;
  13. RTI::RTIambassador       rti1;     
  14. RTI::RTIambassador       rti2;     
  15. int hw_main(int argc, char *argv[])
  16. {
  17.     const char *federationExecutionName1 = "chat";
  18.     const char *federationExecutionName2 = "chat";
  19.     const char *FEDfile = "chat.fed";
  20.     char federateName[50];
  21.     cout << "Please input your name: ";
  22.     cin >> federateName;
  23.     try
  24.     {
  25.         HwFederateAmbassador1    fedAmb1;
  26.         HwFederateAmbassador2    fedAmb2;
  27.         RTI::FederateHandle      federateId1;
  28.         RTI::FederateHandle      federateId2;
  29.         try
  30.         {
  31.             //若不带IP地址和端口号则从RTI.rid中读取: rti1.createFederationExecution(federationExecutionName, FEDfile);
  32.             //IP地址和端口号由用户自己设置, 用户可以从自己的配置文件或图形窗口中获取.
  33.             rti1.createFederationExecution(federationExecutionName1, FEDfile, "127.0.0.1", "10000");
  34.             //2条创建联邦语句不要写在一起.
  35.             //rti2.createFederationExecution(federationExecutionName2, FEDfile, "127.0.0.1", "20000");
  36.         }
  37.         catch ( RTI::Exception& e )
  38.         {
  39.         }
  40.         try
  41.         {
  42.             //IP地址和端口号由用户自己设置, 用户可以从自己的配置文件或图形窗口中获取.
  43.             rti2.createFederationExecution(federationExecutionName2, FEDfile, "127.0.0.1", "20000");
  44.         }
  45.         catch ( RTI::Exception& e )
  46.         {
  47.         }
  48.         try
  49.         {
  50.             federateId1 = rti1.joinFederationExecution(federateName, federationExecutionName1, &fedAmb1);
  51.             federateId2 = rti2.joinFederationExecution(federateName, federationExecutionName2, &fedAmb2);
  52.         }
  53.         catch ( RTI::Exception& e )
  54.         {
  55.             cerr << "FED_HW: ERROR:" << e << endl;
  56.             return -1;
  57.         }
  58.         ///
  59.         hChatClass_1 = rti1.getInteractionClassHandle("chat");
  60.         hChatName_1 = rti1.getParameterHandle("name", hChatClass_1);   
  61.         hChatSentence_1 = rti1.getParameterHandle("sentence", hChatClass_1);
  62.         hChatClass_2 = rti1.getInteractionClassHandle("chat");
  63.         hChatName_2 = rti1.getParameterHandle("name", hChatClass_2);   
  64.         hChatSentence_2 = rti1.getParameterHandle("sentence", hChatClass_2);
  65.         //如果向外发送,则需要公布
  66.         rti1.publishInteractionClass(hChatClass_1);
  67.         rti2.publishInteractionClass(hChatClass_2);
  68.         //如果需要接收,则必须订购
  69.         rti1.subscribeInteractionClass(hChatClass_1);
  70.         rti2.subscribeInteractionClass(hChatClass_2);
  71.         string szSentence;
  72.         cin.ignore();
  73.         while (0 != strcmp(szSentence.c_str(), "exit"))
  74.         {
  75.             cout << "Please input a sentence: ";
  76.             getline(cin, szSentence);
  77.             try {
  78.                 RTI::ParameterHandleValuePairSet* pParams = NULL;
  79.                 long numParams(2);
  80.                 pParams = RTI::ParameterSetFactory::create (numParams);
  81.                 pParams->add(hChatName_1,(char*)federateName, strlen(federateName)+1);
  82.             pParams->add(hChatSentence_1,(char*)szSentence.c_str(), szSentence.size());
  83.             rti1.sendInteraction(hChatClass_1, *pParams, "");
  84.             pParams->empty();
  85.             delete pParams;
  86.             pParams = RTI::ParameterSetFactory::create (numParams);
  87.             pParams->add(hChatName_2,(char*)federateName, strlen(federateName)+1);
  88.             pParams->add(hChatSentence_2,(char*)szSentence.c_str(), szSentence.size());
  89.             rti2.sendInteraction(hChatClass_2, *pParams, "");
  90.             pParams->empty();
  91.             delete pParams;
  92.         }
  93.         catch(...)
  94.         {
  95.             cerr << "Error: send interaction" << endl;
  96.         }
  97.     }
  98.     try
  99.     {
  100.             rti1.resignFederationExecution( RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  101.             rti2.resignFederationExecution( RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  102.             rti1.destroyFederationExecution( federationExecutionName1 );
  103.             rti2.destroyFederationExecution( federationExecutionName2 );
  104.     }
  105.     catch ( RTI::Exception& e )
  106.     {
  107.         cerr << "FED_HW: ERROR:" << e << endl;
  108.         return -1;
  109.     }
  110. }
  111. catch ( RTI::Exception& e )
  112. {
  113.     cerr << "FED_HW: ERROR:" << e << endl;
  114.     return -1;
  115. }
  116. return 0;
  117. }
  118. int
  119. main(int argc, char** argv)
  120. {
  121.     return hw_main(argc, argv);
  122. }

                                              表11.2  大联邦聊天示例:HwFederateAmbassador1.cpp

  1. #include "fedtime.hh"
  2. #include "HwFederateAmbassador1.hh"
  3. #include <iostream>
  4. using namespace std;
  5. extern RTI::InteractionClassHandle  hChatClass_1;
  6. extern RTI::ParameterHandle            hChatName_1;
  7. extern RTI::ParameterHandle            hChatSentence_1;
  8. extern RTI::RTIambassador              rti2;
  9. void HwFederateAmbassador1::receiveInteraction (
  10.         RTI::InteractionClassHandle       theInteraction,                     // supplied C1
  11.         const RTI::ParameterHandleValuePairSet& theParameters, // supplied C4
  12.         const RTI::FedTime&                   theTime,                               // supplied C4
  13.         const char                                       *theTag,                               // supplied C4
  14.         RTI::EventRetractionHandle       theHandle)                         // supplied C1
  15. throw (
  16.   RTI::InteractionClassNotKnown,
  17.   RTI::InteractionParameterNotKnown,
  18.   RTI::InvalidFederationTime,
  19.   RTI::FederateInternalError)
  20. {
  21.    //call the next service.
  22.    this->receiveInteraction( theInteraction, theParameters, theTag );
  23. }
  24. void HwFederateAmbassador1::receiveInteraction (
  25.         RTI::InteractionClassHandle       theInteraction,                         // supplied C1
  26.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  27.         const char                                       *theTag)                                   // supplied C4
  28. throw (
  29.   RTI::InteractionClassNotKnown,
  30.   RTI::InteractionParameterNotKnown,
  31.   RTI::FederateInternalError)
  32. {
  33.    RTI::ParameterHandle paraHandle;
  34.    RTI::ULong           valueLength;
  35.    //Usage of char[] and string
  36.    char name[256];   //name of sender
  37.    string sentence;  //sentence of sender
  38.    if(theInteraction == hChatClass_1) {
  39.      for ( int i = 0; i < theParameters.size(); i++ )
  40.      {
  41.         paraHandle = theParameters.getHandle( i );
  42.         if(paraHandle == hChatName_1) {
  43.           theParameters.getValue(i, (char*)name, valueLength);
  44.           /*If name is a double number, you can do this way.
  45.           double name;
  46.           theParameters.getValue(i, (char*)&name, valueLength);
  47.           */
  48.         }else if(paraHandle == hChatSentence_1) {
  49.           sentence.resize(theParameters.getValueLength(i));
  50.           theParameters.getValue(i, (char*)sentence.c_str(), valueLength);
  51.         }else{
  52.       cout << "Federation1: Receive wrong parameter handle." << endl;
  53.         }
  54.      }
  55.      cout << endl << "Federation1: " << name << ": " << sentence << endl;
  56.      //转发到rti2
  57.      rti2.sendInteraction(theInteraction, theParameters, theTag);
  58.   }
  59. }

                                               表11.3  大联邦聊天示例:HwFederateAmbassador2.cpp

  1. #include "fedtime.hh"
  2. #include "HwFederateAmbassador2.hh"
  3. #include <iostream>
  4. using namespace std;
  5. extern RTI::InteractionClassHandle   hChatClass_2;
  6. extern RTI::ParameterHandle             hChatName_2;
  7. extern RTI::ParameterHandle             hChatSentence_2;
  8. extern RTI::RTIambassador                rti1;
  9. void HwFederateAmbassador2::receiveInteraction (
  10.         RTI::InteractionClassHandle       theInteraction,                      // supplied C1
  11.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  12.         const RTI::FedTime&                   theTime,                                // supplied C4
  13.         const char                                       *theTag,                                // supplied C4
  14.         RTI::EventRetractionHandle       theHandle)                          // supplied C1
  15. throw (
  16.   RTI::InteractionClassNotKnown,
  17.   RTI::InteractionParameterNotKnown,
  18.   RTI::InvalidFederationTime,
  19.   RTI::FederateInternalError)
  20. {
  21.    //call the next service.
  22.    this->receiveInteraction( theInteraction, theParameters, theTag );
  23. }
  24. void HwFederateAmbassador2::receiveInteraction (
  25.         RTI::InteractionClassHandle       theInteraction,                         // supplied C1
  26.         const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  27.         const char                                       *theTag)                                   // supplied C4
  28. throw (
  29.   RTI::InteractionClassNotKnown,
  30.   RTI::InteractionParameterNotKnown,
  31.   RTI::FederateInternalError)
  32. {
  33.    RTI::ParameterHandle paraHandle;
  34.    RTI::ULong           valueLength;
  35.    //Usage of char[] and string
  36.    char name[256];   //name of sender
  37.    string sentence;  //sentence of sender
  38.    if(theInteraction == hChatClass_2) {
  39.      for ( int i = 0; i < theParameters.size(); i++ )
  40.      {
  41.         paraHandle = theParameters.getHandle( i );
  42.         if(paraHandle == hChatName_2) {
  43.           theParameters.getValue(i, (char*)name, valueLength);
  44.       /*If name is a double number, you can do this way.
  45.           double name;
  46.           theParameters.getValue(i, (char*)&name, valueLength);
  47.       */
  48.         }else if(paraHandle == hChatSentence_2) {
  49.           sentence.resize(theParameters.getValueLength(i));
  50.           theParameters.getValue(i, (char*)sentence.c_str(), valueLength);
  51.         }else{
  52.       cout << "Federation2: Receive wrong parameter handle." << endl;
  53.         }
  54.      }
  55.      cout << endl << "Federation2: " << name << ": " << sentence << endl;
  56.      //转发到rti1
  57.      rti1.sendInteraction(theInteraction, theParameters, theTag);
  58.   }
  59. }

KY-RTI的Linux、Windows版本和源码请联系作者:walt_lbq@163.com

KY-RTI分布仿真技术:前 言

KY-RTI分布仿真技术:第一章 简介

KY-RTI分布仿真技术:第二章 系统安装

KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

KY-RTI分布仿真技术:第四章 C++程序设计

KY-RTI分布仿真技术:第五章 Qt程序设计

KY-RTI分布仿真技术:第六章 Java程序设计

KY-RTI分布仿真技术:第七章 Visual C++程序设计

KY-RTI分布仿真技术:第八章 Visual C#程序设计

KY-RTI分布仿真技术:第九章 综合演示

KY-RTI分布仿真技术:附录1 分组聊天(HLA数据分发管理的应用)

KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统) 的相关文章

随机推荐

  • Docker

    文章目录 Docker1 Docker简介1 1 什么是虚拟化1 2 什么是Docker1 3 容器与虚拟机比较1 4 Docker 组件1 4 1 Docker服务器与客户端1 4 2 Docker镜像与容器1 4 3 Registry
  • tensorflow图优化详解

    一 运行时优化 Grappler是TensorFlow提供的运行时优化功能 xff0c 图1为Grappler模块主要功能的UML关系图 其中tensorflow grappler GrapplerItem 表示待优化的TensforFlo
  • 理解一维数组中 buf、buf[0]、&buf[0]、&buf 四个符号的含义

    本文内容摘自 C语言内核深度解析 一书的深入学习数组部分 以 int buf 100 61 0 为例 xff0c 集中讨论 buf buf 0 amp buf 0 amp buf 四个字符含义的内涵 1 buf xff1a 有两层含义 xf
  • 无人机航线规划软件[航线通]

    无人机航线规划软件 航线通 xff08 RoutePlan xff09 是数据禾 xff08 databox store xff09 研发的具有自主知识产权的无人机航线规划及飞行的移动端控制软件 xff0c 主要适用于大疆无人机 xff0c
  • Ubuntu20.04安装Cartographer_ros,conda环境X11问题

    absl的解决 conda 环境的 X11 问题 xff1a conda span class token function install span c conda forge xorg libx11
  • 单目视觉定位测距的两种方式

    单目定位和双目定位的选择 xff0c 我觉得主要还是成本和时间的考虑 之前也尝试过双目定位 xff0c 感觉要更精准些 xff0c 但双目测距需要对两幅图像进行图像变换和极线匹配 xff0c 稍微耗时了一些 这几天尝试了一下单摄像头进行测距
  • KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

    以操作系统和CPU为代表的国产化是当前仿真系统实现的必然趋势 本章以聊天程序为例 xff0c 展示了KY RTI在多种国产操作系统和国产CPU上的运行结果 聊天程序是一个入门程序 xff0c 本身比较简单 xff0c 不追求界面的美观 相信
  • KY-RTI分布仿真技术:前言

    前 言 自从美国国防部建模与仿真办公室 xff08 DMSO xff09 首次提出高层体系结构 xff08 High Level Architecture xff0c HLA xff09 概念以来 xff0c HLA仿真技术得到了迅猛发展
  • KY-RTI分布仿真技术:第一章 简介

    第一章 简介 高层体系结构 xff08 High Level Architecture xff0c HLA xff09 是美国国防部为了解决美军在各个领域开发出来的多种模型和各类仿真系统的互联和互操作问题而提出的一种分布式仿真标准 xff0
  • KY-RTI分布仿真技术:第二章 系统安装

    第二章 系统安装 本章介绍KY RTI在Linux和Windows操作系统下的安装方法 2 1 Linux安装 安装程序 xff1a RTI 1 3NGv6 tar gz 假设当前的Linux用户名为lbq xff0c HOME目录为 ho
  • KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

    第三章 KY OMT对象模型模板工具 本章介绍了对象模型模板的相关知识 xff0c 以及如何使用KY OMT对象模型模板工具创建对象模型文件 3 1 对象模型模板 HLA1 3包含3个标准 xff0c 第一个是描述整个联邦和联邦成员必须遵循
  • 基于SSM的后台管理系统总结

    文章目录 SSM环境搭建环境准备1 1 数据库与表结构1 2 maven工程搭建 pom 1 3编写实体类编写接口 SSM整合 web 与产品查询Spring环境搭建web xml 配置Spring MVC 环境搭建测试运行 资源地址 首先
  • KY-RTI分布仿真技术:第四章 C++程序设计

    第四章 C 43 43 程序设计 本章讲述如何在Linux操作系统上设计GNU C 43 43 程序 演示了2个程序 xff1a 聊天程序chat和时间管理程序time chat使用HLA的交互类进行通信 xff0c 没有采用tick服务
  • KY-RTI分布仿真技术:第五章 Qt程序设计

    第五章 Qt程序设计 本章讲述了如何基于Qt Creator设计控制台程序和图形界面程序 控制台程序相当于4 3节的聊天程序 xff1b 图形界面程序相当于4 4节的时间管理程序 图形界面程序近似于真实仿真项目 xff0c 讲述了如何设计仿
  • KY-RTI分布仿真技术:第六章 Java程序设计

    第六章 Java程序设计 本章讲述了如何基于Java设计聊天程序和时间管理程序 xff0c 两个程序都是控制台程序 聊天程序相当于4 3节的GNU C 43 43 聊天程序 xff1b 时间管理程序相当于4 4节的GNU C 43 43 程
  • KY-RTI分布仿真技术:第七章 Visual C++程序设计

    第七章 Visual C 43 43 程序设计 本章讲述如何基于Visual C 43 43 设计仿真程序 演示了2个程序 xff1a ping程序和pong程序进行相互之间的通信 程序使用HLA的交互类进行通信 xff0c Visual
  • KY-RTI分布仿真技术:第八章 Visual C#程序设计

    第八章 Visual C 程序设计 本章讲述如何基于Visual C 设计ping pong程序 本质上是对上一章Visual C 43 43 程序的一次成功移植 对于不同的程序设计语言而言 xff0c 基于HLA RTI设计仿真应用的方法
  • KY-RTI分布仿真技术:第九章 综合演示

    第九章 综合演示 KY RTI支持基于不同CPU 不同操作系统 不同程序设计语言 不同HLA服务调用方式开发的仿真成员之间的互操作 xff0c 本章综合前面章节的内容给出了几个联合测试案例 本章以银河麒麟操作系统和飞腾CPU为主进行测试 x
  • KY-RTI分布仿真技术:附录1 分组聊天(HLA数据分发管理的应用)

    本章从RTI开发者的角度简单地介绍HLA1 3标准中的数据分发管理 xff08 DDM xff0c Data Distributed Management xff09 并给出了一个具体的示例 前面介绍了基于各种程序设计语言开发的聊天程序示例
  • KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

    基于当前的RTI构建1000个以上成员的仿真系统在一些人看来似乎是极具挑战性的一个问题 如果你对当前的计算机技术 网络技术 仿真技术真正了解的话 xff0c 其实构建这样的一个大规模仿真系统是完全可行的 本章以聊天程序为例 xff0c 介绍