You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:12:38