1. RTI中time management相关问题

1.1 在创建Federate之后如何修改其时间控制策略

想要在创建Federate后改变其时间控制策略, 且同时修改其前瞻量, 这时会出现相关问题, 当然, 我们先假设三个Federate, A、B、C初始都是Regulating状态, 且A前瞻量2, 步长2, 当前时间为20, B前瞻量4, 步长4, 当前时间60, C前瞻量5, 步长5, 当前时间100

  • 先修改C为 Regulating and Constrained, 这时若先rtiAmbassador.enableTimeRegulation(lookahead);throw一个TimeRegulationAlreadyEnabled的异常, 若我们捕获它并在catchrtiAmbassador.disableTimeRegulation(); rtiAmbassador.enableTimeRegulation(lookahead);, 看似并没有什么问题。于是接下来执行rtiAmbassador.enableTimeConstrained();, 此时查看Pitch pRti的界面发现A的Constrained也没有启用, 看上去不知解决, 其实这时Constrained处于pending状态, 没有什么影响, 后续再说
  • 再修改B为 Regulating and Constrained, 同上操作, 执行到rtiAmbassador.disableTimeRegulation();这句时, 观察Pitch pRti的时间管理界面发现其GALT增大为B的当前时间加其前瞻量, 即100+5, 之后抛出的异常也都相同, 不赘述
  • 最后修改A为 Regulating and Constrained, 开始同上, 之后执行rtiAmbassador.enableTimeRegulation(lookahead);, 发现A的当前时间突然跳到了64, 这不是希望的结果, Orz… 这时我们如果我们观察B, 会发现其启用了constrained, 所以说ConstrainedPending状态不需要关心, 只是因为有其他Regulating状态的Federate限制了而已, 当其推进超过自己的当前时间即可, 回到A, 继续执行rtiAmbassador.enableTimeConstrained();
  • 这样虽然最后可以将所有Federate都改为 Regulating and Constrained 状态, 但是过程不是我们想要的结果
  • 所以我们修改lookahead时不能先disable再enable, 那怎么解决这个问题? 很简单、、、查一下发现rtiAmbassador有modifyLookahead(lookahead);这个方法, 用它代替就好啦