以下是根据搜索结果整理的 SUMO二次开发教程,涵盖基础环境配置、核心API使用及进阶应用案例:
一、SUMO开发环境搭建
1. Windows安装
# 下载地址(SUMO官网)
https://sumo.dlr.de/docs/Downloads.php
# 安装步骤
1. 解压至D盘(如D:\sumo-1.8.0)
2. 创建桌面快捷方式(sumo-gui.exe, netedit.exe)
3. 配置环境变量:
- 用户变量和系统变量均添加:D:\sumo-1.8.0\bin
2. Linux安装(推荐Ubuntu)
# 通过APT安装
sudo add-apt-repository ppa:sumo/stable
sudo apt-get update
sudo apt-get install sumo sumo-tools sumo-doc
# 验证安装
sumo --version # 查看版本
sumo-gui # 启动图形界面
二、核心文件与仿真流程
1. 必要文件
文件类型 | 描述 | 生成工具 |
---|---|---|
.net.xml | 路网文件 | netconvert 或netedit |
.rou.xml | 车辆路径与类型定义 | randomTrips.py 或手动编写 |
.sumocfg | 仿真配置文件 | 手动编写 |
2. 路网生成示例
# 使用netconvert生成路网
netconvert --node-files=exa.nod.xml --edge-files=exa.edg.xml --output-file=exa.net.xml
# 使用osmWebWizard快速生成实际路网
osmWebWizard.py # 交互式地图截取工具
三、TraCI接口二次开发(Python)
1. 基础控制
import traci
traci.start(["sumo", "-c", "test.sumocfg"]) # 启动仿真
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep() # 推进仿真步长
vehicles = traci.vehicle.getIDList() # 获取所有车辆ID
for veh_id in vehicles:
pos = traci.vehicle.getPosition(veh_id) # 获取车辆坐标
speed = traci.vehicle.getSpeed(veh_id) # 获取速度
traci.close()
2. 自定义车辆类型
# 添加自定义车辆类型(IDM跟驰模型)
traci.vehicletype.copy("DEFAULT_VEHTYPE", "IDM_Car")
traci.vehicletype.setParameter("IDM_Car", "carFollowModel", "IDM")
traci.vehicletype.setParameter("IDM_Car", "tau", "1.5")
# 生成车辆时指定类型
traci.vehicle.add(vehID="car1", routeID="route0", typeID="IDM_Car")
3. 动态控制信号灯
# 获取信号灯ID
tl_ids = traci.trafficlight.getIDList()
# 设置相位时长
traci.trafficlight.setPhaseDuration(tlID="J0", duration=30)
# 实时响应交通状态(示例:公交优先)
if traci.inductionloop.getLastStepVehicleNumber("detector0") > 5:
traci.trafficlight.setPhase("J0", 2) # 切换至公交优先相位
四、进阶开发:集成Flow Project
1. Flow安装(Ubuntu)
git clone https://github.com/flow-project/flow.git
cd flow
conda env create -f environment.yml
source activate flow
pip install -e .
./scripts/setup_sumo_ubuntu1804.sh
2. 强化学习环境示例
from flow.envs import RingEnv
from flow.controllers import IDMController
# 创建环形路网仿真环境
env = RingEnv(
vehicles=25,
net_params={
"length": 230,
"lanes": 1,
"speed_limit": 30
},
sim_params={"render": True}
)
# 运行仿真并输出轨迹
for _ in range(1000):
action = env.action_space.sample() # 随机动作(强化学习可替换为策略输出)
obs, reward, done, _ = env.step(action)
print(f"车辆位置: {env.k.vehicle.get_positions()}")
五、常见问题解决
-
TraCI连接失败
- 检查SUMO是否以
--remote-port
参数启动:sumo -c test.sumocfg --remote-port 8873
- Python端指定端口:
traci.connect(port=8873)
- 检查SUMO是否以
-
车辆异常行为
- 检查跟驰模型参数:
traci.vehicletype.setParameter("IDM_Car", "accel", "2.6") # 设置加速度 traci.vehicletype.setParameter("IDM_Car", "decel", "4.5") # 设置减速度
- 检查跟驰模型参数:
-
路网生成错误
- 使用
netedit
可视化调试:netedit -s exa.net.xml # 加载并检查路网拓扑
- 使用
六、学习资源
- 官方文档: https://sumo.dlr.de/docs/index.html
- TraCI API参考: https://sumo.dlr.de/docs/TraCI.html
- Flow项目案例: https://github.com/flow-project/flow/tree/master/examples
- 上海交大SUMO手册: https://docs.hpc.sjtu.edu.cn/app/engineeringscience/sumo.html
通过上述教程,可快速实现 动态车辆控制、信号优化、强化学习集成 等二次开发需求。