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

时间:2019-02-22 14:29:35

标签: omnet++ veins sumo

我正在尝试用omnet ++中的sumo运行行人模拟。为了简化操作(我是初学者),我决定使用带有静脉的 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 中“节点”的所有外观更改为“ carNode”,并为“ pedestrianNode”创建了新条目,并复制了 Car.ned 文件并将文件名更改为 Pedestrian.ned ,并将模块名称更改为“ Pedestrian”。然后,我再次运行整个过程,但是除了汽车的图像(如模拟所示)变为灰色框之外,什么都没有改变。

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

这是我添加/修改的文件:

编辑:

我研究了TraCI definition并调试了[静脉源代码]。我发现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());
}

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

在我看来,行人不包括在其中,因为人员/行人具有不同的api(https://sumo.dlr.de/wiki/TraCI/Person_Value_Retrieval),该API未在订阅页面(https://sumo.dlr.de/wiki/TraCI/Object_Variable_Subscription)上列出。

在完成人员订阅的静脉源代码中是否缺少某些内容?

甚至可以在TraCI中订阅人吗?

1 个答案:

答案 0 :(得分:1)

您绝对正确。从Veins 5a1开始,Veins不支持行人(在SUMO中为 Persons ),这意味着用户需要编写其他代码。

对于内部项目,我们仅克隆了代码处理工具订阅,在适当的地方替换了类和变量名(即,将CMD_SUBSCRIBE_PERSON_VARIABLE = 0xde替换为ID_LIST,然后为每个新用户订阅VAR_POSITION等,并对这些变量的更改做出反应调用addModulenextPosition)。