Veins中车辆与RSU消息传输异常:30辆车时TraCI报错修复咨询
错误原因分析
- 错误日志
Edge '' is not known的核心是:代码尝试向TraCI查询一个空字符串对应的道路(Edge),TraCI无法识别空ID的道路,返回错误码255。 - 结合你的代码,问题出在
TraCIDemo11p中wsm->setDemoData(mobility->getRoadId().c_str())这一行:当车辆数量增加到30辆时,部分车辆在仿真时间t=250s左右还处于未进入路网的状态(比如刚完成初始化、停留在生成区域或路网边界),此时mobility->getRoadId()会返回空字符串。后续populateWSM或其他依赖道路ID的TraCI操作调用时,就会触发这个错误。 - 车辆数量≤20时,车辆生成密度低,所有车辆都能在消息发送前进入路网,因此不会出现空道路ID的情况。
修复方案
针对空道路ID的问题,有两种可行的修复方式:
方式一:发送消息前校验道路ID,空则跳过本次发送
修改TraCIDemo11p::handleMessage中的自消息处理逻辑,增加道路ID非空判断:
void TraCIDemo11p::handleMessage(cMessage* msg) { if (msg->isSelfMessage()) { std::string roadId = mobility->getRoadId(); // 校验道路ID是否为空,空则重新调度,不发送消息 if (roadId.empty()) { scheduleAt(simTime() + 1, msg); // 短时间后重试 return; } TraCIDemo11pMessage* wsm = new TraCIDemo11pMessage(); populateWSM(wsm); std::string arrayAsString; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { arrayAsString += std::to_string(mij[i][j]) + " "; } arrayAsString.pop_back(); arrayAsString += "\n"; } std::string newWSM_str = arrayAsString; wsm->setAMessage(newWSM_str.data()); wsm->setDemoData(roadId.c_str()); // 使用预先获取的非空roadId wsm->setSenderAddress(myId); sendDown(wsm); scheduleAt(simTime() + 53, msg); } else { DemoBaseApplLayer::handleMessage(msg); } }
方式二:延迟车辆首次消息发送时间
如果你的场景允许,可以调整首次自消息的调度时间,让所有车辆有足够时间进入路网:
- 在
TraCIDemo11p的初始化函数(比如initialize())中,把首次调度时间从默认值改为更大的数值(比如scheduleAt(simTime() + 10, selfMsg);),确保车辆都已进入路网后再发送消息。
额外检查
- 确认
populateWSM函数中是否有直接使用道路ID调用TraCI接口的逻辑,确保所有传入TraCI的参数都经过非空校验。
内容的提问来源于stack exchange,提问作者KaShingC
相关产品推荐
相关产品推荐

