2、SUMO基础入门:安装、核心概念与第一个仿真示例

各位同学,欢迎来到SUMO的世界。

说实话,我第一次接触SUMO的时候,也被它那一堆术语搞得有点懵。什么网络、路线、车辆类型……感觉像在学一门新语言。但别担心,今天我们就把它拆开揉碎了讲清楚。

2.1 SUMO的安装——别踩我踩过的坑

安装这事,说简单也简单,说坑也坑。我个人习惯用Windows系统做开发,但如果你用Linux,那会更顺畅。

⚠️ 注意: 我曾经在Windows上装SUMO时,路径里带了中文,结果死活跑不起来。所以,安装路径请务必全英文!

Windows安装步骤:

  1. 去SUMO官网下载最新的安装包(.exe文件)
  2. 双击安装,一路Next
  3. 安装完成后,把SUMO的bin目录加到系统环境变量PATH里
  4. 打开命令行,输入 sumo --version,看到版本号就说明装好了

Linux(Ubuntu)安装:

sudo add-apt-repository ppa:sumo/stable
sudo apt-get update
sudo apt-get install sumo sumo-tools sumo-doc

嗯,这里要注意:Linux下装完,环境变量通常会自动配好。如果不行,手动加一下 export SUMO_HOME=/usr/share/sumo 到你的 .bashrc 里。

2.2 核心概念——说白了就这三样

SUMO的核心,说白了就三个东西:网络、路线、车辆类型。你想想看,一个交通仿真,不就是车在路上跑吗?

2.2.1 网络(Network)——路在哪?

网络就是地图。它定义了道路的走向、车道数量、限速、红绿灯等等。SUMO的网络文件是 .net.xml 格式。

我在项目中遇到过最头疼的事,就是网络文件里车道连接没配好,结果车到了路口全堵死。所以,网络文件的质量直接决定了仿真能不能跑起来。

2.2.2 路线(Route)——车怎么走?

路线就是车辆从起点到终点的路径。它由一系列的路段(edge)组成。SUMO里,路线文件是 .rou.xml 格式。

你可能会问:路线是手动指定的吗?其实可以手动,但更常见的是用工具自动生成。比如,你可以定义OD矩阵(起终点矩阵),让SUMO自己算路线。

2.2.3 车辆类型(Vehicle Type)——车长啥样?

车辆类型定义了车的物理属性:长度、最大速度、加速度、颜色等等。这个在 .rou.xml 里用 <vType> 标签定义。

💡 我的经验: 做自动驾驶仿真时,车辆类型特别重要。比如你想模拟一辆卡车,它的长度和加速度跟小轿车完全不一样。我曾经因为没改车辆类型,结果仿真里卡车跟赛车一样起步,闹了笑话。

2.3 第一个交通仿真示例——动手吧!

光说不练假把式。我们来写一个最简单的仿真:一条直路,一辆车从一头开到另一头。

第一步:创建网络文件(mynet.net.xml)

最简单的方式是用SUMO自带的 netedit 工具画一条路。但为了让你理解底层结构,我们直接写XML。

<?xml version="1.0" encoding="UTF-8"?>
<net version="1.19" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd">
    <edge id="edge1" from="node1" to="node2" priority="1" numLanes="1" speed="13.89"/>
    <edge id="edge2" from="node2" to="node3" priority="1" numLanes="1" speed="13.89"/>
    <junction id="node1" x="0" y="0" type="dead_end"/>
    <junction id="node2" x="100" y="0" type="priority"/>
    <junction id="node3" x="200" y="0" type="dead_end"/>
    <connection from="edge1" to="edge2" fromLane="0" toLane="0"/>
</net>

这段代码定义了一条200米长的直路,分成两段(edge1和edge2),限速13.89 m/s(约50 km/h)。

第二步:创建路线文件(myroute.rou.xml)

<?xml version="1.0" encoding="UTF-8"?>
<routes>
    <vType id="car1" length="4.5" maxSpeed="13.89" accel="2.6" decel="4.5" color="1,0,0"/>
    <vehicle id="veh1" type="car1" depart="0">
        <route edges="edge1 edge2"/>
    </vehicle>
</routes>

这里定义了一辆红色小轿车,从edge1出发,沿着edge1和edge2行驶。

第三步:创建配置文件(myconfig.sumocfg)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <input>
        <net-file value="mynet.net.xml"/>
        <route-files value="myroute.rou.xml"/>
    </input>
    <time>
        <begin value="0"/>
        <end value="100"/>
    </time>
</configuration>

第四步:运行仿真

在命令行里输入:

sumo-gui myconfig.sumocfg

你会看到一个图形界面,一辆红色小车从左边开到右边。嗯,就这么简单。

🔧 小技巧: 如果你不想每次都用命令行,可以在配置文件里加上 <gui-only value="true"/>,这样双击配置文件就能直接打开GUI。

2.4 知识体系总览

下面这张图,是我自己画的SUMO核心知识结构。你看一眼,心里就有谱了。

SUMO核心知识体系 网络 (Network) 路线 (Route) 车辆类型 (vType) 道路 交叉口 车道连接 路段序列 OD矩阵 路径规划 物理属性 颜色外观 驾驶行为 三者结合 → 完整的交通仿真

这张图把SUMO的核心概念串起来了。网络是骨架,路线是路径,车辆类型是血肉。三者缺一不可。

2.5 避坑指南

最后,分享几个我踩过的坑:

  • 路径问题: 我曾经把网络文件和路线文件放在不同目录,结果SUMO找不到文件。建议所有文件放同一个文件夹。
  • 时间设置: 仿真结束时间设得太短,车还没到终点就停了。记得把 end 设大一点。
  • 车辆出发时间: depart="0" 表示仿真一开始车就出现。如果你想模拟高峰期,可以设置不同的出发时间。

好了,这一章的内容就到这。你跟着做一遍,应该就能跑通第一个仿真了。记住,动手是最好的学习方式。

可可精品资料库