【发布时间】:2018-06-20 22:21:01
【问题描述】:
我希望停止在模拟的单个节点上运行的 VEINS 应用程序,让其余车辆正常模拟(而不是停止整个模拟)。 我只想停止正在运行的应用程序,这意味着车辆应该继续在模拟中充当普通的 SUMO 车辆 - 就好像他没有配备应用程序一样。 有可能这样做吗? 我无法在文档中找到我的问题的解决方案。 提前致谢
【问题讨论】:
我希望停止在模拟的单个节点上运行的 VEINS 应用程序,让其余车辆正常模拟(而不是停止整个模拟)。 我只想停止正在运行的应用程序,这意味着车辆应该继续在模拟中充当普通的 SUMO 车辆 - 就好像他没有配备应用程序一样。 有可能这样做吗? 我无法在文档中找到我的问题的解决方案。 提前致谢
【问题讨论】:
TL;DR:仅使用 VEINS API 是不可能的,您需要手动为其编写代码。具体工作量取决于您要做什么。
删除和重新添加:通过编程永久停止它应该相对容易——如果你终止与Car.ned 相关的所有内容,你基本上会做你想做的事做(这个动作不会在 SUMO 模拟中移除汽车)。然后,您可以在稍后的某个时间再次实例化汽车;要做到这一点,您可能只需要对移动管理器进行一个相对较小的扩展,以便在满足某些条件时再次实例化已移除的车辆。
暂停和恢复:冻结汽车并使其恢复有点困难,因为您必须暂停与车辆相关的所有事件。暂停单个车辆的概念性问题是,由于 VEINS 的设计方式,您将需要推迟一些事件(例如,周期性信标应用程序的计时器),并丢弃其他事件(排队的信号接收检查事件其他派送车辆)。特别是,您需要问自己是否要保留汽车 MAC 队列中的消息。基本上你需要手写这个,查看与车辆相关的所有事件并决定是否将它们推迟一段时间(或丢弃它们)。如果您决定简单地丢弃所有事件(可能是最容易实现的决定),您将不得不处理汽车的应用程序状态不再有意义的情况。
【讨论】:
finish() 的方法来关闭汽车中的所有子模块(并使用@ 取消相关事件987654324@,参见例如this)。我不确定 omnet++ API 是否有一些通用的方法来在运行时终止复杂的模块,包括相关的事件。不过,我建议您提出一个新问题。