尝试通过TraCI接口在静脉中使用车辆跟踪到SUMO

时间:2015-12-01 09:35:15

标签: omnet++

我使用 Veins3.0 SUMO-0.21.0 omnetpp4.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());
    }

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

SUMO中的错误文本是:

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

是否有人知道如何解决此问题或获取有关错误的更多信息?感谢。

1 个答案:

答案 0 :(得分:0)

如果您将TraCIBuffer() << "View #0"更改为TraCIBuffer() << std::string("View #0"),则您的代码应该有效。

原因有点复杂:

SUMO的TraCI API defines其数据类型string

  

32位字符串长度,后跟文本编码为8位ASCII

Veins 3具有an overload for sending std::string作为与TraCI兼容的字符串。它没有一个指针到字节的数据类型(char*)。也就是说,如果您向Veins 3 char*插入"View #0"(对于编译器来说是TraCIBuffer),它就不会知道应用这种特殊格式,令人困惑SUMO通过发送一个字节(它试图解释为32位长度,然后尝试读取多个字节作为&#34;长度&#34;表示,并且失败)。