我使用 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 Value
为0xa6 "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
是否有人知道如何解决此问题或获取有关错误的更多信息?感谢。
答案 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;表示,并且失败)。