Artery仿真运行约140秒后反复崩溃问题咨询
你遇到的这个崩溃是Artery里LocalDynamicMap模块的断言校验失败导致的,这个断言的作用是确保收到的**协作感知消息(CA)**有效期符合ETSI ITS标准要求——标准规定CA消息的有效期必须落在当前仿真时间到当前时间+2秒的区间内,保证消息是新鲜有效的。
可能的原因分析
断言触发说明收到的CA消息expiry值不符合预期,常见诱因有这几个:
- CA消息配置异常:自定义场景里的CA消息有效期设置超出了1-2秒的合理范围,比如设得过长(如5秒)或过短(甚至消息已经过期)。
- 时间同步偏差:SUMO与OMNeT之间的时间同步出现问题,导致CA消息的时间戳/有效期和OMNeT的
simTime()不匹配。 - 自定义代码修改了CA处理逻辑:如果你改动过Artery的CA消息生成或处理代码,可能不小心错误计算了
expiry值。
分步解决方法
检查CA消息的配置参数
打开你的omnetpp.ini,查找CA相关配置项,比如:*.traci.launcher.vehicle[*].application.ca.expiry = 1.5s *.traci.launcher.vehicle[*].application.ca.interval = 0.1s确保
expiry的值设置在1s到2s之间,这是符合标准的合理范围。如果配置里没有这个项,Artery会用默认值,但自定义场景建议显式指定。验证SUMO与OMNeT++的时间同步
检查launchd.xml里的SUMO启动参数,确认是否设置了正确的步长(比如--step-length 0.1),同时确保Artery默认的时间同步机制正常工作——Artery会自动让SUMO和OMNeT++时间保持一致,若自定义场景修改过时间相关配置,可能导致同步失效。调试CA消息的具体数值
为精准定位问题,可在崩溃代码位置添加日志输出:修改src/artery/application/LocalDynamicMap.cc的updateAwareness函数,在断言前加入日志:EV_WARN << "Received CA message - expiry: " << entry.expiry << ", current simTime: " << simTime() << endl;重新编译Artery后运行仿真,查看崩溃前的日志,就能看到具体的
expiry和simTime数值,判断是expiry已过期(≤当前时间)还是过长(≥当前时间+2秒)。检查自定义代码的CA逻辑
如果你修改过CA消息生成代码(比如自定义了Vehicle应用),检查计算expiry的部分:是否错误使用了SUMO时间而非OMNeT++的simTime(),或是计算时单位出错(比如把毫秒当成秒)。
临时应急方案(不推荐长期使用)
如果需要先让仿真跑起来验证其他功能,可以暂时注释掉这个断言(在LocalDynamicMap.cc里把断言行注释掉),但这只是权宜之计——这个断言是为了过滤无效CA消息,长期注释可能导致后续地图感知逻辑出现异常。
内容的提问来源于stack exchange,提问作者M. Hardt

