如何限制仿真场景内车辆停留时长并实现自动驶离?
解决方案
1. SUMO侧调整车辆出发逻辑,控制并发数量
车辆未自动出发是因为路由配置中未设置正确的出发时间参数,按以下方式调整即可同时满足并发数限制要求:
- 打开SUMO路由文件(通常为
*.rou.xml),为120台车辆设置 staggered 出发时间,单台间隔设为0.5s:第一台出发时间为0,第二台为0.5,第三台为1,依次顺延。前30台全部进入场景的时间刚好为15s,与第一台车辆销毁时间对齐,可保证全程并发数稳定在30以内 - 路由文件车辆配置示例:
<vehicle id="veh_0" depart="0" route="your_route_id"> <param key="lifeTime" value="15"/> </vehicle> <vehicle id="veh_1" depart="0.5" route="your_route_id"> <param key="lifeTime" value="15"/> </vehicle> <!-- 剩余118台按0.5s间隔顺延depart时间即可 -->
- 批量生成路由可直接用Python脚本实现,无需手动修改:
for i in range(120): print(f'<vehicle id="veh_{i}" depart="{i*0.5}" route="your_route_id"><param key="lifeTime" value="15"/></vehicle>')
2. Veins侧实现车辆生命周期自动销毁
车辆进入场景后Veins会实例化对应TraCIVehicle节点,在节点逻辑中添加定时销毁逻辑即可实现15秒生命周期控制:
- 首先在车辆节点的
.ned文件中添加生命周期参数声明,用于读取SUMO侧配置:
double lifeTime = default(15.0);
- 在节点
initialize()方法中注册销毁自消息:
void TraCIVehicle::initialize(int stage) { BaseApplLayer::initialize(stage); if (stage == 0) { double lifeTime = par("lifeTime").doubleValue(); scheduleAt(simTime() + lifeTime, destroySelfMsg); } }
- 在
handleSelfMsg()方法中添加销毁逻辑:
void TraCIVehicle::handleSelfMsg(cMessage* msg) { if (msg == destroySelfMsg) { traci->vehicle.remove(getId()); delete this; } else { BaseApplLayer::handleSelfMsg(msg); } }
效果验证
按上述配置运行仿真后:
- 每0.5秒有1台新车辆自动进入场景
- 第15秒时第一台车辆到期销毁,同时第30台车辆刚好进入,场景内总车辆数稳定在30
- 120台车辆全部投放完成总耗时60秒,全程并发数不超过30
- 每台车辆在场景内停留时间误差小于100ms,符合15秒的要求
内容的提问来源于stack exchange,提问作者h.bahar
相关产品推荐
相关产品推荐

