如果车辆和RSU都定期广播消息,OMNET++/Veins模拟是否会变得非常缓慢



让我先给出一个简短的上下文:

我有一个场景,RSU将在每TRSU秒广播一条固定消息">RSUmessage"。我已经为RSU广播实现了以下代码(此外,这些固定消息的Psid=-100可以将它们与其他消息区分开来):

void TraCIDemoRSU11p::handleSelfMsg(cMessage* msg) {
if (WaveShortMessage* wsm = dynamic_cast<WaveShortMessage*>(msg)) {
if(wsm->getPsid()==-100){
sendDown(RSUmessage->dup());
scheduleAt(simTime() + trsu +uniform(0.02, 0.05), RSUmessage);
}
}
else {
BaseWaveApplLayer::handleSelfMsg(wsm);
}
}

汽车可以从其他汽车以及RSU接收这些信息。RSU丢弃从汽车接收的消息。汽车将接收多条这样的消息,进行一些比较,并定期广播类似类型的消息:">aggregatedMessage"每个时间间隔Tcar。aggregatedMessage还具有Psid=-100,因此可以很容易地将消息与其他消息区分开来。

我正在使用自消息安排汽车活动。(尽管我相信它可以在handlePositionUpdate中完成)。汽车的把手selfMsg如下:

void TraCIDemo11p::handleSelfMsg(cMessage* msg) {
if (WaveShortMessage* wsm = dynamic_cast<WaveShortMessage*>(msg)) {
wsm->setSerial(wsm->getSerial() +1);
if (wsm->getPsid() == -100) { 
sendDown(aggregatedMessage->dup());
//sendDelayedDown(aggregatedMessage->dup(), simTime()+uniform(0.1,0.5));
scheduleAt(simTime()+tcar+uniform(0.01, 0.05), aggregatedMessage);
}
//send this message on the service channel until the counter is 3 or higher.
//this code only runs when channel switching is enabled
else if (wsm->getSerial() >= 3) {
//stop service advertisements
stopService();
delete(wsm);
}
else {
scheduleAt(simTime()+1, wsm);
}
}
else {
BaseWaveApplLayer::handleSelfMsg(msg);
}
}

问题:使用此设置,模拟非常非常缓慢。在OMNET GUI的Express模式下,我可以在5-6小时或更长时间内获得大约50秒的模拟时间。(RSU编号:64,车辆编号:40,约1kmx1km地图)

此外,我指的是这篇帖子。OP说,在每个RSU收到消息后,他取消了发送消息,从而加快了速度。在我的情况下,我不能删除它,因为我需要在每个间隔后发送广播消息。

问题:我认为这种缓慢是因为每个节点都试图在模拟的每一秒开始时发送Down消息。当所有车辆和节点同时调度和发送消息时,OMNET是否会减慢速度?(放慢速度是有道理的,但要慢到什么程度)但是,模拟中总共只有大约100个节点。当然不可能这么慢。

我尝试的:我尝试使用sendDelayedDown(wsm->dup(), simTime()+uniform(0.1,0.5));将消息的发送分散到每个模拟秒的1st一半。这似乎可以阻止消息在每个模拟秒开始时堆积,并稍微加快速度,但总体上没有那么快。

有人能告诉我这是正常行为还是我做错了什么吗

我也为这篇冗长的帖子道歉。如果不提供上下文,我无法解释我的问题。

您的网络中似乎充斥着消息:来自RSU的每条消息都会被复制,并由收到该消息的每辆车再次传输。因此,计算时间随着网络中节点(消息发送者)的数量呈二次方增长(每个发送的消息都必须由接收范围内的每个节点处理)。每条消息传输3次的限制似乎没有多大帮助,正如代码中的注释所示,如果没有频道切换,则根本不会使用。

因此,如果你不能简单地改进/更改代码来发送更少的消息,你就必须接受这一点。以延迟的方式发送消息的小调整只会在一秒钟内分发消息,但并不能解决泛滥的问题。

然而,仍然有一些提示可以用来提高模拟的性能:

  1. 在发布模式下编译:make MODE=Release
  2. 在终端环境Cmdenv:./run -u Cmdenv ...中运行模拟
  3. 如果您需要使用图形环境,您至少应该通过使用界面上部的滑块来加速动画

从omnetpp.ini文件中删除simtime-resolution参数可以解决问题。

当信道延迟与模拟时间分辨率不匹配时,模拟内核似乎有问题。

您可以通过克隆以下存储库来验证解决方案。请注意,您需要OMNeT++框架的功能性安装。具体来说,我在OMNeT++5.6.2中测试了这个修复程序。

https://github.com/Ryuuba/flooding

最新更新