在 SUMO 中进行编程主要是通过 TraCI(Traffic Control Interface)实现的,TraCI 允许外部程序与 SUMO 仿真进行交互,实时控制和获取仿真中的数据。以下是关于 SUMO 编程的详细介绍:
环境准备
- 安装 SUMO:按照前面提到的方法完成 SUMO 的安装,并设置好环境变量
SUMO_HOME
。 - 安装 Python:TraCI 主要使用 Python 进行编程,确保你的系统已经安装了 Python(推荐 Python 3.x)。
基本编程流程
1. 导入必要的库
import traci
import sumolib
import os
2. 设置 SUMO 可执行文件路径和配置文件路径
# 设置 SUMO 可执行文件路径
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(tools)
else:
sys.exit("请设置环境变量 SUMO_HOME")
# 设置 SUMO 配置文件路径
sumo_binary = sumolib.checkBinary('sumo-gui') # 使用 sumo-gui 可以看到仿真界面,若使用 sumo 则无界面
sumo_config = "path/to/your/sumo.cfg"
3. 启动 SUMO 仿真并连接到 TraCI
sumo_cmd = [sumo_binary, "-c", sumo_config]
traci.start(sumo_cmd)
4. 进行仿真循环并执行控制操作
step = 0
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep() # 执行一个仿真步骤
# 示例:获取所有车辆的 ID
vehicle_ids = traci.vehicle.getIDList()
for vehicle_id in vehicle_ids:
# 获取车辆的速度
speed = traci.vehicle.getSpeed(vehicle_id)
print(f"车辆 {vehicle_id} 的速度是: {speed} m/s")
step += 1
5. 关闭 TraCI 连接
traci.close()
常见操作示例
控制车辆
- 改变车辆速度:
vehicle_id = "veh0"
new_speed = 10 # m/s
traci.vehicle.setSpeed(vehicle_id, new_speed)
- 改变车辆路线:
vehicle_id = "veh0"
new_route_id = "new_route"
traci.vehicle.changeTarget(vehicle_id, new_route_id)
获取交通数据
- 获取路口的交通流量:
tls_id = "tls0"
incoming_edges = traci.trafficlight.getControlledLinks(tls_id)
for edge in incoming_edges:
vehicle_count = traci.edge.getLastStepVehicleNumber(edge[0][0])
print(f"路口 {tls_id} 进入边 {edge[0][0]} 的车辆数量是: {vehicle_count}")
复杂场景示例:动态交通控制
以下是一个简单的动态交通控制示例,根据路口的交通流量动态调整交通信号灯的相位时长。
import traci
import sumolib
import os
# 设置 SUMO 可执行文件路径和配置文件路径
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
import sys
sys.path.append(tools)
else:
sys.exit("请设置环境变量 SUMO_HOME")
sumo_binary = sumolib.checkBinary('sumo-gui')
sumo_config = "path/to/your/sumo.cfg"
sumo_cmd = [sumo_binary, "-c", sumo_config]
traci.start(sumo_cmd)
step = 0
tls_id = "tls0"
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep()
# 获取当前交通信号灯相位
current_phase = traci.trafficlight.getPhase(tls_id)
# 获取当前相位下各边的车辆数量
incoming_edges = traci.trafficlight.getControlledLinks(tls_id)
vehicle_counts = []
for edge in incoming_edges:
vehicle_count = traci.edge.getLastStepVehicleNumber(edge[0][0])
vehicle_counts.append(vehicle_count)
# 根据车辆数量动态调整相位时长
if sum(vehicle_counts) > 10:
# 如果车辆总数超过 10,延长当前相位时长
traci.trafficlight.setPhaseDuration(tls_id, 30)
else:
# 否则,恢复默认相位时长
traci.trafficlight.setPhaseDuration(tls_id, 15)
step += 1
traci.close()
通过以上步骤和示例,你可以利用 TraCI 进行 SUMO 的编程,实现对交通仿真的实时控制和数据获取。