HLA 入门二
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
的异常, 若我们捕获它并在catch
中rtiAmbassador.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);
这个方法, 用它代替就好啦
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
GitalkLivere