尝试通过 TraCI Interface to SUMO 在 Veins 中使用车辆跟踪时出错

Error when trying to use vehicle tracking in Veins via TraCI Interface to SUMO

我正在使用 Veins3.0SUMO-0.21.0omnetpp4.4. 我尝试在TraCI/SUMO中使用车辆跟踪命令。此处描述:http://sumo.dlr.de/wiki/TraCI/Change_GUI_State。 在那里你可以读到这个命令的 Variable View ID Type of the value New Value0xa6 "View #0" string <vehicle id>.
所以我在 TraCICommandInterface.cc 中写了一个新函数来跟踪车辆。

void TraCICommandInterface::setVehicleTracking(std::string nodeId) {
    uint8_t variableId = VAR_TRACK_VEHICLE;
    uint8_t variableType = TYPE_STRING;
    TraCIBuffer buf = connection.query(CMD_SET_GUI_VARIABLE, TraCIBuffer() << variableId << "View #0" << variableType << nodeId);
    ASSERT(buf.eof());
}

我使用了 TraCIConstants.h

中的一些常量
// track vehicle
#define VAR_TRACK_VEHICLE 0xa6
// command: set GUI variable
#define CMD_SET_GUI_VARIABLE 0xcc
// 8 bit ASCII string
#define TYPE_STRING 0x0C

函数从TraCIMobility.h调用,用getExternalID()填充节点id。

    void commandTrackVehicle(){
        getCommandInterface()->setVehicleTracking(getExternalId());
    }

当我使用 mobility->commandTrackVehicle(); 从车辆模块调用 commandTrackVehicle() 时发生错误。

SUMO 中的错误文本是:

error: tcpip::Storage::readIsSafe: want to read 1717063210 byte from Storage, but only 12 remaining

有没有人知道如何解决这个问题或获得有关该错误的更多信息?谢谢。

如果将 TraCIBuffer() << "View #0" 更改为 TraCIBuffer() << std::string("View #0"),您的代码应该可以正常工作。

原因有点复杂:

SUMO 的 TraCI API defines 其数据类型 string

32 bit string length, followed by text coded as 8 bit ASCII

Veins 3 具有 an overload for sending std::string 作为 TraCI 兼容字符串。它没有一个指向字节的指针数据类型 (char*)。也就是说,如果您将 char*(这就是 "View #0" 对编译器的意义)插入到 Veins 3 TraCIBuffer 中,它不会知道应用这种特殊格式,从而混淆 SUMO发送一个字节(它试图解释为 32 位长度,然后尝试读取 "length" 指示的尽可能多的字节,但失败了)。