PTV Vissim 基于条件更改车辆类别路径的脚本编写咨询
PTV Vissim 车辆路径动态切换实现方案
你可以通过Vissim COM接口编写Python脚本实现该功能,核心逻辑是实时监听指定类别车辆的点位通过状态,满足通过数量阈值后为车辆重新分配目标路径,具体实现步骤和代码如下:
前置配置要求
在运行脚本前,需要先在Vissim路网中完成基础元素配置:
- 为需要触发路径切换的车辆设置独立的车辆类别,避免和普通社会车辆逻辑混淆,记录该类别的编号
- 在车辆初始行驶路径上按需求布设指定数量的labs检测点位,记录所有点位的检测器编号
- 在最后一个labs点位的下游、路径分叉口上游位置,预先配置好两套静态路径决策:一套是车辆初始默认行驶路径,另一套是待切换的目标路径,记录目标路径对应的路径决策点ID、目标路径ID
实现脚本(Python版)
import win32com.client as win32 # -------------------------- 请根据自身路网修改以下参数 -------------------------- TARGET_VEH_CLASS = 10 # 需触发路径切换的车辆类别编号 LABS_DETECTOR_IDS = [1,2,3] # 需要依次经过的labs点位检测器编号,按行驶顺序排列 PATH_DECISION_ID = 5 # 路径切换位置的静态路径决策点ID TARGET_PATH_ID = 2 # 切换后目标路径的ID SIMULATION_SPEED = 10 # 仿真运行倍速 # ----------------------------------------------------------------------------- # 连接Vissim COM接口 vissim = win32.Dispatch("Vissim.Vissim") net = vissim.Net # 初始化车辆通过点位计数字典,key为车辆ID,value为已通过的labs点位数量 veh_pass_count = {} # 启动仿真 vissim.Simulation.SetAttValue("SimSpeed", SIMULATION_SPEED) sim_period = vissim.Simulation.AttValue("SimPeriod") for sim_step in range(int(sim_period / vissim.Simulation.AttValue("SimRes"))): vissim.Simulation.RunSingleStep() # 遍历所有labs检测器,读取当前仿真步通过的车辆 for det_id in LABS_DETECTOR_IDS: detector = net.Detectors.ItemByKey(det_id) # 获取当前步该检测器上的所有车辆 for veh in detector.Vehs: veh_id = veh.AttValue("No") veh_class = veh.AttValue("VehType") # 只处理目标类别车辆 if veh_class != TARGET_VEH_CLASS: continue # 初始化车辆计数 if veh_id not in veh_pass_count: veh_pass_count[veh_id] = 0 # 按顺序校验通过点位,避免跳点计数 expected_det_index = veh_pass_count[veh_id] if det_id == LABS_DETECTOR_IDS[expected_det_index]: veh_pass_count[veh_id] += 1 # 满足通过所有labs点位的条件时,执行路径切换 if veh_pass_count[veh_id] == len(LABS_DETECTOR_IDS): # 给车辆分配指定的目标路径 veh.SetPath(net.PathDecisions.ItemByKey(PATH_DECISION_ID).Paths.ItemByKey(TARGET_PATH_ID)) # 计数完成后从字典中移除该车辆,减少内存占用 del veh_pass_count[veh_id] # 清理已经驶出路网的车辆计数数据 all_current_veh_ids = [veh.AttValue("No") for veh in net.Vehs.GetAll()] for stored_veh_id in list(veh_pass_count.keys()): if stored_veh_id not in all_current_veh_ids: del veh_pass_count[stored_veh_id]
使用注意事项
- 所有labs检测点位必须布设在路径决策点的上游,若车辆驶过决策点后才触发计数,将无法完成路径修改
- 若需要对不同车辆设置不同的点位通过阈值、不同的目标路径,可扩展
veh_pass_count字典的存储结构,为每辆车单独存储规则 - 脚本运行前请确保已经在Vissim中加载了对应路网,且Vissim没有被其他进程占用COM接口
- 如果使用Vissim 7及以下版本,可将代码逻辑平移为VBS脚本,接口调用规则完全一致
内容的提问来源于stack exchange,提问作者ARChi MADel
相关产品推荐
相关产品推荐

