【问题标题】:Why does Veins crash when commandSetSpeedMode() is used?为什么使用 commandSetSpeedMode() 时 Veins 会崩溃?
【发布时间】:2015-06-10 13:25:12
【问题描述】:

我正在尝试在 Veins 中模拟我想要禁用 在路口检查通行权。我抬头看了看Sumo wiki 和 发现 bitset 是 23 的目的。在另一个查找 TraCIMobility.h 与 Veins 捆绑在一起的标头帮助我知道这可以 对 TraCIDemo11p 节点使用函数 commandSetSpeedMode() 来完成 在 Veins 演示模拟中对车辆进行建模。我在尝试着 使用与 Veins 捆绑的这个演示构建我的模型。

但是当我尝试这样做时,SUMO 崩溃了。我正在尝试初始化 TraCIDemo11pinitialize() 函数中的节点通过以下方式 代码:

void TraCIDemo11p::initialize(int stage) {
    BaseWaveApplLayer::initialize(stage);
    if (stage == 0) {
        traci = TraCIMobilityAccess().get(getParentModule());
        annotations = AnnotationManagerAccess().getIfExists();
        ASSERT(annotations);

        traci->commandSetSpeedMode(23);  // This is the point of modification

        sentMessage = false;
        lastDroveAt = simTime();
        findHost()->subscribe(parkingStateChangedSignal, this);
        isParking = false;
        sendWhileParking = par("sendWhileParking").boolValue();
    }
}

我尝试使用其他标准值(例如 0 或 31)设置模式,但是 每次我得到 SUMO 崩溃。 我无法弄清楚我应该在哪里放置这个命令。我试过 通过添加 else 子句在其他初始化阶段设置模式 到它,但它仍然崩溃。更重要的是,即使打开调试器,也没有错误 正在显示,在 OMNeT++ 窗口或sumolaunchd.py 输出中 在 OMNeT++ cmd 中。 请帮助理解我的错误。谢谢。


编辑:添加错误消息信息

为了清楚起见,我没有收到任何错误消息,而是退出代码。我搜索了代码,但没有得到任何帮助。通常的“此应用程序没有响应”窗口会弹出并且 sim 结束,所以我怀疑 SUMO 崩溃了。

OMNeT++ 环境显示以下消息:

Simulation terminated with exit code: -1073741819
Working directory: C:/Users/stes-2/veins-3.0/examples/Cross Roads
Command line: c:/Users/stes-2/omnetpp-4.4/bin/opp_run.exe -r 0 -n ../veins;../../src --tkenv-image-path=../../images -l ../../src/veins omnetpp.ini

Environment variables:
OMNETPP_ROOT=c:/Users/stes-2/omnetpp-4.4
PATH=;C:/Users/stes-2/veins-3.0/src;c:\Users\stes-2\omnetpp-4.4\bin;c:\Users\stes-2\omnetpp-4.4\msys\bin;c:\Users\stes-2\omnetpp-4.4\mingw\bin;c:/Users/stes-2/omnetpp-4.4/ide/jre/bin/client;c:/Users/stes-2/omnetpp-4.4/ide/jre/bin;c:/Users/stes-2/omnetpp-4.4/ide/jre/lib/i386;.;C:\Users\stes-2\omnetpp-4.4\msys\local\bin;c:\Users\stes-2\omnetpp-4.4\mingw\bin;C:\Users\stes-2\omnetpp-4.4\msys\bin;c:\Users\stes-2\omnetpp-4.4\bin;c:\ProgramData\Oracle\Java\javapath;c:\Windows\system32;c:\Windows;c:\Windows\System32\Wbem;c:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;c:\Python27;c:\Users\stes-2\sumo-0.21.0;c:\Users\stes-2\omnetpp-4.4;
OMNETPP_IMAGE_PATH=c:\Users\stes-2\omnetpp-4.4\images

由于我通过 sumoLaunchd.py 脚本运行 SUMO,因此在 OMNeT++ 的 MingW cmd 出现的错误消息是:

