我正在使用Veins(4.7)和SUMO(0.32)对事故场景中的换道行为建模。我通过使用以下.ini配置成功创建了事故;
#Accident vehciles and details
*.node[0].veinsmobility.accidentCount = 1
*.node[0].veinsmobility.accidentStart = 80s
*.node[0].veinsmobility.accidentDuration = 100s
,其中Vehicle-0在85秒左右开始停止。现在,我想使用traci命令将连接的车辆定向到特定的车道(laneIndex);
traciVehicle->changeLane(laneIndex, 0.1);
void TraCICommandInterface::Vehicle::changeLane(uint8_t laneIndex, int32_t duration) {
uint8_t variableId = CMD_CHANGELANE;
uint8_t variableType = TYPE_COMPOUND;
int32_t count = 2;
uint8_t laneIndexT = TYPE_BYTE;
uint8_t timeT = TYPE_INTEGER;
int32_t time = duration*1000; //seconds to milliseconds
uint8_t durationT = TYPE_INTEGER;
TraCIBuffer buf = connection->query(CMD_SET_VEHICLE_VARIABLE, TraCIBuffer() << variableId << nodeId << variableType << count << laneIndexT << laneIndex << durationT << duration );
ASSERT(buf.eof());
}
但是,车辆不会改变车道。我知道SUMO为非事故情况建模,因此,如果目标车道上的车辆正在驶入或正在驶近,则不会执行车道变更。您是否知道如何解决这种问题?而且,如果我使用traci slowdown命令创建随机性以为车道变更留出足够的空隙,则不会发生事故。
任何建议都值得赞赏。
致谢。
答案 0 :(得分:0)
根据Python的TraCI文档,持续时间是车辆停留在另一个车道上的时间,因此它不是执行实际车道变更所需的时间。
如果确实是这种情况,则由于持续时间为0.1秒,并且静脉中的默认SUMO步长也为0.1秒,因此您可能不会在UI中看到车道变化。
但是,此功能是在称为Plexe的静脉排扩展中实现的。在这里,通过TraCI进行车道行驶的代码如下:
void TraCICommandInterface::Vehicle::changeLane(int lane, int duration)
{
uint8_t commandType = TYPE_COMPOUND;
int nParameters = 2;
uint8_t variableId = CMD_CHANGELANE;
TraCIBuffer buf = traci->connection.query(CMD_SET_VEHICLE_VARIABLE, TraCIBuffer() << variableId << nodeId << commandType << nParameters << static_cast<uint8_t>(TYPE_BYTE) << (uint8_t) lane << static_cast<uint8_t>(TYPE_INTEGER) << duration);
ASSERT(buf.eof());
}