如何使用 Veins、SUMO 和 Omnet++ 使用更改“changeVehicleRoute”功能?

问题描述

我正在使用一个简单的网络来更改以下车辆的路线。我的代码没有显示任何错误。 SUMO 和 omnet++ 都正常工作;然而,车辆并没有改变路线。我已经使用给定的静脉演示网络进行了尝试,但仍然无法正常工作。到目前为止,我已经尝试了几种在不同来源中找到的方法(您可以在实际代码中看到,因为我将它们留在注释中),但仍然没有任何车辆改变路线。

enter image description here

我的 rou.xml 是:

<vehicle id="0" depart="5.00">
    <route edges="-gneE4 -gneE3 -gneE2 "/>
</vehicle>
<vehicle id="1" depart="5.00">
    <route edges="-gneE4 -gneE3 -gneE2 "/>
</vehicle>

<vehicle id="2" depart="5.90">
    <route edges="-gneE4 -gneE3 -gneE2 "/>
</vehicle>
 <vehicle id="3" depart="6.0">
    <route edges="-gneE4 -gneE3 -gneE2 "/>
</vehicle>

<vehicle id="4" depart="7.0">
    <route edges="gneE2 gneE3 gneE4"/>
</vehicle>

<vehicle id="5" depart="40.0">
<route edges="-gneE4 -gneE3 -gneE2 "/>

</vehicle>

在 TraCIDemo11p.cc 中更改路由是 chnage 路由....

void TraCIDemo11p::onWSM(BaseFrame1609_4* frame){
TraCIDemo11pMessage* wsm = check_and_cast<TraCIDemo11pMessage*>(frame);

findHost()->getdisplayString().setTagArg("i",1,"green");

//traciVehicle->changeVehicleRoute({"-gneE11","-gneE11"});
// mobility = TraCImobilityAccess().get(getParentModule());
// traci = mobility->getCommandInterface();
//traciVehicle = mobility->getVehicleCommandInterface();
// traciVehicle->changeRoute("-gneE11",6);

if (mobility->getRoadId()[0] != ':'){traciVehicle->changeRoute("-gneE11",3600);}

if (!sentMessage) {
    sentMessage = true;
    // repeat the received traffic update once in 2 seconds plus some random delay
    wsm->setSenderAddress(myId);
    wsm->setSerial(3);
    scheduleAt(simTime() + 2 + uniform(0.01,0.2),wsm->dup());
}

}

解决方法

如果您想了解各种 SUMO 方法的作用,我建议您直接查看源代码,例如 https://github.com/sommer/veins/blob/veins-5.1/src/veins/modules/mobility/traci/TraCICommandInterface.cc#L313。您将看到,您的代码所做的是更改汽车的路线以假设 3600 的努力(1 小时,即很多的努力)对于边缘 { {1}}。此边缘不属于您车辆的任何路线,因此您的车辆都不在乎:它们打算走的路线仍然“非常好”。

对于替代方案,另请参阅 https://github.com/sommer/veins/blob/veins-5.1/subprojects/veins_testsims/src/veins_testsims/traci/TraCITestApp.cc 的方法,该方法调用一次在 Veins 5.1 中实现的所有 SUMO 方法,以查看它们的行为是否符合预期。例如,https://github.com/sommer/veins/blob/veins-5.1/subprojects/veins_testsims/src/veins_testsims/traci/TraCITestApp.cc#L285 将(对于一辆车)边 -gneE11 的假定努力更改为 42,然后(稍后)检查车辆是否确实避免了该边。

从您注释掉的代码来看,https://github.com/sommer/veins/blob/veins-5.1/subprojects/veins_testsims/src/veins_testsims/traci/TraCITestApp.cc#L475 中的代码更符合您的要求:为车辆提供一条新路线。