Starting SUMO (c:/Users/stes-2/sumo-0.21.0/bin/sumo-gui.exe -c cross.sumo.cfg) o
n port 64161, seed 0
Connecting to SUMO (c:/Users/stes-2/sumo-0.21.0/bin/sumo-gui.exe -c cross.sumo.c
fg) on port 64161 (try 1)
Releasing lock on port
Starting proxy mode
Done with proxy mode
Done with proxy mode, killing SUMO
SIGTERM
Done running SUMO
Cleaning up
Result: "<?xml version="1.0"?>
<status>
        <exit-code>15</exit-code>
        <start>1433944271</start>
        <end>1433944276</end>
        <status>Exited with error code 15</status>
        <stdout><![CDATA[Loading configuration... done.
]]></stdout>
        <stderr><![CDATA[]]></stderr>
</status>
"
Closing connection from 127.0.0.1 on port 64160

【问题讨论】:

  • 能否在问题中包含错误信息?
  • 试试这个然后报告:mobility = TraCIMobilityAccess().get(getParentModule());traci = mobility-&gt;getCommandInterface();traciVehicle = mobility-&gt;getVehicleCommandInterface();traciVehicle-&gt;setSpeedMode(21);
  • 我已经完成了。错误仍然出现。

标签: omnet++


【解决方案1】:

我认为您遗漏了一些行。

您已将 TraCIMobility 分配给 traci,然后您甚至不考虑通用 commandInterfacevehicleCommandInterface

TraCIMobility* mobility = TraCIMobilityAccess().get(getParentModule());
TraCICommandInterface* traci = mobility->getCommandInterface(); /* missing command interface */
TraCICommandInterface::Vehicle* traciVehicle = mobility->getVehicleCommandInterface(); /* missing vehicle command interface */
traciVehicle->setSpeedMode(someNumber);

我什至尝试编译您的代码,但它抱怨没有可用于 TraCIMobility 的方法,称为 commandSetSpeedMode()。但这可能是由于 Veins 版本的不同。


Multi-stage initialization

您尝试访问的模块/变量可能尚未准备好,即在您尝试使用它时仍未创建。在这种情况下,可以使用 OMNeT++ 的多阶段初始化功能。

这意味着“任务”可能会延迟到当前模块初始化的后期:

void SomeModule::initialize(int stage)
{
    ApplicationBase::initialize(stage);  /* ignore if causes error */

    if(stage == 0)
    {
        /* do this */

    else if (stage == 3)
    {
        /* do this later */
    }
}

【讨论】:

  • 好吧,我使用的是 Veins 3.0,并且在头文件 TraCIMobility.hcommandSetSpeedMode() 中是一个函数。是的,我确实尝试了您在上面编写的代码:traci = TraCIMobilityAccess().get(getParentModule()); traci-&gt;getCommandInterface()-&gt;setSpeedMode(23); 但即使这样也没有用。我怀疑也许我把我的代码放在了错误的地方。我也尝试在不同的初始化阶段设置它,但错误仍然存​​在。此外,错误发生在我给函数的任何值上。
  • 另外,在我的 Veins 版本中,getVehicleCommandInterface() 不是一个已定义的函数。 setSpeedMode() 可直接通过TraCICommandInterface 获得
  • 显然我们有不同版本的 Veins。我检查并确认如您在 Veins 3.0 中所说,提供了 commandSetSpeedMode()。另外,我在与您相同的位置尝试了代码,并且在我的 Veins 版本中对我有用。你有哪个版本的相扑?考虑将 Veins 和 SUMO 更新为相互兼容的版本?
  • 我使用的是 SUMO 0.21.0。我按照 Veins 网站上的教程页面安装了所有组件,所以我认为这不是问题。目前,我正在通过在车辆进入模拟后设置为 1 秒的计时器上设置此变量来解决此问题。我尝试在初始化阶段这样做,但没有运气,所以现在就去做这个。
  • 非常感谢。我尝试了更多的初始化阶段,发现汽车的速度模式实际上是在“汽车”节点的第 2 阶段之后设置的。所以我在第 3 阶段更改了速度模式,现在它在没有计时器的情况下工作正常。
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2014-05-16
相关资源
最近更新 更多