静脉中的行人模拟 (omnet++/sumo)

Pedestrian Simulation in veins (omnet++/sumo)

我正在尝试 运行 omnet++ 中相扑的行人模拟。为了简单起见(我是初学者),我决定使用带有静脉的 Erlangen 示例,并将其扩展到几个行人。我在相扑和 运行 中添加了行人。它工作得很好: You can see the pedestrians and cars in this picture

接下来我尝试 运行 omnet++ 中的所有内容。我也设法做到了,但没有显示行人。只是汽车。我阅读了这两个主题:

并将这些行添加到示例的 omnetpp.ini 中:

*.manager.moduleType = "vtype0=org.car2x.veins.nodes.Car ped_pedestrian=org.car2x.veins.nodes.Pedestrian"
*.manager.moduleName = "vtype0=carNode ped_pedestrian=pedestrianNode"
*.manager.moduleDisplayString = "vtype0=carNode ped_pedestrian=pedestrianNode"

我还将 omnetpp.ini 中 "node" 的每个外观运行ce 更改为 "carNode" 并为 "pedestrianNode" 并且我复制了 Car.ned 文件并将文件名更改为 Pedestrian.ned 并将模块名称更改为"Pedestrian"。然后我又 运行 整个事情,但除了汽车的图像(如模拟中所示)变成灰色框外,没有任何改变。

为什么没有显示行人? (我错过了什么?) 我是否必须告诉静脉(或相扑)将行人位置传达给 omnet++? 为什么模拟中的汽车图标变成了灰色框?

这是我 added/modified:

的文件

编辑:

我研究了 TraCI definition and debugged the [source code of veins]. I found these lines 完成订阅的代码:

{
    // subscribe to list of departed and arrived vehicles, as well as simulation time
    simtime_t beginTime = 0;
    simtime_t endTime = SimTime::getMaxTime();
    std::string objectId = "";
    uint8_t variableNumber = 7;
    uint8_t variable1 = VAR_DEPARTED_VEHICLES_IDS;
    uint8_t variable2 = VAR_ARRIVED_VEHICLES_IDS;
    uint8_t variable3 = commandInterface->getTimeStepCmd();
    uint8_t variable4 = VAR_TELEPORT_STARTING_VEHICLES_IDS;
    uint8_t variable5 = VAR_TELEPORT_ENDING_VEHICLES_IDS;
    uint8_t variable6 = VAR_PARKING_STARTING_VEHICLES_IDS;
    uint8_t variable7 = VAR_PARKING_ENDING_VEHICLES_IDS;
    TraCIBuffer buf = connection->query(CMD_SUBSCRIBE_SIM_VARIABLE, TraCIBuffer() << beginTime << endTime << objectId << variableNumber << variable1 << variable2 << variable3 << variable4 << variable5 << variable6 << variable7);
    processSubcriptionResult(buf);
    ASSERT(buf.eof());
}

{
    // subscribe to list of vehicle ids
    simtime_t beginTime = 0;
    simtime_t endTime = SimTime::getMaxTime();
    std::string objectId = "";
    uint8_t variableNumber = 1;
    uint8_t variable1 = ID_LIST;
    TraCIBuffer buf = connection->query(CMD_SUBSCRIBE_VEHICLE_VARIABLE, TraCIBuffer() << beginTime << endTime << objectId << variableNumber << variable1);
    processSubcriptionResult(buf);
    ASSERT(buf.eof());
}

我将其与 sumo wiki 上的 TraCI 文档进行了比较:
* 模拟订阅的第一块:https://sumo.dlr.de/wiki/TraCI/Simulation_Value_Retrieval
* 车辆订阅的第二段代码:https://sumo.dlr.de/wiki/TraCI/Vehicle_Value_Retrieval

在我看来,行人不包括在内,因为 persons/pedestrians 有不同的 api (https://sumo.dlr.de/wiki/TraCI/Person_Value_Retrieval) which is not listed on the subscription page (https://sumo.dlr.de/wiki/TraCI/Object_Variable_Subscription)。

我在人订阅完成的静脉源代码中是否遗漏了什么?

甚至可以订阅 TraCI 中的人员吗?

你完全正确。从 Veins 5a1 开始,Veins 不支持开箱即用的行人(Persons),这意味着用户需要编写额外的代码。

对于内部项目,我们只是克隆了处理车辆订阅的代码,在适当的地方替换了 class 和变量名称

(即,ID_LISTCMD_SUBSCRIBE_PERSON_VARIABLE=0xde,然后为每个新人订阅 VAR_POSITION,等等,并通过调用 addModule 对这些变量的变化做出反应和 nextPosition).