尝试通过 TraCI Interface to SUMO 在 Veins 中使用车辆跟踪时出错
Error when trying to use vehicle tracking in Veins via TraCI Interface to SUMO
我正在使用 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());
}
当我使用 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" 指示的尽可能多的字节,但失败了)。
我正在使用 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());
}
当我使用 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" 指示的尽可能多的字节,但失败了)。