You are on page 1of 101

2010

城市交通流微观仿真
城市交通仿真平台(SUMO)

基于 SUMO 平台
SUMO 是由德国宇航中心开发的,微观、连续的道路交通仿真架构和模型基
础,非常适合于道路交通仿真的研究人员使用,本文档介绍部分仿真理论
后,主要介绍 SUMO 仿真平台的架构和使用方法

贵州大学计算机学院

中文信息处理实验室

联系人:韩光辉

邮箱:hanyankai@yeah.net

作者:韩光辉
贵州大学计算机学院 NLPLAB
2011-12-15
版本:v1.3
前 言

本文档是本人在学习 SUMO 平台过程中的附带产物,文中内容均翻译自英


文资源(英语不好,请多包涵),这些英文资源有:SUMO 软件包中自带的帮助文
档,sourceforge 站点的资源(sourceforge.net/apps/mediawiki/sumo/),JSOM 站
点的内容,及其它一些网站资源。需要注意的是,作为开源平台,SUMO 软件包
在不断的更新,所以本文档中的内容有可能已经陈旧,或因软件修改使得原方法
已不可行,请读者参考本文档时留意这个问题。
由于 SUMO 的开源性质,它可以降低人们研究交通流仿真的门槛,极大地
方便了研究人员。但由于缺少中文资源,加上开源软件的共性问题,导致其使用
难度较大,其在国内使用不多。之前一些人发邮件向我咨询有关 SUMO 的问题,
由于本人已不再做交通方面的事情,现将先前在研究中积累的一些资料予以公
开,希望对目前从事相关研究的人员有所帮助。

版权说明:
本文档及内容的各项权利归本人及贵州大学计算机学院 NLPLAB 实验室所
有,未经本人许可,任何组织和个人不得用于商业用途,您可以使用该文档进行
非商业性质的科研工作,也可以在研究实验的基础上对文档内容作出修正,并再
次在网络上发布,但修正版本请注明原版本中的作者信息,及此版权说明。
城市交通仿真(SUMO)的概要信息
使用的模型:
(1)汽车运动模型:是由 Stefan Krauss 开发的微观、空间连续、时间离散的汽车流模型。
(2)用户分配模型:是由 Christian Gawron 开发的动态用户分配模型。
应用程序包(bin 目录)介绍:
Activitygen:从网络中全部人群的描述来生成需求。
Dfrouter:使用探测器值构建车辆路径。
Duarouter:最短路径和动态用户均衡(DUE)计算,使用C. Gawron模型。
Jtrrouter:基于路口转弯比率的路径计算
Netgen:生成路网
Netconvert:导入并转换路网
Od2trips:导入 O/D 矩阵并转换为旅行路径
Polyconvert:导入多边形和兴趣点(POIs)
Sumo:实现仿真
Sumo-gui:仿真的 GUI 界面
TraCITestClient: 探索与外部应用进行通信的可能性
目录
1.简介 ............................................................................................................................................... 8
1.1.交通仿真............................................................................................................................. 8
1.1.1.交通仿真分类.......................................................................................................... 8
1.1.2.用户分配.................................................................................................................. 8
1.2.SUMO 概览 ......................................................................................................................... 8
1.2.1.特点.......................................................................................................................... 9
1.2.2.包含的应用.............................................................................................................. 9
1.2.3.设计原则................................................................................................................ 10
2.基本使用...................................................................................................................................... 10
2.1.符号 .................................................................................................................................. 10
2.2.命令行............................................................................................................................... 10
2.2.应用程序参数................................................................................................................... 10
2.3.XML 举例 .......................................................................................................................... 10
2.4.模式 .................................................................................................................................. 11
2.5.数据类型........................................................................................................................... 11
2.6.安装 SUMO ....................................................................................................................... 11
2.6.1.安装二进制版本(windows 平台) .......................................................................... 12
2.6.2.编译构建应用(Windows 平台) ............................................................................. 12
2.6.3.构建文档................................................................................................................ 14
3.使用命令行程序.......................................................................................................................... 14
3.1.基础 .................................................................................................................................. 14
3.1.1.开启命令行窗口.................................................................................................... 14
3.1.2.从命令行使用 SUMO 程序 ................................................................................... 14
3.2.参数 .................................................................................................................................. 15
3.2.1.命令行下设置参数................................................................................................ 15
3.2.2.参数值类型............................................................................................................ 15
3.3.配置文件........................................................................................................................... 15
3.3.1.配置文件命名规范................................................................................................ 16
3.3.2.配置文件和命令行参数 ........................................................................................ 16
3.3.3.生成配置文件模板................................................................................................ 16
3.3.4.保存当前配置到文件............................................................................................ 16
3.4.通用参数........................................................................................................................... 17
4.仿真准备...................................................................................................................................... 17
4.1.所需数据........................................................................................................................... 17
4.2.最佳实践........................................................................................................................... 18
5.网络构建...................................................................................................................................... 18
5.1.SUMO 道路网络 ............................................................................................................... 18
5.2.坐标系和对齐................................................................................................................... 19
5.3.使用自己的 XML 描述构建网络...................................................................................... 20
5.4.节点描述........................................................................................................................... 20
5.5.边的描述........................................................................................................................... 21
5.5.1.一般描述................................................................................................................ 21
5.5.2.定义允许的车辆类型............................................................................................ 23
5.5.3.路段定义................................................................................................................ 23
5.5.4.边类型描述............................................................................................................ 24
5.6.连接描述(Connection)...................................................................................................... 25
5.7.手工构建路网案例........................................................................................................... 29
6.网络导入...................................................................................................................................... 31
6.1.OpenStreetMap 格式的路网导入.................................................................................... 31
6.1.1.导入路网................................................................................................................ 31
6.1.2.导入额外的多边形(如建筑物,河流等) ............................................................. 32
6.1.3.导入脚本(Scripts) .................................................................................................. 34
6.1.4.编辑 OSM 网络 ...................................................................................................... 34
6.2.NETCONVERT 细节 ........................................................................................................... 34
6.3.NETCONVERT 的输出........................................................................................................ 38
6.4.网络生成........................................................................................................................... 39
7.需求建模...................................................................................................................................... 39
7.1.SUMO 的需求简介 ........................................................................................................... 39
7.2.车辆、车辆类型、路径的定义 ....................................................................................... 40
7.2.1.车辆类型................................................................................................................ 40
7.2.2.抽象车辆类别........................................................................................................ 41
7.2.3.车辆排量类别........................................................................................................ 42
7.2.4.可视化.................................................................................................................... 42
7.2.5.车辆跟驰模型........................................................................................................ 43
7.2.6.车辆和路径............................................................................................................ 44
7.2.7.车辆的出发和到达参数 ........................................................................................ 45
7.2.8.路径和车辆类型分布............................................................................................ 45
7.2.9.停车........................................................................................................................ 46
7.3.路由器的输入(内容) ........................................................................................................ 46
7.3.1.旅程定义................................................................................................................ 46
7.3.2.使用流定义............................................................................................................ 48
7.3.3.导入 OD 矩阵 ........................................................................................................ 51
7.3.4.描述街区................................................................................................................ 51
7.3.5.描述矩阵单元........................................................................................................ 52
7.3.6.分裂大型矩阵........................................................................................................ 52
7.3.7.处理破碎的数据.................................................................................................... 52
7.3.8.随机路径................................................................................................................ 52
7.3.9.路径猜测................................................................................................................ 52
7.3.10.使用 JtrRouter...................................................................................................... 53
7.3.11.使用 DfRouter ...................................................................................................... 54
7.3.12.使用 ActivityGen .................................................................................................. 56
7.3.13.动态用户分配(DUA) ............................................................................................ 56
8.仿真 ............................................................................................................................................. 56
8.1.基本仿真定义................................................................................................................... 56
8.2.道路网络........................................................................................................................... 56
8.3.交通需求........................................................................................................................... 57
8.4.为仿真定义时段............................................................................................................... 57
8.5.高级交通灯仿真............................................................................................................... 57
8.5.1.载入新的交通灯仿真程序 .................................................................................... 57
8.5.2.交通灯仿真程序导入工具 .................................................................................... 59
8.5.3.定义程序交换时间和过程 .................................................................................... 60
8.5.4.交通灯性能评估.................................................................................................... 61
8.6.SUMO 的公共运输仿真(公交系统) ................................................................................. 61
8.7.SUMO 的可变速度信号 ................................................................................................... 62
8.8.SUMO 的重新路由 ........................................................................................................... 63
8.8.1.二次路由器............................................................................................................ 63
8.8.2.关闭街道................................................................................................................ 63
8.8.3.分配新的目的地.................................................................................................... 64
8.8.4.分配新的路径........................................................................................................ 64
8.9.可行的仿真方案............................................................................................................... 65
8.9.1.使用随机路径仿真................................................................................................ 65
8.9.2.使用探测器数据仿真............................................................................................ 66
8.9.3.使用车流分布仿真................................................................................................ 69
8.9.4.公交线路仿真........................................................................................................ 70
8.10.使用 GUISIM ................................................................................................................... 72
8.10.1 基本使用描述...................................................................................................... 72
8.10.2.与视图交互.......................................................................................................... 73
8.10.3.在 GUISIM 中使用贴图(背景图片) ..................................................................... 75
8.10.4.配置文件.............................................................................................................. 76
9.SUMO 输出 .................................................................................................................................. 77
9.1.车辆发射器状态............................................................................................................... 78
9.2.感应线圈输出................................................................................................................... 78
9.3.道路性能均值................................................................................................................... 78
9.4.受约束的道路性能均值................................................................................................... 79
9.5.车道性能均值................................................................................................................... 79
9.6.路网最原始数据输出....................................................................................................... 79
9.7.旅程信息输出................................................................................................................... 80
9.8.车辆路径输出................................................................................................................... 80
9.9.车辆类型调查................................................................................................................... 80
10.TraCI............................................................................................................................................ 80
10.1.TraCI 简介 ........................................................................................................................ 80
10.2.仿真步骤......................................................................................................................... 80
11.选择研究主题的一些建议........................................................................................................ 81
11.1.车辆重新选择路径......................................................................................................... 81
11.1.1.基本描述.............................................................................................................. 81
11.1.2.应该记住的事情.................................................................................................. 81
11.2.在线交通仿真................................................................................................................. 81
11.3.基于 GSM 的监视 ........................................................................................................... 81
11.3.1.怎样使用 GSM 跟踪车辆 .................................................................................... 81
11.4.开发自己的跟车模型..................................................................................................... 81
11.4.1.实现新的跟车模型.............................................................................................. 81
11.4.2.定义车辆类型...................................................................................................... 83
11.4.3.跟车模型接口...................................................................................................... 85
11.4.4.重新进行微观仿真.............................................................................................. 86
11.4.5.新模型开发案例.................................................................................................. 87
12.附录 A........................................................................................................................................ 87
12.1.词汇表 ............................................................................................................................ 87
12.2.常见问题......................................................................................................................... 88
12.2.1.综述性方面.......................................................................................................... 88
12.2.2.软件特性方面...................................................................................................... 88
12.2.3.构建和安装方面.................................................................................................. 89
12.2.4.基本使用方面...................................................................................................... 89
12.2.5.关于 NETCONVERT ......................................................................................... 90
12.2.6.关于仿真方面...................................................................................................... 90
12.2.7.关于可视化.......................................................................................................... 91
12.2.8.XML 模式定义 ..................................................................................................... 92
12.3.关于 SUMO 整体性的描述 ............................................................................................ 92
13.附录 B ........................................................................................................................................ 92
13.1.JOSM 入门 ...................................................................................................................... 92
13.1.1.基本概念.............................................................................................................. 92
13.1.2.在 JOSM 中编辑地图........................................................................................... 92
13.1.3.上传地图到 OSM 服务器 .................................................................................... 93
13.1.4.How Tos ................................................................................................................ 93
13.1.5.快捷键.................................................................................................................. 96
13.2.概念 ................................................................................................................................ 99
13.2.1.结点、路线、关系.............................................................................................. 99
13.2.2.标签 ..................................................................................................................... 99
13.2.3.对象 ID ............................................................................................................... 100
13.2.4.对象版本............................................................................................................ 100
13.3.JOSM 接口 .................................................................................................................... 100
13.3.1.地图视图............................................................................................................ 100
13.3.2.主菜单................................................................................................................ 100
13.3.3.工具栏................................................................................................................ 101
13.3.4.切换工具栏........................................................................................................ 101
13.3.5.其他工具栏........................................................................................................ 101
1.简介

1.1.交通仿真

1.1.1.交通仿真分类

根据仿真细节的等级,交通流模型有 4 个等级:
宏观模型:
微观模型:仿真道路上每个车辆的移动,一般假定车辆行为同时依赖于车辆的物理属性
和 驾 驶 员 的 控 制 行 为 。 SUMO 使 用 Stefan Krau 开 发 并 被 后 续 扩 展 的 微 观 模 型 (see
Krauss1998_1, Krauss1998_2) 。
中观仿真:介于宏观和微观之间,使用序列方法仿真车辆移动,单个车辆在这些序列间
移动。
亚微观仿真:象微观那样看待车辆,但是扩展了很多子结构。例如这些子结构可能描述
了引擎转与车辆速度有关,或者驾驶员的行为偏好。这比简单的微观仿真有更多的细节计算。
然而亚微观模型需要更长的计算时间,这限制了仿真的网络规模。
在连续空间仿真中,每个车辆有一个浮点数描述的特定位置。相反,离散空间仿真是细
胞自动机,它把街道分成很多细胞,在仿真街道上的车辆从一个细胞跳到另一个细胞。

1.1.2.用户分配

很显然,每个司机都试图选择通过网络的最短路径,但是如果所有人都这样做,一些
路径(尤其是干道)将变得拥挤,使得用户利益受损。这个问题的解决方法就是用户分配,目
前已经有多种方法可用,SUMO 使用的是 Christian Gawron 开发的动态用户分配(DUA)方法

1.2.SUMO 概览

SUMO 是一个微观的、连续的道路交通仿真软件,主要由德国宇航中心开发。(German
Aerospace Center (DLR).)
该软件始于 2000 年,其作为一个开源、微观道路交通仿真而开发的主要目的是给交
通研究组织提供一个实现和评估自己算法的工具。为获得完全交通仿真不必涉及所有需要的
部件,例如实现和设置交通网络,命令,交通控制。DLR 组织提供这个工具是想:1):作为
架构和模型基础来使用,使得实现算法更具可比性。2):从其他志愿者获得帮助。
从 2001 年,第一个可运行版本在 DLR 内部的许多工程上得到应用。主要的应用有:
1 实现和评估交通管制措施,例如新的交通灯系统或新的交通诱导方法。
2 SUMO 也被用来在有大量参与者参与的庞大事件中做短时交通预测(30 分钟)
3 使用 GSM 网络评估交通监督。
从 2002 年,开始应用于:车-车,车-设施间通信的评估。有两个重要的三方合作项目:
第一个 TraCI,这是 SUMO 的一个扩展,探索与外部应用进行通信的可能性,由 LA 大学的
Axel Wegener 开发。第二个是 TraNS,实现 SUMO 和网络仿真软件 ns2 的结合,使用 TraCI
实现两者通信。

1.2.1.特点

·完全工作流(网络和路径导入,动态用户分配,仿真)
·仿真
自由车辆移动冲突
多种车辆类型
多车道道路的车道变换
交叉口右向规则
交叉口类型的层次性
快速 openGL 图形用户接口
管理具有几万条街道的网络
高执行速度,在 1GHz 的机器上可以每秒更新 10 万辆车
使用 TraCI 在运行时与其他应用协同工作
网络宽度、基于道路、基于车辆、基于探测器输出
·网络
1)多种网络格式(VISUM,Vissim,Shapefiles,OSM,Tiger,RoboCup,XML
描述)可以导入
2)通过试探确定缺失值
·路径
微观路径,每个车辆一个路径
动态用户分配
·高可移植性
仅使用标准 C++库和兼容类库
主要是 Linux 发行包,但 Windows 包也存在
·高互操作性,因为仅使用 XML 数据

1.2.2.包含的应用

SUMO 不只是仿真应用的名字,也是完整软件包的名字,这个软件包包含了用于仿真的
许多应用,具体如下:
应用名字 简要描述
SUMO 微观仿真的命令行应用,没有可视化界面
GUISIM 微观仿真的图形界面应用
NETCONVERT 网络导入和生产器;读取不同格式的道路网络并转换为 SUMO 格式
GETGEN 为 SUMO 仿真生成抽象网络
DUAROUTER 计算通过网络的最短路径(时间最短),导入命令描述的不同类型,执行
DUA
JTRROUTER 使用交叉口转弯比率计算路径
DFROUTER 通过感应线圈计算路径
OD2TRIPS 分解 OD 矩阵为单个车辆路径
POLYCONVERT 从不同格式导入兴趣点和多边形,并转换为可被 GUISIM 可视化的描述
AdditionalTools 为实现一个大的应用程序,有一些任务是不必要的,因为已经存在了一
些对不同问题的解决方案(及工具软件)

1.2.3.设计原则

两个主要的设计目标:高性能和可移植。为此早期版本仅在命令行下运行,没有图形用
户界面,所有参数必须手工插入。同样由于这个目标,软件被分裂为几个部分,每个部分有
一个特定目的,必须单独执行。和其他仿真包有些不同,这里的动态用户分配作为一个外部
应用,而不是集成在仿真本身里面。这种分裂使得包里的应用程序更容易扩展,因为每一个
都比哪些集成在一起的程序小的多。而且,它允许使用更快的数据结构(为实现设计目标而
做的调整),而不是复杂和载入缓慢的数据结构。但是这使得 SUMO 与其他仿真包比起来使
用很不方便。因为有其他事情要做,我们目前没有为集成应用而重新设计的打算。

2.基本使用

2.1.符号

Wiki 中的文档使用标识来区分不同类型信息。标识的意义将在后面描述。

2.2.命令行

如果你遇到这样的情况:
netconvert --visum=MyVisumNet.inp --output-file=MySUMONet.net.xml
你应该知道这是命令行调用。可能在行末还会有”\”,这表示你需继续输入而不要回车(输入时忽略
“\n”),下面的命令和上面的是一样的:
netconvert --visum=MyVisumNet.inp \
--output-file=MySUMONet.net.xml

2.2.应用程序参数

命令行参数名字一般这样标识:<Like this>

2.3.XML 举例

XML 元素和属性如下标识。如果它们的值是变量:<Like this>。完整的 XML 文件如下所


示:
<myType>
<myElem myAttr1="0" myAttr2="0.0"/>
<myElem myAttr1="1" myAttr2="-500.0"/>
<myType>

2.4.模式

方括号”[ ]”表示里面的信息是可选的,尖括号”<>”表示这里需插入你自己的值。
<SUMO>是你保存 SUMO 软件包的位置。

2.5.数据类型

• <INT>: 整型值,可以为负的
• <UINT>: 无符号整型值,不需 >=0
• <FLOAT>: 浮点数值
• <STRING>: 任何字符串,但仅使用 ASCII字符
• <ID>: 不包含'#'的字符串
警告:
以下是禁止使用字符但并不完全:
• <FILE> or <FILENAME>: 文件路径
• <PATH>: 真实或抽象路径(主要是文件夹)
•<COLOR>:逗号分隔的浮点数三元组 (<FLOAT>,<FLOAT>,<FLOAT>), 依次描述红
绿蓝部分
• <2D-POSITION>:逗号分隔的浮点数二元组(<FLOAT>,<FLOAT>), 依次描述x,y偏
移。
•<2D-BOUNDING_BOX>:逗号分隔的浮点数四元组
(<FLOAT>,<FLOAT>,<FLOAT>,<FLOAT>),依次描述X最小值,Y最小值,X最大值,Y
最大值
•<PROJ_DEFINITION>:投影定义的字符串,被proj.4使用。 定义字符串必须被包含在
引号中。
参考文件类型:
• <NETWORK_FILE>: Netgen 或 Netconvert创建的SUMO网络文件
• <ROUTES_FILE>: DUAROUTER 或 JTRROUTER 或手工创建的路径文件

2.6.安装 SUMO

你需要明确你是简单使用它,还是打算扩展它。
1)
:如果你仅想使用 SUMO,下载解压后可以直接使用,运行 SUMO 所需要的所有文件
已经包含进来了。Tools 文件夹里的一些额外脚本会需要 Python 和 Perl 语言支持。
2)
:如果你还打算扩展 SUMO,你可以下载源码分发包并构建 SUMO。如果你在没有安
装我们的二进制分发包的机器上构建了软件包,请通知我们,这样我们可以把它包含进来。
2.6.1.安装二进制版本(windows 平台)

下载名为 sumo-winbin-<VERSION>.zip 的压缩包并解压。


在这个目录下,找到 bin 的文件夹,里面是可执行程序,你可以双击 GUISIM 并看下
data/examples 目录下的例子。所有其他的应用(如(DUAROUTER, DFROUTER 等)必须在命
令行下运行。
从 0.9.7 版开始,我们使用 Microsoft Visual Studio 2005 SP1 构建,这导致需要安装
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)并配置。如果你无法运行任
何一个 SUMO 应用,请首先试着安装这些包。

2.6.2.编译构建应用(Windows 平台)

这里介绍如何使用可以免费使用的工具构建 Sumo(这不意味着开源)。请在开始构建前
阅读完所有文档,这里有一些使用说明和缩写。
如果你不需要 GUI,就可以跳过所有与 Fox 相关的东西。如果你不需要精确的地理数据
转换,就可以跳过与 GDAL,Proj 和 FWTools 相关的东西。
1):下载 Visual C++ 2005 Express Edition (or a newer one)和 the Platform SDK 并安
装。确定正确配置 Visual Studio,以找到平台包含的文件和库。
2):下载 Python 并安装,这用来动态包含 SVN 版本到编译。(编译构建可以不依赖
它工作,但是你会发现令人讨厌的警告,甚至编辑窗口崩溃)。
Python 3 不能工作,Python 2.6 可以工作但是还未测试。
1):为你的Visual Studio version分别下载Xerces-C预编译包(对VS 2005 需要
windows-vc-8.0.zip;Visual Studio 2008 (9.0)),Fox 源码(1.6.36版确定可以工作),
FWTools(版本1.1.3可以工作,2.4.7会无端出错)或者PROJ,GDAL源码。
2):注意安装路径:MSVC如果使用包含空格的路径可能有问题,所以试着避免安装到
含空格的路径。
以上描述的仅对当前的SVN有效,或者使用一个更新版本(0.9.5以后的)。请谨记从SVN
编译你必须:1)安装Python,2)取消src/windows_config.h文件中的HAVE_VERSION_H
定义。
类库:
Xerces-C
Xerces-c是一套健壮、强大(同时也很庞大)的 XML 解析库。
截止(包括)0.10.3版本(确切是到SVN6993版次),SUMO默认使用xerces-c 2.8,现在使
用xerces-c 3.0.1.使用不同xerces版本编译需要的改变被限制在src/windows_config.h,
build/msvc8/Win32.vsprops and / or build/msvc8/x64.vsprops。
1):你仅需要安装Xerces3.0.1的二进制分发版,或者它的64位版本(做64位编译)。
2):创建一个环境变量XERCES,指向你的xerces-c目录,例如:
set XERCES=D:\libs\xerces-c-3.0.1-x86-windows-vc-8.0.
3):复制dll文件 %XERCES%\bin\xerces-c_3_0.dll和
%XERCES%\bin\xerces-c_3_0D.dll 到PATH下的目录 (终极手段:复制到
windows' system32 目录).
4):对于 64bit build 环境变量名师XERCES_64
Fox
1):如果不需要GUI,可以跳过这个部分
2):截止(包括)0.10.3版本(确切是到SVN 7025版次) sumo使用 fox 1.4, 现在使用fox 1.6.
构建指令时相同的,仅在需要时把1.6替换1.4,或者FOX16替换FOX14。
3):定位到fox的目录,打开VC工程。例如: D:\libs\fox-1.6.36\windows\vcpp\win32.dsw.
4):确定转换到VC8.0,构建foxdll工程作为发行和测试版本(如果你想使用VisualStudio
debugger)。如果你想构建64位平台的程序,你需要使用Configuration Manager为foxdll工
程添加新的配置。
5):你可能会得到大约240个警告和1个错误,但这些可以忽略。
6):未找到windows.h的错误意味着SDK未正确安装
7):创建环境变量FOX16指向fox目录,例如:
set FOX16=D:\libs\fox-1.6.36.
8):复制dll文件 %FOX16%\lib\FOXDLL-1.6.dll 和
%FOX16%\lib\FOXDLLD-1.6.dll到PATH下的目录 (终极手段:复制到windows'
system32 目录).

PROJ 和GDAL
如果不需要转换地理坐标,可以通过src/windows_config.h,
build/msvc8/Win32.vsprops 和 / or build/msvc8/x64.vsprops文件使proj和gdal不可用,并
跳过这个部分。否则你可以下载FWTools的二进制分发包或者自己编译。自己编译仅在
以下情况下是需要的:1):当你需要构建64位应用 2):你想传送(ship)SUMO可执行程序
的一个拷贝,但不需要传送FWTools。
FWTools
• 运行可执行文件,并选择一个目标目录。
•创建环境变量 PROJ_GDAL 指向那个目录,例如:
set PROJ_GDAL=D:\libs\FWTools1.1.3.
• 添加 %PROJ_GDAL%\bin 到 PATH变量
从源码构建

如果由于某些原因你需要自己构建 PROJ 和 GDAL ,请遵循PROJ 和 GDAL 的


相关构建指令。然后你应把它安装到通用目录,并使PROJ_GDAL变量指向这个目录。
你同样需要复制proj.dll 和 gdal*.dll到你的PATH.
如果是64位的构建,环境变量名应该是PROJ_GDAL_64.
SUMO软件
配置
1) 如果安装了所有的库,并正确设置了环境变量,则不需要进一步的配置,这个部
分可以跳过。
2) Visual Studio使用build/msvc8子目录里的.vsprops文件进行build配置。如果更改
了这些设置将会影响到所有的子工程(可以使用文本编辑器进行编辑),确定编辑这些文
件而不是编辑工程配置(.vcproj)
3) 如果你不想通过环境变量来定义包含文件和类库的位置,你可以把位置直接输
入到x64.vsprops或者Win32.vsprops(或者两者都用,这依赖于你的目标平台)。也可以
通过这些文件使得PROJ 和 GDAL不可用,这通过设置"LIB" Usermacro为空值来实现。
构建(Build)
• 打开工程 sumo\build\msvc8\prj.sln ,构建你需要的配置.
•64位的构建仍处于试验阶段,这个构建不使用Proj, GDAL and Fox,所以不构建guisim.
故障处理(Troubleshooting)
Linker reports something similar to "LINK: fatal error LNK1104: cannot open file 'C:\Program.obj'"

你可能把类库安装到含有空格的路径中了,相关的环境变量应嵌入在引号内。
例如:set FOX="D:\my libs\fox-1.4.29".
预构建事件失败(Failure on pre-build event)

如果Visual Studio pre-build event 失败,你完全可以忽略,除非你从SVN仓库构建,


这种情况你需要正确安装 Python.

2.6.3.构建文档

Windows平台不支持文档生成,但是Windows的二进制分发包里已经有了一个Pdf文档。

3.使用命令行程序
目前SUMO包里的大多数应用程序都是命令行工具,除了GUISIM工具。我们注意到使用
命令行程序不是很流行,尤其对那些非信息领域的科学家,下面简要介绍一下。但这并不是
完全的命令行使用指南,仅仅是SUMO使用的简要介绍。

3.1.基础

3.1.1.开启命令行窗口

首先需要打开命令行窗口。Windows平台,可以这样启动:开始—>运行-->cmd.exe,出
现的黑色窗口即是命令行。Linux平台:通过开启终端。

3.1.2.从命令行使用 SUMO 程序

SUMO程序是普通的可执行文件,可以在命令行下输入条码的名字来启动它们;例如
NETGEN程序调用:
Netgen.exe Windows平台
Netgen Linux平台
这个操作简单地启动程序,因为没有给出参数,程序不知道要做什么,所以仅仅打印出
自己的相关信息:
SUMO netgen Version <VERSION>
(c) DLR 2001-2010; http://sumo.sourceforge.net
Use --help to get the list of options.
3.2.参数

每个应用程序都有一个参数列表,这些参数定义了哪些文件需要处理、生成,或者定义
了程序的行为。一般情况下,一个程序需要至少两个参数:一个输入文件,一个输出文件。
但多数情况下需要更多的参数。每个程序的参数描述出现在应用程序描述里面。下面的描述
说明怎么设置参数。

3.2.1.命令行下设置参数

有两种参数:布尔参数和带值参数。前者不需要参数值,当且仅当该参数出现是它被设
置为“true”
。在命令行下设置带值参数包括两部分:参数名字和参数值。例如:如果想载
入指定的路网”mynet.net.xml”,必须这样写:
--net mynet.net.xml
前面的“--“表示后面跟的是参数的长名字,在空格之后必须紧跟参数值。也可以使用”=”代替空格:
--net=mynet.net.xml
一些常用参数可以被简写,参数--net简写为-n。下面的和以上两个例子有相同效果:
-n mynet.net.xml
请注意“-”表示简写参数名

3.2.2.参数值类型

SUMO应用程序知道哪种值是它们期望的,例如:NETGEN允许你设置默认车道数,必须
是整型值。也就是说,如果给了字符串或其他类型的值将被忽略,并且应用程序给出错误信
息。
列表是值类型的特殊情况,例如:要载入到仿真程序的附加文件列表。当给出的文件多
于一个时,文件之间必须用逗号分隔。

3.3.配置文件

参数列表可能很长,所以引入了配置文件。你可以设置一个配置文件,里面包含了你要
启动的应用程序的所有参数。仅给出这个配置文件,你就可以启动这个应用程序。
配置文件是XML文件,有个名为<configuration>的根元素,参数写成元素名字,希望设置的
参数值作为元素属性存储。命令行中给出的参数:--net-file test.net.xml 在配置文件中变为:
<net-file value="test.net.xml"/>。对于逻辑参数,可以用值“true”,“on”,“yes”,
“1”,或者“x”激活该参数;用值"false","off", "no", or "0"关闭该参数。
对于上面的例子,配置文件如下(保存为“test.sumo.cfg”):
<configuration>
<n v="test.net.xml"/>
<r v="test.rou.xml"/>
<a v="test.add.xml"/>
</configuration>
一个更详细但等价的写法如下:
<configuration>
<input>
<net-file value="test.net.xml"/>
<route-files value="test.rou.xml"/>
<additional-files value="test.add.xml"/>
</input>
</configuration>
上面的input部分仅服务于文件目的,没有功能方面的意思。
带有配置文件的SUMO调用是这样的:
sumo.exe -c test.sumo.cfg
这意味着我们不用参数,而是仅用参数--configuration-file <FILE> or -c <FILE>给出了配置文

3.3.1.配置文件命名规范

不同的目标程序有不同的扩展名,强烈建议遵循该规范。GUISIM的仿真配置必须遵循
规范,它仅能后缀为“.sumo.cfg”的仿真配置文件。扩展名规范如下:
• *.sumo.cfg: Configuration file for SUMO and GUISIM
• *.netc.cfg: Configuration file for NETCONVERT
• *.netg.cfg: Configuration file for NETGEN
• *.rou.cfg: Configuration file for DUAROUTER
• *.jtr.cfg: Configuration file for JTRROUTER
• *.df.cfg: Configuration file for DFROUTER
• *.od2t.cfg: Configuration file for OD2TRIPS

3.3.2.配置文件和命令行参数

附加配置文件后,命令行参数照样可以使用(GUI程序例外,它需要在配置文件里设置
好所有参数)。如果一个参数在配置文件和命令行里同时被设置,那么命令行里的值优先使
用。

3.3.3.生成配置文件模板

SUMO包里的程序允许用户生成配置文件模板,可以保存一个空的配置。可以这样来实
现(使用netgen命令):--save –template<FILE>。这种情况下,配置文件包含带有默认值的参数,
如果需要更多的参数信息,可以这样实现:--save-template.commented,这将提供更多的
参数信息。例如:Netgen --save –template test.sumo.cfg

3.3.4.保存当前配置到文件

可以把当前参数设置保存到配置文件,这样来实现:--save-configuration <FILE>.
3.4.通用参数

SUMO包里的程序共享一些参数,具体参看下表:
报告参数:
参数 描述
--verbose 详细报告应用程序正在做什么
--suppress-warnings 不记录警告信息
--print-options 打印参数,并给出当前参数值
--help 程序帮助信息
-?
--log-file 所有信息都显示在控制台,并记录进指定的文件

随机数参数:
这些参数决定了随机数发生器的种子怎么产生。相同的种子导致产生相同的随机数序列。
但是默认情况下,种子被硬编码为固定值。因此,只要保持配置设置不变,几次仿真运行的
结果输出是完全一样的。为了改变这种情况,使用下面的参数:
参数 描述
--srand 给随机数生成器设置指定值。可以使用不同
<INT> 的值以获得不同但可重现的仿真结果
--abs-rand 让SUMO自己选择种子。如果可能,种子将给
予/dev/urandom的输出,否则会基于当前系
统时间。该参数优先于—srand<INT>
注意: --abs-rand 的优先权高于 --srand <INT>意味着不能可以在配置文件中设置set
--abs-rand ,而在命令行里改写--srand <INT>。

4.仿真准备

4.1.所需数据

首先,需要让被仿真的交通网络运行起来。由于SUMO仿真大型网络,所以我们主要关
注导入交通网络及导入数据中丢失值的计算。因此,没有网络图形编辑器可用。另外,还需
要网络中道路的信息,及交通灯的信息。
更进一步,你可能需要交通需求的信息。尽管许多交通仿真使用统计分布,但是SUMO
中的每辆汽车知道自己的路径,这里的路径是要通过的边(道路)的列表。
你必须遵循以下步骤来实现一个仿真方案:
1) 创建网络
这一步可以有三种方法实现:
1:使用NETGEN生成抽象网络
2:在XML文件里设置自己的描述,并用NETCONVERT导入
3:使用NETCONVERT导入一个已经存在的网络(可以使用OSM地图)
2) 创建需求
这一步可以有五种方法实现:
1:描述明确的车辆路径
2:仅使用车流和转弯百分比(可以考虑)
3:生成随机路径(不实用)
4:导入OD矩阵(特定格式)
5:导入已存在的路径
3) A:如果需要,计算动态用户分配
4) B:用给定的方法校正仿真
5) 执行仿真,获得你所需要的输出
下图比较形象地表述了这个过程:

4.2.最佳实践

选择正确的方案依赖于所做的调查。如果想让结果容易评估,生成的抽象网络可能是最
好的解决方案,抽象网络已经被用来评估C2C-networks的弱点。如果需要研究真实交通,
可能会重用已经有的数据。

5.网络构建

5.1.SUMO 道路网络

SUMO使用自有的道路网络描述。尽管是可读的,但不意味着SUMO的道路网络要手工编
辑。相比之下,应该使用NETCONVERT转换已有的地图,或者使用NETGEN产生简单、抽象的
几何道路图形。
NETGEN允许自由地创建网络。对一些重新选择路径的小规模测试,tls-signals等,这可
能是最佳方法。街道的清晰命名使得容易定义自己的路径。但是如果你想仿真真实网络,
那么使用NETGEN产生的网络是没有用的。
使用NETCONVERT可以从其他数据源导入道路网络,如VISIM,shape files 和OSM
数据库,这也是设置真实世界网络的工具。
然而,多数例子是手工写成的XML文件,和从NETCONVERT转换来的。起初,这些
例子很小,手工编写可以比使用NETGEN更好的控制输出。而且使用XML数据定义自己
的网络非常灵活。
网络格式:
粗略地讲,SUMO道路网络是个有向图。节点代表道路交叉口,边代表道路或街道。
边和车道
边的属性有:
Id:边的标识
From:起始节点的ID
To:终止节点的ID
Priority:道路的重要程度,是一个数值类型
Function:一个抽象边的用途(目的)
对于仿真,我们感兴趣的是”function”这个属性,它描述了边怎么被使用,在真实世界中
是否可以找到这样的边,或者它只是一个为实现分配而建的辅助结构。我们定义了以下用途:
1) normal:这类“边”是道路网络中的普通部分,如高速公路或链接两条道路的街道。
2) connector:这类“边”是个微观连接器—并不是真实世界道路网络的一部分。然而
在仿真中,不区分“连接器道路”和“普通道路”,仅GUISIM允许隐藏“连接器道路”。
3) internal:这类“边”是交叉口的一部分(在交叉口内部)。在仿真中它的使用不同于普
通边(normal)。
每个边都需要它所拥有的车道的定义,每个车道的定义如下:
• id: 车道id
• depart(开出):车辆是否可以从该车道正常开出(1可以,2不可以)
• vclasses: 该车道允许或禁止通行的车辆类别列表。
• maxspeed: 该车道所允许的最高车速
• length: 该车道的长度
此外,车道有形状属性。尽管网络从(0,0)开始转换,并不一定网络的所有部分的坐标为
正。
节点
注意:可能两个不同的节点有相同的位置(怎么解释?)

5.2.坐标系和对齐

这里的网络使用笛卡尔坐标系,最左端的节点在x=0处,最下端的节点在y=0处。这意味
着,导入路网时,如果原始网络使用的不是笛卡尔坐标系,NETCONVERT 和 NETGEN
将会首先映射网络。然后移动网络到原点(0,0).
这个处理被记录在生成网络的元素位置里。可以找到如下属性:
以下省略。 。。
SUMO道路网络向北对齐,当然这取决于用户怎么定义道路网络,但是如果从Open
Street Map or shape files导入路网,上指向北方。
现有改动:
警告:如果从0.10.x版升级到24.07.2009版之后,请注意这个更正说明:
22.07.2009版与24.07.2009版之间网络格式发生了重大变化,可被概括为把所有字符
数据移动到了属性里面,具体如下:
•“车道形状”不在存储在车道的字符区域部分,而是移到了车道的形状属性里
•“网络映射、位置、边界描述”不在使用net=offset,conv-boundary>, orig-boundary,
and orig-proj等元素,而是引进了“location”元素,这些值被保存到该元素的如下属性
里:netOffset, convBoundary, origBoundary, projParameter。
• row-logic的子元素:“关键字,请求大小,车道数”依次转移到row-logic的如下属性
里:id, requestSize, and laneNumber
• tl-logic的子元素:“关键字,子关键字,偏移”依次转移到tl-logic元素的如下属
性里:id, programID, and offset。元素phaseno被丢弃不用。
• 交叉口的子元素inclanes(进入交叉口的边),intlanes(驶出交叉口的边),shape
依次转移到交叉口的如下属性里:incLanes, intLanes, and shape。
• 区域形状不在存储在区域的字符区,而是在区域的形状属性里。
• 多边形形状不在存储在多边形字符区,而是多边形的形状属性里。

5.3.使用自己的 XML 描述构建网络

几乎分发包里的所有例子都是手工创建的。这样做,你至少需要两个文件:一个文件存
储节点,另一个文件存储节点间的边。注意这里的“节点”和“交叉口”同义, “边”和“街
道”同义。除了定义节点和边,你还可以用类型来结合边的属性,设置边和车道的明确关系。
以下将描述这四个文件类型是怎么样的。(可以下载这些XML文档的模式描述)
创建这四类XML文件。 。。
在生成这些文件后,你至少需要节点文件和边文件(类型和连接文件是可选的),你可
以运行NETCONVERT 以构建网络。如果仅用节点和边文件(MyEdges.edg.xml,
MyNodes.nod.xml),调用格式如下:
netconvert --xml-node-files=MyNodes.nod.xml --xml-edge-files=MyEdges.edg.xml \
--output-file=MySUMONet.net.xml
如果还使用了类型和连接文件,则调用格式如下:
netconvert --xml-node-files=MyNodes.nod.xml --xml-edge-files=MyEdges.edg.xml \
--xml-connection-files=MyConnections.con.xml --xml-type-files=MyTypes.typ.xml
\ --output-file=MySUMONet.net.xml

可能你的边的定义不完整或有错,如果你仍希望导入这个网络,可以试着使用
NETCONVERT的--dismiss-loading-errors参数忽略这些。这样,定义不正确的边将被省略,
但是NETCONVERT仍试图构建网络。还可以绕水平轴翻转网络(使用参数--flip-y)。

5.4.节点描述

节点文件一般以“.nod.xml”作为扩展名,每行描述一个节点,如下所示:
<node id="<STRING>" x="<FLOAT>" y="<FLOAT>" [type="<TYPE>"]/>
方括号表示该参数可选,每个属性都有特定意义和值域:
属性名 是否必需 值类型 描述
id 是 id(string) 节点名
X 是 Float 平面上节点的x位置(米)
Y 是 Float 平面上节点的y位置(米)
type 否 枚举型 节点的类型(可选)
(priority,traffic_light,right_before_left)
如果没有输入节点类型,NETCONVERT会自动猜测,但是这可能不是你希望的类型。以
下类型是可用的,任何其他字符串都会出错,并导致程序终止:
• priority: 车辆必须等待,直到它们右侧车辆完全通过路口。
Vehicles have to wait until vehicles right to them have passed the junction
• traffic_light: 交叉口被交通灯控制着
• right_before_left: 来自右边的车辆优先通过
Vehicles will let vehicles coming from their right side pass.
当编辑节点文件时,牢记把节点定义嵌入到标记内部。一个完整的文件应如下面
的”cross31.nod.xml”文件所示(cross_notypes) :
<nodes> <!-- The opening tag -->
<node id="0" x="0.0" y="0.0" type="traffic_light"/> <!-- def. of node "0" -->
<node id="1" x="-500.0" y="0.0" type="priority"/> <!-- def. of node "1" -->
<node id="2" x="+500.0" y="0.0" type="priority"/> <!-- def. of node "2" -->
<node id="3" x="0.0" y="-500.0" type="priority"/> <!-- def. of node "3" -->
<node id="4" x="0.0" y="+500.0" type="priority"/> <!-- def. of node "4" -->
<node id="m1" x="-250.0" y="0.0" type="priority"/> <!-- def. of node "m1" -->
<node id="m2" x="+250.0" y="0.0" type="priority"/> <!-- def. of node "m2" -->
<node id="m3" x="0.0" y="-250.0" type="priority"/> <!-- def. of node "m3" -->
<node id="m4" x="0.0" y="+250.0" type="priority"/> <!-- def. of node "m4" -->
</nodes> <!-- The closing tag -->
正如你看到的,仅有第一个节点命名为“0”(网络的中心节点),这是一个交通灯控制
的路口,其他所有节点不受控制。你可能还注意到,街道的两端各需关联一个节点,很快你
会发现这其实不必要,但这使概念理解变得容易:每个边连接两个节点。

5.5.边的描述

5.5.1.一般描述

边和节点的描述差不多,但具有其他的参数。在边文件里,每个边的描述是这样的:
<edge id="<STRING>" (fromnode="<NODE_ID>" tonode="<NODE_ID>" |
xfrom="<FLOAT>" yfrom="<FLOAT>" xto="<FLOAT>" yto="<FLOAT>")
[type="<STRING>" | nolanes="<INT>" speed="<FLOAT>" priority="<UINT>"
length="<FLOAT>")][shape="<2D_POINT> [ <2D_POINT>]*"] [spread_type="center"]/>
这是什么意思呢?知道XML文件的人注意到“( ) ”及“|”不不允许使用的。我们想表
达那个参数是可选的。对起始和终止节点的定义,你可以使用node_id,也可以使用它们的位
置。对于后者,将自动在指定的位置创建节点。每个边都是单向的:从起始节点开始,在终
止节点结束。如果所给出的节点名字不能提取(因为在节点文件中没有定义),将会产生错误。
对每条边,应提供更多的属性,如拥有的车道数,允许的最大车速,边的长度(米)。而
且,还可以定义优先级(可选)。所有这些值(除了长度),可以使用相关的属性值给出,或
者给边一个类型以省略它们(如果是后者,你需要编辑一个类型文件),这里给出的类型名必
须在类型文件中存在,否则会出错。即使你提供了类型,仍然可以提供车道数,速度,优先
权等参数来覆盖这个类型值。也可以完全不用理会边的参数,这时将使用默认值:使用单车
道,默认优先权,最大允许速度为13.9m/s(50km/h),变长靠计算起止点的长度获得。
“边”可能有着复杂的几何形状,我们可以在形状标签里提供边的形状信息。如果边长
未给出,则形状长度会被累加(以获得边长)。spread_type=”center”(延伸类型)强制
NETCONVERT在起止点之间双向延展车道(对于connection),或者从构成形状的线条集
里延展车道。如果值为空,车道默认向右延伸。
列出边的属性如下:
属性名 是否必需 值类型 描述
Id 是 Id(string) 边的名字
formnode 否(下同) 参考node id 边的起始节点,需在节点文件中存在
Tonode 参考node id 边的终止节点,需在节点文件中存在
Type 参考type id 类型文件中的类型名
Nolanes Int 边的车道数,必须是整数
Speed Float 边允许的最大车速(m/s),必须是浮点数
Priority Int 边的优先权
Length Float 边长(m)
Shape 位置列表,用x, 从形状的定义里,起止节点被忽略。例如:
y表示,单位米 <edge id="e1" fromnode="0"
tonode="1" shape="0,0 0,100"/>描述一个边,
从节点0开始,首先经过点(0,0),然后向右行
100米,最后到达节点1
Spread_type 枚举类型 描述怎样延展车道;center表示双向延展车道,
(right,center) 其他值为右向延展
表中未提及的属性:
Xfrom,yfrom,xto,yto分别表示边将开始的节点的x,y位置,及终止节点的x,y位置,单位
是米,必须是浮点数。
优先权在节点处的让路规则计算中扮演重要角色。一般情况,道路允许的最高车速和其
拥有的车道数被用来计算那条路拥有更高的优先权(交叉口处)。我们可以这样来增加优先
权:让道路拥有更多的车道,或者让来自该道路的车辆不用等待直接进入路口。
边的定义信息也必须包含在标签内部,如下所示
(<SUMO>/data/examples/netbuild/types/cross_notypes/cross31.edg.xml):
<edges>
<edge id="1fi" fromnode="1" tonode="m1" priority="2" nolanes="2" speed="11.11"/>
<edge id="1si" fromnode="m1" tonode="0" priority="3" nolanes="3" speed="13.89"/>
<edge id="1o" fromnode="0" tonode="1" priority="1" nolanes="1" speed="11.11"/>
<edge id="2fi" fromnode="2" tonode="m2" priority="2" nolanes="2" speed="11.11"/>
<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="3" speed="13.89"/>
<edge id="2o" fromnode="0" tonode="2" priority="1" nolanes="1" speed="11.11"/>
<edge id="3fi" fromnode="3" tonode="m3" priority="2" nolanes="2" speed="11.11"/>
<edge id="3si" fromnode="m3" tonode="0" priority="3" nolanes="3" speed="13.89"/>
<edge id="3o" fromnode="0" tonode="3" priority="1" nolanes="1" speed="11.11"/>
<edge id="4fi" fromnode="4" tonode="m4" priority="2" nolanes="2" speed="11.11"/>
<edge id="4si" fromnode="m4" tonode="0" priority="3" nolanes="3" speed="13.89"/>
<edge id="4o" fromnode="0" tonode="4" priority="1" nolanes="1" speed="11.11"/>
</edges>
在这个例子中,我们使用了边的明确定义,使用类型的例子在类型描述一节介绍。
警告:
对街道id有一些约束:
不能包含任何以下字符'_'(下划线 用来标识车道id), '[' and ']' (标识枚举类型), ' ' (空
格,用来分隔列表), '*' (星, 作为通配符), ':' (冒号, as marker for internal lanes).

5.5.2.定义允许的车辆类型

从0.9.5版本开始,可以显式指定该车道允许或禁止的车辆类别。允许的车辆类别信息在
边描述文件的车道列表里指定。加入你想仅允许公共汽车在“2si”号道路的最左车道行驶(即
设置公交专用道),可以简单更改边定义如下:
... previous definitions ...
<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="3" speed="13.89">
<lane id="2" allow="bus"/>
<edge>
... further definitions ...
如果你想禁止乘客和出租车,可以这样:
... previous definitions ...
<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="3" speed="13.89">
<lane id="2" disallow="passenger;taxis"/>
<edge>
... further definitions ...
目前车道定义包括如下属性:
属性名 是否必需 值类型 描述
Id 是 int 枚举车道id(0代表最右边的车道,
车道数-1是最左边车道)
Allow 否 车辆类别列表 允许车辆类别的详细类别
disallow 否 车辆类别列表 禁止车辆类别的详细类别
允许和禁止属性都假定获得一个用分号分隔的车辆类别名字列表,参考车辆类别
("Vehicle Classes")。

5.5.3.路段定义

一般每条道路有一定的车道数,道路加宽定义成使用加宽后的道路,尽管在某些情况下,
设置单一道路和改变道路长度内的车道数更方便。
在2009.02.09版后,可以使用“split”—XML中边定义的一个子元素。Split必须这样使用:
... previous definitions ...
<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="3"
speed="13.89">
<split pos="30" lanes="0 1"/>
<edge>
... further definitions ...
这表示:从起始位置开始30米处开始分裂,插入一个名为 <EDGE_ID> <POSITION>
的节点。在该节点之前,这个边包含所有的车道。在此之后,仅有车道属性中给出的车
道被插入。这样产生了两条边,取代开始时的一条。第二条边包含两个车道。
最常用的例子是:必须增加车道,沿道路不应减少车道,这样来表示这个应用:
... previous definitions ...
<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="3" speed="13.89">
<split pos="0" lanes="0 1"/>
<split pos="30" lanes="0 1 2"/>
<edge>
... further definitions ...
需记住两点:
1) 道路定义中,我们使用最大车道数是3(在目前版本好像没有限制)
2) 在位置0处添加一个split,该例子中并不创建节点,但是车道号直接用来标识边。
分裂的定义使用如下属性:
属性名 是否必需 值类型 描述
Pos 是 Float 在边的这个位置上开始分裂(m),如果给的
是负数,则从边的末尾开始算起。
lanes 是 车道id列表 在分裂点后哪些车道会存在

5.5.4.边类型描述

如上所述, “边类型”用来简化边的定义。每条边的描述应该包含车道数、允许的最大
车速、边的优先权(可选)。为避免每条边都定义详细的参数,可以使用边类型(它把这些参数
封装成一个名字)。这个定义的格式是:
<type id="<STRING>" nolanes="<INT>" speed="<FLOAT>" priority="<UINT>"/>.
边类型的属性和边自身的参数是相同的:
属性名 是否必需 值类型 描述
Id 是 Id(string) 类型名字
Nolanes Int 边的车道数,必须是整型值
speed Float 该边允许的最大车速(m/s),必须是浮点数
Priority Int 边的优先权
discard boolean 该类型的边是否不应被导入
没有在类型描述里给出边的起始点和终止点的信息,它们仅能在边的属性里设置。下面
是一个参考边类型的边的定义:
<edges>
<edge id="1fi" fromnode="1" tonode="m1" type="b"/>
<edge id="1si" fromnode="m1" tonode="0" type="a"/>
<edge id="1o" fromnode="0" tonode="1" type="c"/>
<edge id="2fi" fromnode="2" tonode="m2" type="b"/>
<edge id="2si" fromnode="m2" tonode="0" type="a"/>
<edge id="2o" fromnode="0" tonode="2" type="c"/>
<edge id="3fi" fromnode="3" tonode="m3" type="b"/>
<edge id="3si" fromnode="m3" tonode="0" type="a"/>
<edge id="3o" fromnode="0" tonode="3" type="c"/>
<edge id="4fi" fromnode="4" tonode="m4" type="b"/>
<edge id="4si" fromnode="m4" tonode="0" type="a"/>
<edge id="4o" fromnode="0" tonode="4" type="c"/>
</edges>
相关的类型文件是这样的:
<types>
<type id="a" priority="3" nolanes="3" speed="13.889"/>
<type id="b" priority="2" nolanes="2" speed="11.111"/>
<type id="c" priority="1" nolanes="1" speed="11.111"/>
</types>
如上所示,我们把边分为"a", "b", and "c"三个类别,并为每个类定义一个描述。这样
做的结果和以上cross_notypes文件的结果相同。

5.6.连接描述(Connection)

"Connections"描述一个节点的驶入边和驶出边怎么联系,确切地讲,哪些边接近驶
入边,哪些车道用来接近这些边。尽管有可能,但还是应该避免为“特定驶入边”到“特
定驶出车道”设置多于一个的“连接”。SUMO中的车辆并不知道这条路上设置的冲突。
显式设置一条边(或车道)与哪些边(或车道)相关联
如果没有给出,边或车道间的连接定义可以手工设置,并使用连接文件传给
NETCONVERT。连接文件指定通过哪条输入边可以到达驶出边,并规定应该使用哪些
车道(双向,可选)。
如果仅想描述从指定边都能到达哪些边,则定义是这样的:
<connection from="<FROM_EDGE_ID>" to="<T0_EDGE_ID>"/>.
这告诉NETCONVERT,车辆不仅被允许从<FROM_EDGE_ID>驶向<TO_EDGE_ID>,
而且禁止从<FROM_EDGE_ID>的所有其他移动。详细参数如下表:
属性名 是否必需 值类型 描述
from 是 参考edge id 车辆离开的边
to 否 参考edge id 车辆可以从输出边进
入的边
使用这种输入类型时,如果连接边多于一条,NETCONVERT会计算该使用哪条车
道。如果想用手动设置覆盖这个计算,可以这样:<connection
from="<FROM_EDGE_ID>" to="<T0_EDGE_ID>" lane="<INT_1>:<INT_2>"/>.这里,建
立了一个连接,这个连接从<FROM_EDGE_ID>的<INT_1>车道指向<TO_EDGE_ID>
的<INT_2>车道。车道号从右侧向左侧从0算起。更新后的参数如下:
属性名 是否必需 值类型 描述
from 是 参考edge id 车辆离开的边
to 否 参考edge id 车辆可以从驶出边进
入的边
lane 否 参考edge id 连接车道的号码,用
冒号分隔,车道号从
右侧向左侧从0算起
pass 否 参考edge id 如果为真(出现即为
真),通过这个连接(车
道至车道的连接)的
车辆不用等待

下面有两个分配的例子,都使用了以上例子(cross_notypes)中的节点和边的描述。该例
子中的中心路口如下图所示。现在我们可以称之为“无约束网络” ,因为所有的连接和转弯
都使用默认值计算。

无约束网络
这个例子 <SUMO>/data/examples/netbuild/connections/cross3l_edge2edge_conns/",
表明当使用连接限制可以到达的边时发生了什么。我们建立了连接文件以说明水平方向
的边("1si" and "2si")仅有到其右侧垂直边的连接。文件如下所示:
<connections>
<connection from="1si" to="3o"/>
<connection from="1si" to="2o"/>
<connection from="2si" to="4o"/>
<connection from="2si" to="1o"/>
</connections>

你在下图中会发现,结果网络的水平边没有左转连接(设置禁止左转)。
边-边连接的网络
在第二个例子中(位于
<SUMO>/data/examples/netbuild/connections/cross3l_laneslane_conns/),我们额外描述应连
接哪条车道。相关的连接文件表明执行连接应该从驶入边的第二车道开始(从0开始计算)。
<connections>
<connection from="1si" to="3o" lane="0:0"/>
<connection from="1si" to="2o" lane="2:0"/>
<connection from="2si" to="4o" lane="0:0"/>
<connection from="2si" to="1o" lane="2:0"/>
</connections>
由此构建的网络如下图所示:

车道-车道连接的网络
警告:请不要对相同的驶出边同时使用连接类型声明(即一些有车道属性,而另一些没
有)。这个行为未经验证和测试。(英文35页)

设置连接优先级
从0.9.6版本开始,可以让车辆等待另一个车流进行完再通过“边-边连接”。回顾以下上
面的“边-边连接”的网络,在这里所有右转车辆是被允许的。以下连接文件中的定义让垂
直边上的车辆等到水平边上的直行车辆走完,才可以右转。
<connections>
<!-- The next four connection definitions are same as in
"Network with explicit edge-2-edge connections" -->
<connection from="1si" to="3o"/>
<connection from="1si" to="2o"/>
<connection from="2si" to="4o"/>
<connection from="2si" to="1o"/>
<!-- now, let's prohibit the vertical connections by the horizontal -->
<!-- prohibit moving right from top to left by straight from right to left -->
<prohibition prohibitor="2si->1o" prohibited="4si->1o"/>
<!-- prohibit moving straight from top to bottom by straight from right to left
-->
<prohibition prohibitor="2si->1o" prohibited="4si->3o"/>
<!-- prohibit moving left from top to right by straight from right to left -->
<prohibition prohibitor="2si->1o" prohibited="4si->2o"/>
<!-- prohibit moving right from bottom to right by straight from left to right
-->
<prohibition prohibitor="1si->2o" prohibited="3si->2o"/>
<!-- prohibit moving straight from bottom to top by straight from left to right
-->
<prohibition prohibitor="1si->2o" prohibited="3si->4o"/>
<!-- prohibit moving left from bottom to right by straight from left to right
-->
<prohibition prohibitor="1si->2o" prohibited="3si->1o"/>
</connections>
你可能会认为,有必要逆时针禁止所有垂直边驶出的连接,否则水平边上的车辆会因为
“右转优先规则”而陷入等待。该网络如下所示:
带有禁行方向的网络
禁行标签的语法是这样的:
<prohibition
prohibitor="<PROHIBITING_FROM_EDGE_ID>-><PROHIBITING_TO_EDGE_ID>"
prohibited="<PROHIBITED_FROM_EDGE_ID>-><PROHIBITED_TO_EDGE_ID>"/>.
这意味着需定义两个边到边的连接,禁行者和被禁行者。用起始边和终止边来定义每个
连接,用"->"分隔。

5.7.手工构建路网案例

(1)编辑节点文件input_nodes.nod.xml,内容如下:
<nodes>
<node id="0" x="0.0" y="0.0" type="traffic_light"/>
<node id="1" x="-500.0" y="0.0" type="priority"/>
<node id="2" x="+500.0" y="0.0" type="priority"/>
<node id="3" x="0.0" y="-500.0" type="priority"/>
<node id="4" x="0.0" y="+500.0" type="priority"/>

<node id="m1" x="-250.0" y="0.0" type="priority"/>


<node id="m2" x="+250.0" y="0.0" type="priority"/>
<node id="m3" x="0.0" y="-250.0" type="priority"/>
<node id="m4" x="0.0" y="+250.0" type="priority"/>
</nodes>
(2)编辑边文件input_edges.edg.xml,内容如下:
<edges>
<edge id="1fi" fromnode="1" tonode="m1" priority="2" nolanes="4" speed="40" />
<edge id="1si" fromnode="m1" tonode="0" priority="3" nolanes="5" speed="50" />
<edge id="1o" fromnode="0" tonode="1" priority="1" nolanes="5" speed="50" />

<edge id="2fi" fromnode="2" tonode="m2" priority="2" nolanes="4" speed="40" />


<edge id="2si" fromnode="m2" tonode="0" priority="3" nolanes="5" speed="50" />
<edge id="2o" fromnode="0" tonode="2" priority="1" nolanes="5" speed="50" />

<edge id="3fi" fromnode="3" tonode="m3" priority="2" nolanes="4" speed="40" />


<edge id="3si" fromnode="m3" tonode="0" priority="3" nolanes="5" speed="50" />
<edge id="3o" fromnode="0" tonode="3" priority="1" nolanes="5" speed="50" />

<edge id="4fi" fromnode="4" tonode="m4" priority="2" nolanes="4" speed="40" />


<edge id="4si" fromnode="m4" tonode="0" priority="3" nolanes="5" speed="50" />
<edge id="4o" fromnode="0" tonode="4" priority="1" nolanes="5" speed="50" />
</edges>
(3)编辑连接文件input_connections.con.xml,内容如下:
<connections>
<connection from="1si" to="3o" lane="0:0" pass="true" />
<connection from="1si" to="3o" lane="0:1" />
<connection from="1si" to="2o" lane="1:1" /><!--控制车道的直行或转弯-->
<connection from="1si" to="2o" lane="2:2" />
<connection from="1si" to="2o" lane="3:3" />
<connection from="1si" to="4o" lane="4:3" />
<connection from="1si" to="4o" lane="4:4" />

<connection from="2si" to="4o" lane="0:0" pass="true"/>


<connection from="2si" to="4o" lane="0:1" />
<connection from="2si" to="1o" lane="1:1"/>
<connection from="2si" to="1o" lane="2:2"/>
<connection from="2si" to="1o" lane="3:3"/>
<connection from="2si" to="3o" lane="4:3"/>
<connection from="2si" to="3o" lane="4:4"/>
</connections>
(4)编辑配置文件test.netc.cfg,内容如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://sumo.sf.net/xsd/netconvertConfiguration.xsd">

<input>
<xml-node-files value="input_nodes.nod.xml"/>
<xml-edge-files value="input_edges.edg.xml"/>
<xml-connection-files value="input_connections.con.xml"/>
</input>

<output>
<output-file value="net.net.xml"/>
</output>

<processing>
<speed-in-kmh value="true"/>
</processing>
</configuration>
(5)运行命令行命令:netconvert –c test.netc.cfg,会生成路网文件net.net.xml

6.网络导入
NETCONVERT可以导入不同格式的路网,到现在为止,已经支持导入的路网格式
有:
PTV VISUM:一个微观交通仿真软件包使用的格式
PTV VISSIM:同上
ArcView-data base files:shapefiles
Elmar Brockfelds unsplitted and splitted NavTeq-data
TIGER database:老虎地图
OpenStreetMap databases:开放的街道地图数据库
RoboCup Rescue League folders:

一般情况下,NETCONVERT仅需要两个参数:一个参数用来标识要转换的相应格
式的文件名,另一个是输出文件。例如,若要导入VISUM网络,并转换为SUMO格式的
路网文件,方法如下:
netconvert --visum=MyVisumNet.inp --output-file=MySUMONet.net.xml
下面仅介绍OpenStreetMap格式的路网的导入,其他的暂不翻译(TIGER网络现在也
支持OSM格式了):

6.1.OpenStreetMap 格式的路网导入

从OpenStreetMap的官方网站:http://www.openstreetmap.org/可以知道,
OpenStreetMap是一个可自由编辑的世界地图,它由来自全世界的人士共同编辑维护。
OpenStreetMap工程的地图数据文件是一个或多个XML文件。
注意:OSM数据可以有多种不同的方式下载获得。

6.1.1.导入路网

NETCONVERT可以导入本地的OSM数据文件,这需要使用选项—osm-files <file>
下面的命令导入OSM格式路网文件berlin.osm.xml,并把产生的SUMO路网文件保存为
berlin.net.xml:
netconvert --osm-files berlin.osm.xml -o berlin.net.xml
OSM数据使用WGS84地理坐标系,netconvert会自动转换为UTM(从sumo 0.11.1版本后)。
所以仅当你需要不同的映射时才需提供映射参数。
注意:导入OSM路网后,一个路口节点可能被分为很多歌节点,这样既不美观,也影响
仿真效果,我们可以合并距离较近的节点,或者指定合并哪些节点,具体如下:

转换OSM地图时合并较近的节点:
合并50米内的节点
netconvert --osm-files map.osm --junctions.join-dist 50 -o guiyang.net.xml

默认合并15米内的节点
NETCONVERT --junctions.join

转换后单独执行一次合并:
netconvert --sumo-net-file guiyang.net.xml --output-file guiyang-joined-junctions.net.xml -n
input_nodes.nod.xml
注:input_nodes.nod.xml文件中的内容如下(指定要合并哪些节点):
<nodes>
<join nodes="id0 id23 id24"/>
<joinExclude nodes="id13 id17"/>
</nodes>

重新修正连接的方法:
netconvert --sumo-net-file berlin-joined-junctions.net.xml --output-file
berlin-with-fixed-connections.net.xml --connection-files berlin-new-connections.con.xml

6.1.2.导入额外的多边形(如建筑物,河流等)

OSM数据不仅包含有路网,还包含很多其他多边形数据,如建筑物、河流等。这些多边
形需要使用应用程序POLYCONVERT导入,而后添加进sumo-gui-configuration里面。
为解析转换OSM数据,需要使用另外的typemap文件,如下所示(把以下内容保存为
typemap.xml文件):
<polytypes>
<polytype id="waterway" name="water" color=".71,.82,.82" layer="-10"/>
<polytype id="natural.water" name="water" color=".71,.82,.82"
layer="-10"/>
<polytype id="natural.wetland" name="water" color=".71,.82,.82"
layer="-10"/>
<polytype id="sport" name="sport" color=".31,.90,.49" layer="2"/>
<polytype id="landuse.forest" name="forest" color="0.55,.77,.42"
layer="-11"/>
<polytype id="natural.wood" name="forest" color="0.55,.77,.42"
layer="-11"/>
<polytype id="natural" name="natural" color="0.55,.77,.42" layer="2"/>
<polytype id="landuse.park" name="park" color=".81,.96,.79" layer="-11"/>
<polytype id="leisure" name="leisure" color=".81,.96,.79" layer="0"/>
<polytype id="leisure.park" name="tourism" color=".81,.96,.79"
layer="-10"/>
<polytype id="tourism" name="tourism" color=".81,.96,.79" layer="2"/>
<polytype id="landuse" name="landuse" color=".76,.76,.51" layer="-4"/>
<polytype id="landuse.residential" name="residential" color=".92,.92,.89"
layer="-11"/>
<polytype id="landuse.commercial" name="commercial" color=".82,.82,.80"
layer="-11"/>
<polytype id="shop" name="shop" color=".93,.78,1.0" layer="2"/>
<polytype id="landuse.industrial" name="industrial" color=".82,.82,.80"
layer="-11"/>
<polytype id="man_made" name="building" color="1.0,.90,.90" layer="2"/>
<polytype id="building" name="building" color="1.0,.90,.90" layer="2"/>
<polytype id="amenity" name="amenity" color=".93,.78,.78" layer="2"/>
<polytype id="amenity.parking" name="parking" color=".72,.72,.70"
layer="-2"/>
<polytype id="military" name="military" color=".60,.60,.36" layer="-10"/>
<polytype id="landuse.military" name="military" color=".60,.60,.36"
layer="-10"/>
<polytype id="landuse.farm" name="farm" color=".95,.95,.8" layer="-11"/>
<polytype id="landuse.greenfield" name="farm" color=".95,.95,.8"
layer="-11"/>
<polytype id="landuse.village_green" name="farm" color=".95,.95,.8"
layer="-11"/>
<polytype id="power" name="power" color=".1,.1,.3" layer="5"/>
<polytype id="natural.land" name="land" color=".98,.87,.46" layer="-9"/>
<polytype id="boundary.administrative" name="boundary.administrative"
color=".5,.0,.2" layer="-<polytype id="aeroway" name="aeroway"
color=".5,.5,.5" layer="1"/>
<polytype id="aerialway" name="aerialway" color=".2,.2,.2" layer="1"/>
<polytype id="historic" name="historic" color=".5,1,.5" layer="2"/>
</polytypes>
使用类型文件typemap.xml,POLYCONVERT可以从OSM数据导入多边形,并产生一个
Sumo-polygon文件:
POLYCONVERT --net-file berlin.net.xml --osm-files berlin.osm --typemap
typemap.xml -o berlin.poly.xml
产生的polygon文件berlin.poly.xml需要添加进sumo-gui配置里面:
<configuration>
<input>
<net-file value="berlin.net.xml"/>
<additional-files value="berlin.poly.xml"/>
</input>
</configuration>

6.1.3.导入脚本(Scripts)

OpenStreetMap允许用户下载一个很大的区域的地图(靠分裂请求来实现),结果是得到
多个OSM数据文件。帮助脚本osmget.py和osmBuildPolys.py可以导入这些数据文件,这两个
脚本位于:<SUMO>/tools/import/osm。
调用方法如下所示:
osmGet.py <PREFIX> <BOUNDING_BOX> <TILES_NUMBER>
osmBuild.py <PREFIX> <TILES_NUMBER> <OUTPUT> [(all|road|passenger),ramps,tls]
osmBuildPoly.py <PREFIX> <TILES_NUMBER> <SUMONET> <OUTPUT>
以上的<PREFIX> 和 <TILES_NUMBER>必须与osmGet.py给出的一致。<SUMONET>必须和
osmBuild.py的参数<OUTPUT>一致。
注意:
1:执行该脚本所在的目录必须包含有一个typemap文件,而且文件名字是osm_type_map.xml.
2:如果”road”作为最后一个参数,则仅抽取可用的道路;如果使用的是”passenger”,则仅抽取客
车可使用的道路;如果使用的是”ramps”,则调用NETCONVERT程序时使用—guess-ramps选项;若使
用”tls”,则则调用NETCONVERT程序时使用—guess-tls选项。
3:交通灯:OSM不能给一个交通灯分配几个节点,这意味着路网导入后,一个交通灯系统里的临近节
点一般被两个交通灯控制着。很明显,如果这两个交通灯不同步,那么这个区域的交通将陷入崩溃。一个
好的解决办法是:使用NETCONVERT的—try-join-tls选项,这时NETCONVERT会把临近节点分配给同
一个交通灯。
4:高速公路坡道:OSM网络在高速公路的坡道处经常缺少额外的车道。这可以通过NETCONVERT的
—guess-ramps选项来猜测。(意思不太明白)

6.1.4.编辑 OSM 网络

JOSM工具可被用来编辑OSM数据(例如削减矩形地图,删除不想要的特征)。在你删除不
感兴趣的部分后,你必须使用xmlstarlet改变文件,这才真正的删除节点。Xmlstarlet这样来
使用:
xmlstarlet ed -d "/osm/*[@action='delete']" < input.osm > output.osm
Java工具OSMOSIS(http://wiki.openstreetmap.org/index.php/Osmosis),可以从OSM
文件过滤掉你不想要的特征。下面的命令保留高速公路和高速公路连接,同时过滤掉所有其他特征:
java -jar osmosis.jar --read-xml file="orginal.osm.xml" --way-key-value \
keyValueList="highway.motorway,highway.motorway_link" \
--used-node --write-xml file="filtered.osm.xml"

6.2.NETCONVERT 细节

道路类型
当导入路网时,NETCONVERT查找街道类型,这个街道类型最为键值对编码在OSM文件
中,这里的键是”highway”或者”railway”。仅当边的定义中存在这样的键时,边才被导入。使
用查找到的键值对来组成边的类型名:<KEY>.<value>.使用这个类型名,结合预定义的类型
名到类型定义的映射,边的属性就被决定了。当然,类型名必须和读取的相匹配。
这些值基于以下内容: http://wiki.openstreetmap.org/wiki/Map_Features.
警告:
这些值通过网络设置,而且没有被验证。如果你重新设计并改进它,这将是极大地帮助,这
样做请让我们知道。
显式道路属性
道路包含车道数的定义(key="lanes")或者允许的最高车速(key="maxspeed"),使用这些值就
不必参考类型值。而且,单边信息表示该边是否是单向的(one-way): (key="oneway").如
果边属于环状交叉路(key="junction" and value="roundabout"),也被设置成单向的
(one-way)。
不考虑不想要的交通模型
多数情况下,对于道路交通研究而言,我们对不相交的轨道和道路不感兴趣,但是可以
排除那些被NETCONVERT用选项—remove-deges.by-vclass导入的边。
下面的调用方式实现移除所有的不允许客车通行的边:
--remove-edges.by-vclass hov,taxi,bus,delivery,transport,
lightrail,cityrail,rail_slow,rail_fast,motorcycle,bicycle,pedestrian
下面的调用方式实现移除所有道路车辆禁止通行的边(是不是步行街?):
--remove-edges.by-vclass rail_slow,rail_fast,bicycle,pedestrian
缺失的描述:
TLS计算
车道到车道连接的计算
真正导入了什么(边的属性怎样被确定)
其他交通模型
路网质量

其它的Netconvert参数选项
Netconvert工具提供了很多参数选项以描述网络应怎样被导入,一些参数选项的范围并
未覆盖所有的导入类型。
设置默认值:上面提到过,如果边的参数被遗漏,则会使用默认值。我们可以设置导入
边的类型的默认值,车道数,允许的最大速度,优先级等,这需要依次使用参数选项:--type
<ID> (or -T <ID> for short), --lanenumber <INT> (or -L <INT> for short), --speed
<FLOAT> (or -S<FLOAT> for short), --priority <INT> (or -P <INT> for short), respectively
添加转弯处(Turnarounds):通常转弯处被添加为一个可能的边延续,这在网络构建
中扮演重要角色。有时,你可能不想添加它们,这时可以用选项--no-turnarounds禁止它们
的出现。
删除几何节点:在多数的导入网络中,你会发现在一些节点处,拥有相同属性的街道进
来又出去,或者两条平行的边进来并且具有相同属性的两条平行边又从这出去,这时这些节
点没有任何意义(除了可能会是一个U型转弯处),可以被删除。删除这些节点,将会加快仿
真速度,因为每次处理的边数减少了。可以使用--remove-geometry来删除这些节点,并使
进出的边结合。删除这些节点后仍保持了边的几何形状,这靠在删除的节点处添加另外
的几何点来实现。
使用Km/h作为边的最大速度:一些人不喜欢使用m/s最为速度单位,如果你想使用
Km/h来定义边的最大速度,可以通过NETCONVERT工具的选项--speed-in-kmh来实现。
导入没有交通灯逻辑的网络:。。。
猜测出入口匝道: 。 。。
交叉口内的交通:如果你已经了解SUMO或者你看过一些例子,你可能发现车辆习惯于
跳过交叉口而不是驶过交叉口。这种行为十分合适在仿真大型方案时,因为仿真错误可以被
忽略(至少我们已经忽略了).从版本0.10.0开始,SUMO开始默认以驶过现实中你知道的道路交
叉口的方式仿真交通,因为动态给网络插入内部车道增加了网络规模,你可能希望使用老式
的仿真行为(跳过交叉口),你可以使用选项--no-internal-links来实现。
修剪导入的网络:NETCONVERT可以让你限制读入的边,如果你有一个大型街道网络但
只想仿真一部分或主要道路,这时这个限制功能非常有用。首先可以通过命名(指出)所有你
想保留的边来实现限制,你可以在命令行或使用配置文件直接使用--keep-edges
<ID>[,<ID>]*,这里的ID表示你想保留的边的ID值,你也可以把这些值存入一个文件
(每个ID占用一行),然后NETCONVERT使用选项--keep-edges.input-file <FILE>.读取该
文件。这种情况下使用--remove-geometry参数来结合各边,你也可能对选项
--keep-edges.postload感兴趣,该选项强制NETCONVERT首先结合各边,然后删除不想
要的边。
也可以这样限制导入的边:给出边上允许的最小速度以在生成的网络中包含这些
边。这需要使用参数选项--edges-min-speed <FLOAT>来实现,FLOAT是边要想被包含
进输出网络中,必须满足的最小速度,单位m/s。

6.3.NETCONVERT 的输出

NETCONVERT的额外输出
NETCONVERT和NETGEN允许产生除网络文件外的其他输出文件,下面我们将介绍这些:
普通网络输出:解析出来的节点和边定义可以保存到XML文件中,这些文件和被用来导入
XML格式网络的文件具有相同的格式(参考节点描述和边描述)。这使得从其他格式读入的网
络的处理变得容易。选项--plain-output <FILE>强制NETCONVERT 和 NETGEN 生成名
为<FILE>.nod.xml的节点文件(包含先前导入的节点),和名为<FILE>.edg.xml 的边文件
(包含先前导入的边),和名为<FILE>.con.xml的连接文件(包含先前导入的连接)。边文件包
含先前读入的边的列表,每条边包含如下信息:edge's id, the allowed velocity,the number of
lanes, and the from/to - nodes stored。当导入的边拥有形状时将存储几何信息,这是说边
不是起止点间的直线。车道延展类型和基本边类型不是默认值时(默认值依次为
right,normal),信息被保存。另外,如果车道有允许/禁止的车辆类别,这些信息也被保
存。
几何移除的信息:选型--map-output <FILE> (or -M <FILE> for short)生成包含哪些
边已被结合的信息。它的格式有点怪,以后应该被改进。这个文件每行的开始是所生成
网络中的边的ID,后面使用tabs分隔,跟着边ID的和边的长度的列表,id和长度间由“:”
隔开。例如,一条边由'edge1', 'edge2', 'edge3’结合而成,三条边长度分别是10,20,30米,
这在文件中表现为:
edge1<TAB>edge1:10<TAB>edge2:20<TAB>edge3:30
如果边不是由其他边结合而成,那么边的ids/length列表仅有一个值,例如:
edge<TAB>edge:100
节点结合转储:
当测试几何计算时使用选项--node-geometry-dump <FILE>,它在被用来计算导入点的
几何信息的位置,生成感兴趣的点的列表,而且可以被guisim读取。
6.4.网络生成

P55
可以自动生成网格网、裂变网、随机网三种类型的路网。
生成网格网:
netgen --grid --grid.x-number=3 --grid.y-number=3 --grid.y-length=500 --grid.x-length=500 -L
5 -j traffic_light --output-file=zilinan.net.xml
注意:-L选项设置道路默认车道数目为5;-j 选项指定交叉口类型

7.需求建模

7.1.SUMO 的需求简介

在产生路网之后,我们通过GUISIM可以发现,并没有车辆运行。我们还需要对车辆进行
一些描述。从现在开始我们使用以下术语:
旅程(trip):旅程是车辆从一地到另一地的移动,由起始边,目的边和所用时间的定义。
路径(route):路径是扩展的旅程,这就是说路径的定义不仅包含起止边,还包括车俩将
通过的所有的边。SUMO和GUISIM需要路径作为车辆移动的输入数据。有多种方法可以为
SUMO生产路径信息。
使用旅程定义:如上所述,每个旅程至少包括起始边,终止边和所需旅行时间。
使用(交通)流定义:这和旅程定义差不多,但是需要把具有相同旅行时间和边的车辆结
合起来。
使用流定义和转弯率:可以不使用流的目的边,而使用交叉口处的转弯比率来代替。
使用OD矩阵:OD矩阵必须被转换成旅程,然后再转换成路径信息。
手工处理:我们可以手工生产路径
使用随机路径:这是快速填充仿真所需文件的方法,但是没有实际的意义。
描述网络中的人口信息:动态的需求模型
导入可用路径

目前,SUMO包含四个用来处理路径信息的应用程序:
DUAROUTER程序负责从其他仿真软件包导入路径或定义,并使用Dijkstra的最短路径算
法计算路径。另外与仿真相结合,DUAROUTER程序可以计算动态用户分配(C. Gawron的模
型)。
JTRROUTER程序使用交叉口的转弯率来静态的建模交通。
OD2TRIPS程序帮助我们转换OD矩阵到旅程信息。
DFROUTER程序从所给的观察点的度量计算路径。
7.2.车辆、车辆类型、路径的定义

最简单的获得自己的路径的方法就是手工编辑路径文件,但这仅适用于路径数不多的时
候。开始之前,知道以下信息很重要,SUMO中的车辆包含三部分信息:描述车辆物理属性的
车俩类型,车辆将要使用的路径,车辆本身。路径和车辆类型可以被其他车辆共享使用。
下面将给出包含所有这些信息的路径文件的例子,文件命名为routes.rou.xml。

7.2.1.车辆类型

原始的车辆类型被定义为:
<routes>
<vtype id="type1" accel="0.8" decel="4.5" sigma="0.5" length="7.5"
maxspeed="70"/>
</routes>
使用这个定义,可以创建一个type1类型的车辆,上面的数值在很多例子中会使用到。
他们是Stefan KrauÃ.的理论使用的标准车辆类型。
这是个原始的定义,包括了车辆的纯物理参数,例如车辆长度,颜色,最大速度等,还
包括使用的车辆跟驰模型的参数。请注意,即使跟驰模型参数是象最大加速度或最大减速度
一样的描述值,但这不表示司机会采取这一值。例如最大加速度不是车辆可以达到的最大加
速度,而是司机采取的最大加速度(即使你有一辆捷豹汽车,你也不想通过城市时在5秒内加
速到100Km/h)。
为了允许使用不同的车辆跟驰模型(KrauÃ的模型之外的),我们扩展了车辆类型定义。
原始的那个定义还可以使用,但是扩展车辆类型可以让用户额外选择其他模型并给出所需参
数。下面是新车辆类型的描述(对应于上面的原始类型):
<routes>
<vtype id="type1" length="7.5" maxspeed="70">
<carFollowing-Krauss accel="0.8" decel="4.5" sigma="0.5"/>
</vtype>
</routes>
可用跟驰类型:
carFollowing-IDM
carFollowing-Krauss
carFollowing-KraussOrig1
carFollowing-PWagner2009
carFollowing-BKerner
carFollowing-MSDU
我们发现车辆跟驰模型参数被列在了车辆类型定义的子元素位置,要注意车辆跟驰元素
的值是vtype元素中给出的重写值。
各个值的意义如下:
属性名字 是否必需 值类型 描述
除了描述车辆的跟驰属性的值外,还可以定义指定车辆的形状,排放量,分配的抽象车
辆类别等信息。这些概念将在以下描述,在车辆跟驰模型一节可以看到实现车辆跟驰模型的
进一步的描述。

7.2.2.抽象车辆类别

SUMO中的车辆会被指定一个抽象车辆类别(使用vclass属性来定义)。在车道定义,车道
允许/禁止行驶的特定车辆类型时使用这些类别。想象有一个三车道街道,最右边的仅可以
行驶出租车和公共汽车。存在以下的车辆类别:
• "private"
• "public_transport" 公共运输车辆
• "public_emergency" 紧急任务车辆
• "public_authority" 行政车辆
• "public_army" 军事车辆
• "vip" 非常重要的乘客车辆(个人理解:比如国家元首的车辆等)
• "ignoring"
• "passenger" 旅客车辆(相当于国内的旅行车)
• "hov" 高载客量汽车(多座客车)
• "taxi" 出租车
• "bus" 公共汽车
• "delivery" 配送(投递)车辆
• "transport" 运输车辆
• "lightrail" 轻轨
• "cityrail" 城市轨道交通
• "rail_slow" 慢速铁路
• "rail_fast" 快速铁路
• "motorcycle" 摩托车
• "bicycle" 自行车
• "pedestrian" 行人
这些值尽可能的做到见文知意,但仍需讨论。尽管在导入格式里面会发现这些类别,但
它们仍是抽象的,这意味着它们仅是一个名字而已,我们可以建一个5米长的公共汽车。它
们仅被用来确定车道的可用性。

7.2.3.车辆排量类别

排量类别表示一个特定的基于道路交通排放系数手册(HBEFA)的排量类别,使用排放类
别属性定义。(原文缺失)

7.2.4.可视化

为了更美观的可视化效果,我们应在各类型车辆的guiShape属性里指定一个特定形状,
以使不同车辆呈现出不同外观。目前有如下的形状可用:
• "pedestrian" 行人
• "bicycle" 自行车
• "motorcycle" 摩托车
• "passenger" 客车
• "passenger/sedan" 小轿车
• "passenger/hatchback" 装有向上开的后车门的小轿车
• "passenger/wagon" 货车
• "passenger/van"
• "delivery"
• "transport"
• "transport/semitrailer"
• "transport/trailer"
• "bus"
• "bus/city"
• "bus/flexible"
• "bus/overland"
• "rail"
• "rail/light"
• "rail/city"
• "rail/slow"
• "rail/fast"
• "rail/cargo"
• "evehicle"
警告:不是所有命名的形状都已实现。
另外,可以用guiWidth属性指定车辆宽度,用guiOffset属性指定到前导车的偏移。当在
屏幕上画出车辆时,会留出长度为guiOffset的自由空间,然后剩余大小(length-guiOffset)被用
来显示车辆。
使用形状时应该考虑不同的车辆类别用不同的长度。客运车辆应在10米以上,小公共汽
车大概2米(估计是笔误)。

7.2.5.车辆跟驰模型

SUMO目前实现的车辆跟驰模型如下表所示:
项目 简称 描述
carFollowing-Krauss SUMOKrauss 这是SUMO默认使用的模型,对Krauss模型
做了修改
carFollowing-KraussOrig1 SKOrig 原始的Krauss模型
carFollowing-PWagner2009 PW2009 Peter Wagner提出的模型,使用Todosiev's
action points
carFollowing-BKerner Kerner Boris Kerner提出的模型
警告:经常工作忙不过来
carFollowing-IDM IDM Martin Treiber开发的智能驱动模型
警告:车道变换会有问题
IDM(Intelligent Driver Model)模型是Martin Treiber开发的智能驱动模型,但目前SUMO平
台对该模型的实现在车道变换方面尚存在问题。
一般,各个模型使用自己的参数集。下表列出了哪些模型使用哪些参数。请注意这里未
讨论车辆跟驰自身和车辆跟驰模型。这些模型的开发和评估是我们的工作主题之一,因此它
们应在其他章节描述。

属性 描述 模型
Accel 该类型车辆的加速能力 SUMOKrauÃ.,
单位m/s2 SKOrig, PW2009,
Kerner, IDM
Decal 该类型车辆的减速能力 SUMOKrauÃ.,
单位m/s2 SKOrig, PW2009,
Kerner, IDM
Sigma 司机的缺点(个人理解是驾驶熟练程度) SUMOKrauÃ.,
SKOrig
Tau 司机的反映时间(单位s) SUMOKrauÃ.,
SKOrig, PW2009,
Kerner
timeHeadWay 车头时距(单位s) IDM
minGap 最小车距 IDM
K Kerner
phi Kerner
7.2.6.车辆和路径

下面,我们定义一个带有路径的车辆(路径仅属它一个):
<routes>
<vtype id="type1" accel="0.8" decel="4.5" sigma="0.5" length="5"
maxspeed="70"/>
<vehicle id="0" type="type1" depart="0" color="1,0,0">
<route edges="beg middle end rend"/>
</vehicle>
</routes>
给SUMO(或GUISIM)一个这样的路径定义,sumo可以构建一个名为“0”的type1类型的
红色(color=1,0,0)的汽车,该汽车在0时刻启动,路径为沿街道"beg", "middle", "end"最终到
达街道”rend”,然后将从仿真中移除。
该车辆有一个不被其他车辆共享的,自己的内部路径。也可以定义两个车辆使用相同的
路径,这时路径必须被外部化---即在被车辆引用前就已定义,而且指定一个id作为该路径的
名字。车辆使用路径是指它使用route属性。完整的用法如下:
<routes>
<vtype id="type1" accel="0.8" decel="4.5" sigma="0.5" length="5"
maxspeed="70"/>
<route id="route0" color="1,1,0" edges="beg middle end rend"/>
<vehicle id="0" type="type1" route="route0" depart="0" color="1,0,0"/>
<vehicle id="1" type="type1" route="route0" depart="0" color="0,1,0"/>
</routes>
定义车辆所使用的属性如下:
属性名字 是否必需 值类型 描述
Id 是 Id(string) 车辆名字
Type 是 Float 该车辆使用的车辆类型名字
Route 否 Id 车辆要使用的路径名字
Color 否 Color 该车的颜色
Depart(出发) 否 Float 车辆进入网络的时间步
Departlane 否 Int/string 车辆被插入的车道。出发车道使用其路
(0,"random", 径上首个街道的出发车道值
"free","departlane")
Departpos 否 Float(m)/string 车道进入网络的位置;free是说接近于
("random","free", 出发车道开始处可能插入车辆的位置。
"random_free","base") “Random_free”方式试图强制找到一
个自由的随机的位置,如果失败则把车
辆放到接近“free”方式的位置。 “base”
方式把车辆长度加1的值设置为车辆出
发位置,这意味着完全从出发车道的起
始处开始。
Departspeed 否 Float(m/s)/string 车辆进入网络时的速度
(0,"random","max")
Arrivallane 否 Int/string (0,"current") 车辆离开网络时的车道(即运行到终点
时的车道)。
注意:该选项目前未评估
Arrivalpos 否 float(m)/string 车辆离开路网时的位置
(0(1),"random","max") 注意:该选项目前未评估
arrivalspeed 否 float(m/s)/string 车辆离开路网时的速度
(0,"current") 注意:该选项目前未评估
警告:请注意车辆出发位置“base”目前仅在SVN版本可用。在0.12版以前,默认出发位
置是0。
下一版本会重新恢复
你可能注意到,路径本身也有个颜色定义,所以路径的属性是(可能使用下面的属性来定
义车辆):
属性名字 是否必需 值类型 描述
Id 是 Id(string) 路径名字
Edges 是 Id list 车辆将使用的边,使用空格分隔的边IDs
Color 否 Color 路径颜色
建立自己路径时需考虑以下重要的事情:
·路径必须被连接。如果当前路径的下条边不是当前边的后继,则仿真不会引起(给出)
错误。这时车辆在当前边的终点停止,而且在等待一段时间后会被瞬间移动到下一条边。在
未来版本可能会改变这种状况。
·路径至少要包含两条边。在最后一条边的开始处仿真结束,所以只有一条边的路径是
空的。这在未来版本中会有所改变。
·起始边的长度至少和在它上面启动车辆一样长。车辆仅可以在使它与道路完全适合的
位置启动。
·路径文件必须在车辆出发时间之前存储。事实上这仅当你在出发时间定义大量路径或
通道时是有意义的。仿真参数--route-steps的默认值是200,它定义仿真载入路径的时间间
隔的长短。就是说默认启动时仅载入出发时间小于200的路径,如果所有车辆都已出发,
出发时间达到400的路径也被载入。这仅在路径文件被存储时有效,可以使用选项
--route-steps 0.禁用该行为。
前三个条件可以用<SUMO_DIST>/tools/routecheck.py.来检验。

7.2.7.车辆的出发和到达参数

使用depart和arrival属性,可以控制车辆如何插入路网及如何离开路网。

7.2.8.路径和车辆类型分布

除了为单个车辆依次定义路径和车辆类型,SUMO还可以根据给定的分布在运行时选择这
些信息。为使用该特性,需象下面这样定义分布信息:
<routes>
<vtypeDistribution id="typedist1">
<vtype id="type1" accel="0.8" length="5" maxspeed="70" probability="0.9"/>
<vtype id="type2" accel="1.8" length="15" maxspeed="50" probability="0.1"/>
</vtypeDistribution>
</routes>
<routes>
<routeDistribution id="routedist1">
<route id="route0" color="1,1,0" edges="beg middle end rend"
probability="0.9"/>
<route id="route1" color="1,2,0" edges="beg middle end" probability="0.1"/>
</routeDistribution>
</routes>
分布有且仅有一个id属性,并且它的每个子元素需要一个概率属性(所有概率属性和为
1),应相应的确定它们的比例。目前子元素的id属性是必需的,这在后续版本会改变。
分布可以使用到单个类型和路径中:
<routes>
<vehicle id="0" type="typedist1" route="routedist1" depart="0" color="1,0,0"/>
</routes>

7.2.9.停车

可以在定义的时间段强制停止车辆,或使用路径或车辆定义中的“停车”元素来等人,
定义如下所示:
<routes>
<route id="route0" edges="beg middle end rend">
<stop lane="middle_0" endPos="50" duration="20"/>
</route>
<vehicle id="v0" route="route0" depart="0">
<stop lane="end_0" endPos="10" until="50"/>
</vehicle>
</routes>
上面的结果是车辆停车两次,第一次因为路径定义里的停车标志而在“middle_0”车道
停车,第二次因为车辆自身定义里的停车标志而停车。第一次停车持续20秒,第二次持续50
秒。请参考SUMO公共交通部分(SUMO_PublicTransport.),以了解如何使用停车属性

7.3.路由器的输入(内容)

7.3.1.旅程定义

可以使用XML文件把道路网络的旅程定义提供给路由器。单个旅程定义的语法是:
<tripdef id="<ID>" depart="<TIME>" from="<ORIGIN_EDGE_ID>"
to="<DESTINATION_EDGE_ID>" [type="<VEHICLE_TYPE>"] [period="<INT>"
repno="<INT>"] [color="<COLOR>"]/>.
属性名字 是否必 值类型 描述

Id 是 Id(String) 使用该旅程定义将产生的
车辆的名字
Depart 是 Int 使用该旅程定义产生的第
一辆车的出发时间
From 否 Edge id 路径开始处的边的名字;
边必需是使用的网络的一
部分
To 否 Edge id 路径结束处的边的名字;
边必需是使用的网络的一
部分
Fromtaz 否 District id 路径开始处的街区名字
Totaz 否 District id 路径结束处的街区名字
Period 否 Int 在该时间后拥有相同路径
的车辆必须被射出
Repno 否 Int 被射出的拥有相同路径的
车辆数目
Color 否 Color 该产生的车辆颜色
Departlane 否 int/string 车辆从该车道插入
(0,"random","free","departlane")
Departpos 否 float(m)/string 车辆进入路网的位置;
("random","free","random_free","base") free是说接近于出发车道
开始处可能插入车辆的位
置。 “Random_free”方式
试图强制找到一个自由的
随机的位置,如果失败则
把车辆放到接近“free”
方式的位置。 “base”方式
把车辆长度加1的值设置
为车辆出发位置,这意味
着完全从出发车道的起始
处开始。
Departspeed 否 Float(m/s)/string (0,"random","max") 车辆进入网络时的速度
Arrivallane 否 Int/string (0,"current") 车辆离开网络时的车道
(即运行到终点时的车
道)。
注意:该选项目前为评估
Arrivalpos 否 float(m)/string (0(1),"random","max") 车辆离开路网时的位置
注意:该选项目前未评估
arrivalspeed 否 float(m/s)/string (0,"current") 车辆离开路网时的速度
注意:该选项目前未评估
可以使用DUAROUTER和选项"--trip-defs" or "-t"把旅程定义转换成路径:
duarouter --trip-defs=<TRIP_DEFS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml -b <UINT> -e <UINT>
旅程可以包含起始和目的街区及街道。如果街区被用在路径中,则必须使用选项
--with-taz表示出街区文件,而且需要提供街区文件(若路网不含街区):
duarouter --trip-defs=<TRIP_DEFS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml --districts=<DISTRICTS> --with-taz

7.3.2.使用流定义

和旅程定义共享大量的参数,它的语法是:
<flow id="<ID>" from="<ORIGIN_EDGE_ID>" to="<DESTINATION_EDGE_ID>"
begin="<INTERVAL_BEGIN>" end="<INTERVAL_END>"
no="<VEHICLES_TO_EMIT>" [type="<VEHICLE_TYPE>"] [color="<COLOR>"]/>.
注意以下不同之处: 当车辆被这个参数描述时并不占用出发时间,而是一个时间集合(由
属性“no”给出) 。出发时间使用步长(由<INTERVAL_BEGIN> and <INTERVAL_END>
描述步长)均匀传播。这三个属性必须是整型值。值"period" 和 "repno"不在这里使用。
流定义也可以被嵌入到“interval”(区间)标签中,这时可以(但不是必须)让这些标签的
“begin”和“end”属性留在外部,所以以下两个脚本意义相同:
<flows>
<flow id="0" from="edge0" to="edge1" begin="0" end="3600" no="100"/>
</flows>
以及
<flows>
<interval begin="0" end="3600">
<flow id="0" from="edge0" to="edge1" no="100"/>
</interval>
</flows>
这些参数重复列出,如下所示:
因为我们必须把整个流定义读入内存----一些事我们不必读入的,参数-f or –flows通知
router知晓这些:
duarouter --flows=<FLOW_DEFS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml -b <UINT> -e <UINT>
谨记不能把流定义插入到旅程定义文件中。但是相反,一些流定义文件中可以有旅程定义。当然可以
同时给出这两个输入文件,例如:
duarouter --flows=<FLOW_DEFS> --trip-defs=<TRIP_DEFS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml -b <UINT> -e <UINT>
7.3.3.导入 OD 矩阵

OD2TRIPS程序从OD矩阵计算旅程表,它把被编码的矩阵当做在特定时段内从一个街区
到另一个街区的车辆总数。因为OD2TRIPS生成的旅程必须有起止街道,故它需要从街区到街
道的映射。当使用NETCONVERT转换VISUM路网时,存储在VISUM输入文件中的街区被解析
并存储进生成的SUMO路网文件中。如果你不使用VISUM作为输入,则必须自己创建街区文
件,格式在街区描述一节给出(Describing_the_Districts)(即下一节).必须使用--net-file
<FILE> (--net <FILE> or -n <FILE> for short)选项把包含街区定义的文件传给
OD2TRIPS。
因为OD2TRIPS仅用来导入VISUM/VISION/VISSIM格式的数据,它假定OD矩阵就存储在这
些应用程序使用的格式文件中。但并不是所有VISUM/VISION/VISSIM格式都被支持,目前仅
支持两个,名为"V"和"O"格式。如果没有存储在这些格式中的矩阵,仍有三个选择:a)
把它们转换为支持的格式。b)为OD2TRIPS编写你自己的读取器。C)把它们转换为流定义,
而后传给DUAROUTER(参考流定义一节)。在“描述矩阵单元”一节
(Describing_the_Matrix_Cells),将描述所有支持的格式。你也可以使用选项--od-files
<FILE>[,<FILE>]* (--od <FILE>[,<FILE>]* or -d <FILE>[,<FILE>]*
for short),后面跟用逗号分隔的文件列表,传给OD2TRIPS一个矩阵文件列表。
OD2TRIPS读取所有矩阵并生成旅程定义,生成的旅程定义从0开始标号。也可以使用选
项--prefix <STRING>给生成的旅程定义名字添加前缀。通常,使用选项--output-file
<FILE> option (--output <FILE> or -o <FILE> for short)把它们写进输出文件。你可以使
用选项—vtype后跟一个类型名来指定添加进旅程定义中的车辆类型。请注意除非在OD
矩阵中未给出或者使用该选项定义,否则车辆将没有类型。如果提供了类型,但你不希
望包含在输出中,需设置--no-vtype选项,这个命令行选项忽略OD矩阵中给出的类型名
字,不会生成类型本身。在--begin <INT> (-b <INT>) 和--end <INT> (-e <INT>)标识的
时段产生车辆,时段默认值是0-86400。通常仿真步长以秒为单位。
因为每个OD矩阵单元描述在特定时段被射出的车辆总数,OD2TRIPS不得不计算车辆
显式的出发时间。通常,这使用OD矩阵单元描述的时间步长内的一个随机时间。也可以在
统一时间射出一个矩阵单元的车辆,这时需使用选项--spread.uniform。
也可以改变存储在OD矩阵中的车辆数目大小,这时需使用--scale <FLOAT>选项。
所有读入的车流会乘以该数值,默认为1。当导入覆盖全天的OD矩阵时,你可能希望使
用曲线,它看起来象现实世界中旅程起点的延伸,请参考子章节“分裂大型矩阵”。

7.3.4.描述街区

包含从街区到街道的映射的文件,看起来是这样的:
<districts>
<district id="<DISTRICT_ID>">
<dsource id="<EDGE_ID>" weight="<PROBABILITY_TO_USE>"/>
... further source edges ...
<dsink id="<EDGE_ID>" weight="<PROBABILITY_TO_USE>"/>
... further destination edges ...
</district>
... further districts ...
</districts>
这意味着街区使用id,起止街道类表来描述。一个街区至少有一个起始和一个目的街道,
每一个都用id和称为权重的使用概率描述。这些街道分别用来把车辆射入网络或者从网络移
除。在载入后每个起止列表的概率和都被规格化。

7.3.5.描述矩阵单元

第75页
为了理解OD矩阵是怎样存储的,我们应弄清楚这里存储的值的意义。每个矩阵描述一
个给定的时段。矩阵中的索引是源/目的街区的名字(正常情况下它们是相等的,所有列表都
一样)。矩阵中的值是在给定时段从源街区驶向目的街区的车辆数目。
VISUM文档详细描述了PTV使用的矩阵格式.

7.3.6.分裂大型矩阵

7.3.7.处理破碎的数据

7.3.8.随机路径

可以使用DUAROUTER和JTRROUTER程序的—random-per-second<FLOAT> (or -R
<FLOAT> for short)为指定的路网生成随机路径信息。因为这一特性有许多bug,并且这
些路径与现实高度脱节,这个功能已经被可生成随机路径的python脚本代替,该脚本也
可以生产一个路径集(被DUAROUTER使用).
已发现的错误:
当使用DUAROUTER创建随机路径时,仅在仿真步1射出车辆。如果我选择:
duarouter --net= -R 10 --output-file=... -b 0 -e 3600
在rou.xml文件中存储了10个随机路径/车辆,所有这些车辆的depart值都为1。但在
文档中出现的信息是:在每个仿真步都会有-R值确定的数目的车辆被射入网络。
可行的生成随机路径的方法:
1) 使用sumo\tools\trip目录下的randomTrips.py脚本生成*.trip.xml随机旅程文件(net
文件作为输入)
randomTrips.py –n beijing.net.xml
2) 使用Duarouter工具(使用net文件和trip文件作为输入)生成路径文件
Duarouter –n test.net.xml –t test.trip.xml –o test.rou.xml
--continue-on-unbuild(忽略错误继续) –w(不显示警告信息)

7.3.9.路径猜测
7.3.10.使用 JtrRouter

使用交叉口转弯概率(Jtr)来路由
JTRROUTER是个路由应用程序,它使用路口的交通流和转弯率作为输入。必须提
供以下参数:路由车辆的路网,交叉口转弯率的描述(默认使用该描述),交通流的描述。
调用格式是这样的:
jtrrouter --flows=<FLOW_DEFS> --turns=<TURN_DEFINITIONS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml -b <UINT> -e <UINT>
为了描述转弯的定义,必须创建额外的文件。该文件里,必须给出每个时间区间和每条
街道的用户使用百分比。例子如下:
<turn-defs>
<interval begin="0" end="3600">
<fromedge id="myEdge0">
<toedge id="myEdge1" probability="0.2"/>
<toedge id="myEdge2" probability="0.7"/>
<toedge id="myEdge3" probability="0.1"/>
</fromedge>
... 其它边的情况 ...
</interval>
... 其它时间间隔(interval ...
</turn-defs>
以上脚本定义:在0秒至3600秒的时间段,从"myEdge0"街道驶入的车辆,选择
"myEdge1"街道的概率是20%,选择"myEdge2"的概率是70%,选择"myEdge3"的概率是
10%。另一个比较省时的准备转弯描述的方法是使用默认值。可使用参数--turn-defaults
(-T) <TURN_DEFAULTS>实现让所有描述交叉口在所有时间步长都使用默认转弯率。
<TURN_DEFAULTS>是用“,”分隔的doubles类型的列表。使用--turn-defaults 20,70,10
可实现与上述脚本相同的功能。这些值将被应用到某条街道的后继街道,从最右边(20%)
到最左边(10%)。当不同的街道可能的后继街道数不同时,将会对与给定默认转弯率数
目不同的街道重新采样(赋值)。给出默认值--turn-defaults 20,70,10时,车辆通过只有两个
后继街道的路口时,使用右边街道的概率是55%,使用左边街道的概率是45%。
交通流定义与DUAROUTER除了一点外基本相同,即它不知道车辆在何处离开路网,因
为路径是被随机计算的,目的地参数对jtr-routing没有意义(可以不使用)。当车辆到达汇点
时会尽快离开路网。不是所有的路网都存在汇点的定义,我们可以使用选项--sinks
<EDGE_ID>[,<EDGE_ID>]*把一个边的列表声明为汇点,也可以把汇点定义添加到转弯
文件中(XML文件):
<turn-defs>
... some further turning definitions as above ...
<sink><EDGE_ID></sink>
... further sink definitions ...
</turn-defs>
理论上,当强制车辆沿同一个方向运行时路径可以是无限长,可以使用
max-edges-factor限制路径长度。该因数乘以使用的路网边数就得到路径的最大边数。使
用默认值2.0,路径可以包含的边数是网络路径数的两倍,任何长于该值的路径被标识为
无效的。我们假定对于每个网络该因数值必须重新选择(设置)。

7.3.11.使用 DfRouter

使用DFROUTER从观测点度量值构建路径(探测器值)
从版本0.9.5之后,SUMO软件包含了名为DFROUTER的路由模块。该路由模块的来由是,
目前多数高速路都装备有感应线圈,测量进入和离开高速路的车流。只要给出这个信息,我
们就可以认为高速路上的车流是完全已知的。DFROUTER直接使用从感应线圈收集到的信息
来重建车辆总数和路径信息。这主要有以下几个步骤:
1) 计算探测器类型(可以选择存储),即每个感应器被设置为源探测器,汇点探测器或
者中间探测器三者中的一种
2) 计算探测器间的路径(可以选择存储)
3) 计算探测器间的车流量
4) 存储车流量和更进一步的控制结构

1:计算探测器类型
DFROUTER认为探测器完全覆盖了路网,意味着所有开关坡道(all off- and on-ramps)
都装备有感应线圈。初始化时感应线圈的类型是未知的,必须计算出来。DFROUTER
需要相关路网和探测器定义的列表(每个定义描述了感应线圈的位置)。需要使用
( --net-file | --net | -n ) <SUMO_NET_FILE> 选项把先前的SUMO路网传给
DFROUTER,使用--detector-files (or --detectors or -d for short)
<DETECTOR_FILE>[,<DETECTOR_FILE>]+选项把感应线圈定义列表传给
DFROUTER。探测器文件看起来如下面所示:
<detectors>
<detector_definition id="<DETECTOR_ID>" lane="<LANE_ID>" pos="<POS>"/>
... further detectors ...
</detectors>
这就意味着:每个探测器使用id,被放置的车道,及放置在车道上的位置来描述。意义是:
• id: 一个字符串,代表探测器标识
• lane: 探测器所安放的车道标识,必须是路网中存在的车道。
• pos: 探测器安置在车道上的位置,单位米。该值必须在如下范围内: [-1*车道长度,
车道长度],负值代表从车道末尾计算(车辆驶向的方向)。
如果给出路网和探测器列表,DFROUTER会给探测器分配类型(若使用了
--detectors-output <DETECTOR_OUTPUT_FILE>选项,还会保存扩展的探测器列表到文
件)。该扩展列表和上述输入的探测器列表相似,只是每个探测器多了额外的"type"标记,
type标记的值可以是["source", "sink", "between", and "discarded".]。你也可以生成一个感
兴趣的探测点的列表,它可以被GUISIM程序读取,每个感兴趣的探测点会出现一个着
色的探测器:绿色代表源探测器,红色代表汇点探测器,蓝色代表中间探测器,黑色代
表废弃的探测器。使用--detectors-poi-output <POI_FILENAME>选项强制DFROUTER实
现该功能。
有时可能会需要扩展后的<DETECTOR_OUTPUT_FILE>可以回溯到DFROUTER代
替先前到的<DETECTOR_FILE>.(例如其他参数改变时),这种情况下探测器类型不必重
新计算,可以使用--revalidate-detectors.选项强制重新计算探测器类型。(译者认为,默认
是不重新计算)
2.计算路径
既然我们知道了车辆进入和离开网络的位置,就可以计算每个起止点间路径。
DFROUTER使用选项--routes-output <ROUTE_OUTPUT_FILE>创建和保存路径,这里
<ROUTE_OUTPUT_FILE>是计算出的路径将保存的文件名。生成的文件仅包含路径,
没有车辆类型定义,也没有车辆本身。在随后的运行中,你可以使用选项--routes-input (or
-r) <ROUTE_FILE>使用先前产生的路径以省略路径计算。重复一下,在探测器类型的
计算中,可以强制DFROUTER重新计算路径,即使你使用了--revalidate-routes选项。
一般情况下,仅计算在源探测器和汇点探测器间的路径,但也可以使用:
--routes-for-all选项强制DFROUTER也计算从中间探测器开始的路径。
--all-end-follower选项可以实现不让路径在安置源探测器的街道结束,而在该街道的
所有后继街道结束。
--keep-unfound-ends选项:如果因路网未被感应线圈完全覆盖,致使不能找到汇点
探测器,可使用该选项保留这些路径。
3.计算交通流
下一步就是使用上面计算的路径和来自真实世界的探测器的流量来计算通过模型网络
的车流。应使用选项--detector-flow-files (or --detflows, -f for short)
<DETECTOR_FLOWS>[,<DETECTOR_FLOWS>]+ 把真实流量传给DFROUTER,这里
认为这些数据以CSV格式的文件给出(CSV文件内部以分号“;”作为分隔符)。文件如下
所示:
Detector;Time;qPKW;qLKW;vPKW;vLKW
myDet1;0;10;2;100;80
... further entries ...
这意味着首先应给每个列命名,它们的顺序是无关紧要的,但至少应包含如下的列:
•Detector:一个字符串,此行描述的探测器的标识,应该是 <DETECTOR_FILE>文件
中真实使用的值。
• Time: 从该时刻开始描述
• qPKW: 这一时段驶过探测器的客车数(passenger cars)
• qLKW: 这一时段驶过探测器的货车数(transport vehicles)
• vPKW: 这一时段驶过探测器的客车的平均速度(Km/h) km/h
• vLKW: 这一时段驶过探测器的货车的平均速度(Km/h) km/h
这并不是感应线圈的标准输出,但我们必须这样约束<DETECTOR_FLOWS>文件,因
为DFROUTER需要读取大量的类似定义,必须尽快地完成这个工作。
因为有些情况下,可能读取了从给定时刻开始的探测器流量定义,但想从另一个时刻开
始仿真,这时可以使用选项--time-offset <TIME_OFFSET>添加一个时间偏移,这个偏移
值从读取时段中被减去。<TIME_OFFSET>是以整数表示的秒数。
4.保存交通流和其他值
如果提供了车流的定义(理解为车流信息),我们可以使用DFROUTER把已计算的车辆
和它们的路径保存在一起。车辆将在网络中车道的放置源探测器的位置被射出(即进入
路网),发射器被用来把这些车辆插入到路网中。可以使用选项--emitters-output
<EMITTER_OUTPUT_FILE>强制DFROUTER程序生成发射器,该文件将包含每个源探
测器的车辆发射器声明。如果相应值没有给出,则不写入对应的车辆发射器。同时,发
射器定义会被写进名为"emitter_<DETECTOR_ID>.def.xml"的文件中,这里
<DETECTOR_ID>是相关的源探测器id。这些定义被<EMITTER_OUTPUT_FILE>文件使
用,而且这些定义包含了根据读入的车流要离开发射器的车辆,还包含使用这些车流计
算出的路径。
由于某些原因使用速度限制来避免“开关边界”问题(open-end boundary problems),
DFROUTER可以生成一个安置在汇点探测器位置处的速度触发器的列表。可以使用选
项--speed-trigger-output <VSS_OUTPUT_FILE>保存这些速度触发器的声明,该选项需
要提供文件名。相关的速度触发器的定义会被写入名为"vss_<DETECTOR_ID>.def.xml"
的文件,这里<DETECTOR_ID>是相关汇点探测器的名字。
为了不在驶出匝道结束车辆路径,也可以在汇点探测器的位置处放置一个“二次路
由器”(rerouters)。给出选项--end-reroute-output <REROUTER_OUTPUT_FILE>将会产生
一个“二次路由器”声明的列表。请注意这种情况下,因为DFROUTER没有关于除了
探测器覆盖区域外的可能路径的进一步信息,并不会写入“二次路由器”的定义。
如果可以检验仿真是否如你所愿的运行,会是件惬意的事情。为了验证仿真中的车流是
否和现实世界中的相一致,可以使用选项--validation-output
<SUMO_DETECTORS_OUTPUT>,它产生一个安置在汇点和中间探测器位置处的探测
器定义列表。这些输出信息被保存在名为"validation_det_<DETECTOR_ID>.xml"的文件
中,而且很容易和先前被送到路由器的探测器车流做对比。选项
--validation-output.add-sources可以让DFROUTER在真实探测器位置后方1米处为源探测
器创建E1-探测器(仿真的感应线圈)。参考"E1-Detectors (Induction Loops)"。

7.3.12.使用 ActivityGen

P87

7.3.13.动态用户分配(DUA)

8.仿真
第95页

8.1.基本仿真定义

以下各节,分别描述仿真模块SUMO和GUISIM所需要的输入。

8.2.道路网络

对于仿真,必须使用--net-file <NETWORK_FILE> (or -n <NETWORK_FILE>)选项指


定SUMO的路网。路网一般可以使用NETCONVERT or NETGEN工具创建。

8.3.交通需求

必须给出要仿真的车辆,车辆的描述一般包括车辆类型、车辆、和车辆路径。路径信息
一般使用--route-files <ROUTES_FILE>[,<ROUTES_FILE>]* (or -r
<ROUTES_FILE>[,<ROUTES_FILE>]*).选项传给仿真模块。

8.4.为仿真定义时段

每个仿真都需要被仿真的时间段的定义,可以使用选项--begin <INT> (or -b <INT> for


short) and --end <INT> (-e <INT>).传给SUMO或者GUISIM程序。请注意是否给出—end
选项会影响到仿真行为。这在下面详细描述。
仿真从—bigin选项给出的时刻开始(默认值是0),所有离开时间小于仿真开始时间的车辆
将被忽略。
仿真依次执行每个仿真时间步。
仿真在以下情况结束:
•使用−−end选项给出了最后一个仿真步,并且这个仿真时间步已到(下一步的时
间>=end)
•−−end选项没有给出值,并且所有车辆都被仿真完毕。仿真的状态即最后一个离开
仿真区域时的状态。如果对于活动的TraCI连接,在最后车辆之后仿真仍将继续(假定永
远仿真)
•通过TraCI接受到一个关闭命令
有两个命令行选项会影响仿真的结束:
--too-many-vehicles <INT>,如果给出的车辆数超过了该值仿真结束

8.5.高级交通灯仿真

一般情况,NETCONVERT 和 NETGEN在计算路网期间会为交叉口生成交通灯和
交通灯程序。这些计算的程序与现实中的非常不同。为给仿真提供真实的交通灯程序,
可以载入外部的程序。而且,SUMO/GUISIM允许载入定义,该定义描述一组交通灯何
时可以从一个控制程序切换到另一个,及怎样切换。这些在以下章节描述

8.5.1.载入新的交通灯仿真程序

可以从外部文件中载入新的交通灯的定义,载入时使用最后的程序。可以通过WAUTs
和(或)TraCI实现程序切换。而且,可以使用GUI上下文菜单实现切换。交通灯程序的定义如
下所示:
<tl-logic id="0" programID="my_program" offset="0" type="static">
<phase duration="31" state="GGggrrrrGGggrrrr"/>
<phase duration="5" state="yyggrrrryyggrrrr"/>
<phase duration="6" state="rrGGrrrrrrGGrrrr"/>
<phase duration="5" state="rryyrrrrrryyrrrr"/>
<phase duration="31" state="rrrrGGggrrrrGGgg"/>
<phase duration="5" state="rrrryyggrrrryygg"/>
<phase duration="6" state="rrrrrrGGrrrrrrGG"/>
<phase duration="5" state="rrrrrryyrrrrrryy"/>
</tl-logic>
交通灯程序使用如下的属性/元素:
属性名字 是否必需 值类型 描述
id@tl-logic 是 Id(string) 交通灯的标识id
Type 是 枚举 交通灯类型
(static, (静态、控制、代理)
actuated,
agentbased)
programID 是 Id(string) 交通灯程序(逻辑)的标识id;请注意“偏移”
被保留,参考下面
offset 是 int 程序的初始化时间偏移量
每个相位使用如下的属性来定义:
属性名字 是否必需 值类型 描述
duration@phase 是 时间(int) 相位的持续时间
state@phase 是 信号状态列表 该相位的交通灯状态
每个相位状态的特征描述了一个交通灯的信号状态。请注意,一个车道可以包含几个信
号,例如:对于一个左转车道和直行车道。这意味着,信号不能控制车道,而是连接车道,
即每个信号把进入交叉口的车道和驶出交叉口的车道连接到一起。在SUMO中,实现了信号
和连接间一对多的关系,这意味着每个信号可以控制多个连接,但是通过NETCONVERT or
NETGEN产生的路网通常每个连接使用一个信号。同时请注意,一个交通灯可以控制进
入不同交叉口的车道(复数),哪个连接被哪个交通灯信号控制着的信息可以这样获得,
即在GUISIM的可视化设置里使用选项"show link tls index",或者从相关的网络连接
(linkno@succlane)的属性获得。
我们使用以下的信号颜色:
特征 描述
R 红色信号灯,车辆必须停止
Y 黄色信号灯,远处驶向交叉口的车辆需减速,近处的车辆可以通过
g 绿色信号灯(没有优先权),如果没有车辆使用更高优先权,则车辆可以通过交叉
口;否则需减速让高优先权到的特殊车辆通过
G 绿色信号灯(带优先权),车辆(一定)可以通过交叉口
如上定义了交通灯程序后,就可以作为外部文件载入;当然,一个单一的外部文件可以
包含多个交通灯程序。可以为一个交通灯载入多个程序到仿真中,首先使用最后载入的程序
(除非使用了WAUT描述,没有定义程序间的区别)。如果描述了同一个交通灯,则外部程序
中的子键必须不同。
也可以载入一个程序,该程序通过指定programID的值为”off”来实现关闭交通灯。例
如:
<tl-logic id="0" type="static" programID="off"/>
8.5.2.交通灯仿真程序导入工具

一般来自真实世界的交通灯系统的描述和SUMO的交通灯描述格式是不同的。为了更简
单的导入而不是不手工编辑,可以使用名为"tls_csv2SUMO.py"的工具,该工具抽取描述
程序的CSV格式文件,并构建相应的SUMO交通灯描述。可在<SUMO>/tools/tls文件夹
下找到该工具,它需要程序定义及需要转换的SUMO路网:
tls_csv2SUMO.py <TLS_CSV> <NET>
它在标准输出上打印生成的交通灯系统的定义(可以使用管道重定向到文件)。
CSV描述格式如下:
首先,必须给出三个标题行,分别标识tls,程序子键,程序将开始运行的时间偏移量(以秒为单位,
一般是值为0):
key;<KEY>
subkey;<SUBKEY>
offset;<OFFSET>
其次,它定义了程序的哪个信号(是个数值)负责哪个连接。连接可以这样来描述:仅使
用输入边,或仅使用输入车道,或驶出边与驶出车道合并起来使用。这意味着如下脚本是合
法的:
link;<LINK_NUMBER>;<FROM_EDGE>;;0
link;<LINK_NUMBER>;<FROM_LANE>;;0
link;<LINK_NUMBER>;<FROM_EDGE>;<TO_EDGE>;0
link;<LINK_NUMBER>;<FROM_EDGE>;<TO_LANE>;0
link;<LINK_NUMBER>;<FROM_LANE>;<TO_EDGE>;0
link;<LINK_NUMBER>;<FROM_LANE>;<TO_LANE>;0
也可能为一个信号分配多于一个的连接。
再次,给出信号的状态:<LINK_NUMBER>;<STATES>
使用上面描述的分号隔开的信号颜色来编码信号状态(注意仅使用小写字母)。一个信号
相位的例子如下:1;g;g;g;g;y;r;r;r;r;r
请注意状态数与定义的连接数必须相同,即以上状态序列对应于10个连接的状态。
最后,我们仅需要定义相位时间:time;<TIMES>
给出的时间以秒为单位,用分号分隔,举例如下:
time;18;33;3;6;3;3;9;15;90

一个完整的CSV格式描述如下所示:
key;102
subkey;utopia
offset;0
link;1;4643;;0
link;1;3078;;0
link;2;3074;;0
link;2;-6494;;0
1;g;g;y;r;r;r;r;r
2;r;r;r;r;g;g;y;r
3;r;r;r;r;g;y;y;r
4;g;y;y;r;r;r;r;r
min;21;3;3;2;20;9;3;2
time;45;3;3;2;36;9;3;2
max;78;3;3;2;62;9;3;2

8.5.3.定义程序交换时间和过程

实际上,一个交通灯系统可能在一天(或在工作日和周末)使用不同的程序。可以载入使
用WAUT来描述的不同程序间切换的定义("Wochenschaltautomatik"的缩写,即每周自动切
换)。
这里给出一个关联有四个程序的交通灯,其中两个程序在工作日使用,另两个周末使用,
而且晚上22点到次日6点使用夜晚计划,6点到晚上22点使用白天计划。已定义的程序分别命
名为"weekday_night", "weekday_day", "weekend_night", "weekend_day"。为了描述切换过
程,我们必须首先描述切换本身,假定我们的仿真从周一的0点时刻运行到下周一的0点
(604800秒):
<WAUT refTime="0" id="myWAUT" startProg="weekday_night">
<wautSwitch time="21600" to="weekday_day"/> <!-- monday, 6.00 -->
<wautSwitch time="79200" to="weekday_night"/> <!-- monday, 22.00 -->
<wautSwitch time="108000" to="weekday_day"/> <!-- tuesday, 6.00 -->
... further weekdays ...
<wautSwitch time="453600" to="weekend_day"/> <!-- saturday, 6.00 -->
... the weekend days ...
</WAUT>
WAUT文件中的域有以下的含义:
属性名称 是否必需 值类型 描述
Id 是 string id 定义的WAUT的名字
RelTime 是 Int 参考时间,使用偏移量给出的切换时间
startPorg 是 string id 仿真开始时使用的程序

wautSwitch中的域有如下含义:
属性名称 是否必需 值类型 描述
Time 是 Int 切换将发生的时间
to 是 String id 将分配给交通灯系统
的程序名字
当然,使用的程序名字必须在读取前已经定义了,而且,在它们执行时必须记录仿真步。
另外,WAUT必须给出将切换哪个交通灯系统,如下所示:
<wautJunction wautID="myWAUT" junctionID="RCAS" [procedure="Stretch"]
[synchron="t"]/>
上述脚本中的属性含义如下:
属性名称 是否必需 值类型 描述
wautID 是 string id 将用来切换tls的WAUT的标识id
junctionID 是 string id 分配给WAUt的tls名称
Procedure 是 string 使用的切换算法;如果未给出,程序将立即切换(默认)
enum
synchron
是 string 额外信息,是否同步切换(默认:false)
enum
可能给一个WAUT分配多个tls,理论上也可能给一个交叉口(即一个tls)分配多个WAUT,
但实际中不这么做。

8.5.4.交通灯性能评估

自动探测器生成的工具
一些工具可以用来为交通灯评估帮助生成探测器定义,所有这些工具都在
<SUMO>/tools/output目录下。
generateTLSE2Detectors.py:该工具生成一个区域探测器文件。这些探测器可以覆
盖所有驶入交叉口的车道。可以使用选项--distance-to-TLS <FLOAT> (or -d <FLOAT>),
给出距离交叉口的偏移量,默认是1米。生成的探测器在以下两种情况时结束:1)使用
--detector-length <FLOAT> (or -l <FLOAT>)定义了长度,默认是250米;2)如果车道长
度小于这个给定的长度,则在车道末尾处结束。一个调用例子如下:
generateTLSe2Detectors.py -n netfile -d distance –o e2.detector.xml –r e2.results.xml
generateTLSE3Detectors.py:该工具生成一个多进口/多出口的探测器文件。每条驶
向交通灯的边都会构建探测器,这些边的所有车道都有出口点。可以使用选项
--distance-to-TLS <FLOAT> (or -d <FLOAT>)给出这些出口点距离交叉口的偏移,默认
是1米。驶入边被上行流跟随,直到使用--detector-length <FLOAT> (or -l <FLOAT>)定义
了长度(默认值是250米),或者到达了另一个交通灯,或者没有进一步的上行流存在,在
这些点处产生进口点。一个调用例子如下:
generateTLSE3Detectors.py -n n etfile -d distance –o e3.detector.xml –r e3.results.xml
两种情况都需要使用选项--net-file <FILE> (or -n <FILE>).给出路网,需使用选项
--output <FILE> (or -o <FILE>)给出要产生的包含探测器定义的文件,默认区域探测器
是"e2.add.xml",多进口/多出口探测器是"e3.add.xml".对于每一种默认情况,
generateTLSE2Detectors.py生成的区域探测器把它们的测量值记录在"e2output.xml"中,
generateTLSE3Detectors.py生成的多进口/多出口探测器把测量值记录在"e3output.xml"
文件中。对于两个工具脚本而言,都可以使用选项--results-file <FILE> (or -r <FILE>)
改变输出的文件名字。默认生成报告的频率是60s,但可以使用选项--frequency <INT> (or
–f <INT>)来改变。

8.6.SUMO 的公共运输仿真(公交系统)

可以定义公交站点的位置,并让公交车(busses)在预先给定的时间在站点处停车。SUMO
中公交站点的定义有如下的格式:
<busStop id="<BUS_STOP_ID>" lane="<LANE_ID>"
startPos="<STARTING_POSITION>" endPos="<ENDING_POSITION>"
[line="<LINE_ID>[ <LINE_ID>]*"]/>.
这意味着公交站点是车道上的一个区域,各个参数有如下的含义:
属性名称 是否必需 值类型 描述
Id 是 id (string) 公交站点的名字,必须唯一
Lane 是 string-id 公交站点所在的车道名字
startPos 是 float 公交站点在车道上的开始位置(单位米)
endPos float 公交站点在车道上的结束位置(单位米)
line string list 该公交站点的停车线,使用空格分隔的名字列表,仅
在可视化软件中使用(实际就是站点可停靠的公交名
字)
警告:请注意到0.12版本(包括)后,"startPos" 和 "endPos" 属性被命名为 "from" 和
"to"。
警告:请注意公交站点必须通过--additional-files parameter添加到一个配置文件中
(config)。必须通知车辆在公交站点处停止。下面的例子表示怎样做到这些(例子在
<SUMO_DIST>/examples/sumo/busses):
<vtype id="BUS" accel="2.6" decel="4.5" sigma="0.5" length="15" maxspeed="70"
color="1,1,0"/>
<vehicle id="0" type="BUS" depart="0" color="1,1,0">
<route edges="2/0to2/1 2/1to1/1 1/1to1/2 1/2to0/2
0/2to0/1 0/1to0/0 0/0to1/0 1/0to2/0 2/0to2/1"/>
<stop bus_stop="busstop1" duration="20"/>
<stop bus_stop="busstop2" duration="20"/>
<stop bus_stop="busstop3" duration="20"/>
<stop bus_stop="busstop4" duration="20"/>
</vehicle>
这里定义了一个名为“0”的“BUS”。 “BUS”是一个先前已生命的参考类型。车辆的定
义中嵌入了路径信息和停止位置的列表。每个停止位置使用两个属性描述:"bus_stop" and
"duration"。其中"bus_stop" 是车辆要停车的公交站点的名字,"duration"是车辆需在该站
点等候的时间(单位秒)。请注意车辆将停车的公交站点的顺序必须是正确的。
你也可以让车辆在公交站点之外的其他位置停车。车辆停止的简要定义如下:
<stop bus_stop="<BUS_STOP_ID>" | ( lane="<LANE_ID>"
endPos="<POSITION_AT_LANE>" ) duration="<HALTING_DURATION>"/>这意味着你
可以使用公交站点或者车道位置来定义车辆必须在哪里停车。车辆的“stop”元素的完
整属性列表请参照Specification#Stops.(7.2.8节)
下一版本会重新访问这一部分(可能会改动)

8.7.SUMO 的可变速度信号

使用外部文件指定的触发器对象允许可变速度信号的仿真,该类对象的语法如下:
<variableSpeedSign id="<VSS_ID>" lanes="<LANE_ID>[;<LANE_ID>]*"
file="<DEF_FILE>"/>
在上面的模式中,<DEF_FILE>文件必须被提供。该文件必须包含如下信息:指定的
速度何时可以被设置到车道上。该文件的格式是这样的:
<vss>
<step time="<TIME>" speed="<SPEED>"/>
<step time="<TIME>" speed="<SPEED>"/>
... further entries ...
<step time="<TIME>" speed="<SPEED>"/>
</vss>
每个时间步都是下一个将被设置的速度所在的时间,及速度本身。
在SUMO的"data/examples/extended/variable_speed_signs"目录下可以找到一个关于可
变速度信号(VSS)的小例子。

8.8.SUMO 的重新路由

8.8.1.二次路由器

二次路由器实现:当车辆移动到指定街道(边)时立即改变其路径。
把下面的声明添加到外部文件来把“二次路由器”设置到仿真网络中:
<rerouter id="<REROUTER_ID>" edges="<EDGE_ID>[;<EDGE_ID>]*"
file="<DEFINITION_FILE>" [probability="<PROBABILITY>"]/>.
二次路由器可被放置到几条边上,至少需要一条边。而且,可以在定义中给出二次路由
的概率(一个0到1之间的数值),声明中的各项含义如下:
属性名称 是否必需 值类型 描述
Id 是
id (string) 二次路由器的标识id
Edges 是 Float 车连将被重新路由使用的边id或边id的列表
File 是 Float 定义文件的路径
probability float 车辆被二次路由的概率(0-1)
除了这个声明外,还必须给出定义文件(存储在<DEFINITION_FILE>中),该定义文件
描述了二次路由器的行为(随时间变化)。每一个二次路由器将做些什么的描述都被嵌入到内
部定义中,内部定义描述了二次路由器将在哪个时段工作。这个设置如下所示:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>"/>
... action description ...
</interval>
... further intervals ...
</rerouter>
二次路由器可以以多种方式工作。在一个时段内,你可以关闭街道,分配新的目的地,
或重新给出车辆路径。下一小节将描述这些可能性及怎样在二次路由器的定义文件中详细描
述。

8.8.2.关闭街道

“关闭--二次路由”("closing_reroute")强制二次路由器关闭街道<EDGE_ID>。本应正
常通过这些街道的车辆,一旦到达这些街道(在二次路由器声明的边属性中给出)将会获
得一个新的路径。一个“关闭--二次路由”的定义如下所示:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>"/>
<closing_reroute id="<EDGE_ID>"/>
</interval>
... further intervals ...
</rerouter>
该定义中使用的属性如下:
属性名称 是否必需 值类型 描述
id 是 id (string) 关闭边的id;必须的、字符串格式;必须是路网中
存在的id

8.8.3.分配新的目的地

如果车辆通过了二次路由器声明中的边属性定义的边,"dest_prob_reroute"元素强制
二次路由器给这些车辆分配一个新的路径。使用相关元素中定义的新目的地的名字,来
实现使用新的路径目的地:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>"/>
<dest_prob_reroute id="<EDGE_ID1>" probability="<PROBABILITY1>"/>
<dest_prob_reroute id="<EDGE_ID2>" probability="<PROBABILITY2>"/>
</interval>
... further intervals ...
</rerouter>
使用Dijkstra算法自动计算路径,路径在车辆所在的边开始,在新的目的地结束。新
路径将是空路网中最快的路径。
"dest_prob_reroute"元素使用的属性有:
属性名称 是否必需 值类型 描述
id 是 id (string) 新目的地的id(边id);必需的,字符串类型;必须
是路网中存在的边id
Probability 是 Float 车辆将使用给定边作为目的地的概率;必需的,
float类型,需在0-1之间;概率和为1(但这不必要)

8.8.4.分配新的路径

如果车辆通过了二次路由器声明中的边属性中定义的边,"route_prob_reroute"元素
强制二次路由器给这些车辆分配一个新的路径。这种情况下,必须提供完整路径的标识
id以代替新的目的地:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>"/>
<route_prob_reroute id="<ROUTE_ID1>" probability="<PROBABILITY1>"/>
<route_prob_reroute id="<ROUTE_ID2>" probability="<PROBABILITY2>"/>
</interval>
... further intervals ...
</rerouter>
这些定义中使用的属性如下:
属性名称 是否必需 值类型 描述
id 是 id (string) 将要分配的新路径的标识id;必需的、字符串类型;
必须是之前已载入的路径的id
Probability 是 Float 车辆将使用给定边作为目的地的概率;必需的,
float类型,需在0-1之间;概率和为1

8.9.可行的仿真方案

8.9.1.使用随机路径仿真

(1)在openStreetMap网站下载osm格式的城市地图(如有需要可以使用JSOM进行编辑)
(2)使用netconvert把osm格式地图转换为SUMO格式的路网:
netconvert --osm-files berlin.osm.xml -o berlin.net.xml
注意:可能会因为文件里的极个别汉字而出现错误,可以根据错误提示把相关汉字改掉(字符编码
问题,其它国家语言也会出现)
(3)使用sumo\tools\trip目录下的randomTrips.py脚本生成*.trip.xml随机旅程文件(net
文件作为输入),以下命令生成berlin.trip.xml随机旅程文件:
randomTrips.py –n berlin.net.xml
(4)使用Duarouter工具(使用net文件和trip文件作为输入)生成路径文件(也可使用车
辆定义文件)
Duarouter –n berlin.net.xml –t berlin.trip.xml –o berlin.rou.xml
--continue-on-unbuild(忽略错误继续) –w(不显示警告信息)
(5) 使用POLYCONVERT生成地形文件
POLYCONVERT工具可以从OSM数据导入地形,并产生一个Sumo-polygon文件:
POLYCONVERT --net-file berlin.net.xml --osm-files berlin.osm --typemap
typemap.xml -o berlin.poly.xml
(6)手工编辑berlin.sumo.cfg配置文件
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration>
<input>
<net-file value="berlin.net.xml"/>
<route-files value="berlin.rou.xml"/>
<!--产生的polygon文件berlin.poly.xml需要添加进sumo-gui配置里面:
-->
<additional-files value="berlin.poly.xml"/>
</input>
<output>
<vehroute-output value="vehroutes.xml"/>
</output>
<report>
<no-duration-log value="true"/>
<no-step-log value="true"/>
</report>
</configuration>
(7)在可视化仿真工具sumo-gui中打开berlin.sumo.cfg配置文件,点击运行仿真按钮即可开
始仿真。

8.9.2.使用探测器数据仿真

(1)使用 openStreetMap 编辑下载 osm 格式的城市地图


(2)使用 netconvert 把 osm 格式地图转换为 SUMO 格式的路网:
netconvert --osm-files guiYangMap.osm -o guiYangMap.net.xml
注意:可能会因为文件里的极个别汉字而出现错误,可以根据错误提示把相关汉字改掉
3-7使用探测器数据构建路径,参考7.3.11小节
(3) 计算探测器类型
DFRouter需要相关的路网和探测器定义的列表,它使用--net-file <sumo_net_file>传递路
网,使用--detector-files <detector_file>,<detector_file>…传递感应线圈定义。
路网文件在第一步中已经获得,而探测器文件的格式如下:
<detectors>
<detector_definition id="<DETECTOR_ID>" lane="<LANE_ID>" pos="<POS>"/>
<detector_definition id="<DETECTOR_ID>" lane="<LANE_ID>" pos="<POS>"/>
... further detectors ...
</detectors>
如果给出路网和探测器列表,DFROUTER会给探测器分配类型(若使用了
--detectors-output <DETECTOR_OUTPUT_FILE>选项,还会保存扩展的探测器列表到文
件)。为使GUISIM程序为探测器着色,可以使用--detectors-poi-output <POI_FILENAME>
选项强制DFROUTER实现该功能。
(4) 计算路径
DFROUTER使用选项--routes-output <ROUTE_OUTPUT_FILE>创建和保存路径,这里
<ROUTE_OUTPUT_FILE>是计算出的路径将保存的文件名。生成的文件仅包含路径,没有车辆
类型定义,也没有车辆本身。在随后的运行中,你可以使用选项--routes-input (or-r)
<ROUTE_FILE>使用先前产生的路径以省略路径计算。(注:笔者认为该路径是根据以上计算
的探测器类型确定的,所以路径与实际的用户需求是无关的,应该类似于随机路径)
一般情况下,仅计算在源探测器和汇点探测器间的路径,但也可以使用:
--routes-for-all选项强制DFROUTER也计算从中间探测器开始的路径。
--all-end-follower选项可以实现不让路径在安置源探测器的街道结束,而在该街道的所
有后继街道结束。
--keep-unfound-ends选项:如果因路网未被感应线圈完全覆盖,致使不能找到汇点探测
器,可使用该选项保留这些路径。
(5) 计算交通流
下一步就是使用上面计算的路径和来自真实世界的探测器的流量来计算通过模型网络
的车流。应使用选项--detector-flow-files <DETECTOR_FLOWS>
[,<DETECTOR_FLOWS>]+ 把真实流量传给DFROUTER,这里认为这些数据以CSV格
式的文件给出(CSV文件内部以分号“;”作为分隔符)。文件如下所示:
Detector;Time;qPKW;qLKW;vPKW;vLKW
myDet1;0;10;2;100;80
... further entries ...
这意味着首先应给每个列命名,它们的顺序是无关紧要的,但至少应包含如下的列(这
并不是感应线圈的标准输出):
•Detector:一个字符串,此行描述的探测器的标识,应该是 <DETECTOR_FILE>文件
中真实使用的值。
• Time: 从该时刻开始描述
• qPKW: 这一时段驶过探测器的客车数(passenger cars)
• qLKW: 这一时段驶过探测器的货车数(transport vehicles)
• vPKW: 这一时段驶过探测器的客车的平均速度(Km/h) km/h
• vLKW: 这一时段驶过探测器的货车的平均速度(Km/h) km/h
因为有些情况下,可能读取了从给定时刻开始的探测器流量定义,但想从另一个时刻开
始仿真,这时可以使用选项--time-offset <TIME_OFFSET>添加一个时间偏移,这个偏移
值从读取时段中被减去。<TIME_OFFSET>是以整数表示的秒数。
(6) 保存交通流和其它值
车辆将在网络中车道的放置源探测器的位置被射出(即进入路网),发射器被用来把这些
车辆插入到路网中。可以使用选项--emitters-output <EMITTER_OUTPUT_FILE>强制DFROUTER
程序生成发射器,该文件将包含每个源探测器的车辆发射器声明。如果相应值没有给出,则
不写入对应的车辆发射器。同时,发射器定义会被写进名为"emitter_<DETECTOR_ID>.def.xml"
的文件中,这里<DETECTOR_ID>是相关的源探测器id。这些定义被<EMITTER_OUTPUT_FILE>
文件使用,而且包含了根据读入车流离开发射器的车辆,还包含使用这些车流计算出的路径。
(7) 仿真验证
如果可以检验仿真是否如你所愿的运行,会是件惬意的事情。为了验证仿真中的车流是
否和现实世界中的相一致,可以使用选项--validation-output
<SUMO_DETECTORS_OUTPUT>,它产生一个安置在汇点和中间探测器位置处的探测
器定义列表。这些输出信息被保存在名为"validation_det_<DETECTOR_ID>.xml"的文件
中,而且很容易和先前被送到路由器的探测器车流做对比。选项
--validation-output.add-sources可以让DFROUTER在真实探测器位置后方1米处为源探测
器创建E1-探测器(仿真的感应线圈)。参考"E1-Detectors (Induction Loops)"。

捷径:
步骤3-7的操作可以写入一个配置文件,然后由dfrouter程序使用该配置文件,一步
就可完成所有操作:dfrouter –c guiYang.dfro.cfg。其中guiYang.dfro.cfg为配置文件,其
内容大概如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://sumo.sf.net/xsd/dfrouterConfiguration.xsd">
<input>
<net-file value="guiYangMap.net.xml"/>
<detector-files value="guiYang.detector.xml"/>
<detector-flow-files value="detector.flows.csv"/>
</input>
<output>
<detectors-output value="detector.output.xml" />
<detectors-poi-output value="detector.poi.xml" />
<routes-output value="routes.output.xml"/>
<emitters-output value="emitter.output.xml"/>
<validation-output value="sumo.detectors.output.xml" />
</output>
<processing>
<keep-unfound-ends />
<time-offset value="60"/>
</processing>
</configuration>
可能出现的问题:emitter.output.xml文件中只有routeDistribution信息,而没有车辆信息。
(8) 使用POLYCONVERT生成地形文件
POLYCONVERT工具可以从OSM数据导入地形,并产生一个Sumo-polygon文件:
POLYCONVERT --net-file guiYangMap.net.xml --osm-files guiYangMap.osm
--typemap typemap.xml -o guiYangMap.poly.xml
(9)手工编辑guiYang.sumo.cfg配置文件
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration>
<input>
<net-file value="guiYangMap.net.xml"/>
<gui-settings-file value="gui-settings.cfg"/>
<!-- <route-files value="routes.output.xml"/> -->
<!--产生的polygon文件berlin.poly.xml需要添加进sumo-gui配置里面:-->
<additional-files
value="guiYangMap.poly.xml,detector.output.xml,detector.poi.xml,sumo.detectors.outp
ut.xml,routes.output.xml,emitter.output.xml"/>
</input>

<output>
<netstate-dump value="netstate.xml"/>
<dump-empty-edges value="true"/>
<vehroute-output value="vehroutes.xml"/>
<vehroute-output.exit-times value="true"/>
<vehroute-output.last-route value="true"/>
<vehroute-output.sorted value="true"/>
</output>

<report>
<no-duration-log value="true"/>
<no-step-log value="true"/>
</report>
</configuration>
(10)在可视化仿真工具sumo-gui中打开guiYang.sumo.cfg配置文件,点击运行仿真按钮即可
开始仿真。

8.9.3.使用车流分布仿真

(1) 如方法一导入一个已经存在的网络(可以使用OSM地图)
(2) 使用车流和转弯百分比(由于SUMO对OSM地图的转换,使得交叉口处的连接信
息丢失,所以不能使用转弯率,除非对关键路口的路网数据进行修改)
使用路口的交通量统计计算路口转弯率;使用路段交通量数据计算车流分布(百分
比),具体操作为:
JTRROUTER是个路由应用程序,它使用路口的交通流和转弯率作为输入。必须提
供以下参数:路由车辆的路网,交叉口转弯率的描述(默认使用该描述),交通流的描述。
调用格式是这样的:
jtrrouter --flows=<FLOW_DEFS> --turns=<TURN_DEFINITIONS> --net=<SUMO_NET> \
--output-file=MySUMORoutes.rou.xml -b <UINT> -e <UINT>
*.flows.xml文件的结构如下所示:
<flowdefs>
<flow id="1" from="99204573#0" to="99289479#3" begin="0" end="10000" no="400"/>
<flow id="2" from="95503571#1" to="98600845#6" begin="0" end="1000" no="350"/>
</flowdefs>
为了描述转弯的定义,必须创建额外的文件。该文件里,必须给出每个时间区间和每条
街道的用户使用百分比。例子如下:
<turn-defs>
<interval begin="0" end="3600">
<fromedge id="myEdge0">
<toedge id="myEdge1" probability="0.2"/>
<toedge id="myEdge2" probability="0.7"/>
<toedge id="myEdge3" probability="0.1"/>
</fromedge>
... 其它边的情况 ...
</interval>
... 其它时间间隔(interval ...
</turn-defs>
交通流定义与DUAROUTER除了一点外基本相同,即它不知道车辆在何处离开路网,因
为路径是被随机计算的,目的地参数对jtr-routing没有意义(可以不使用)。当车辆到达汇点
时会尽快离开路网。不是所有的路网都存在汇点的定义,我们可以使用选项--sinks
<EDGE_ID>[,<EDGE_ID>]*把一个边的列表声明为汇点,也可以把汇点定义添加到转弯
文件中(XML文件):
<turn-defs>
... some further turning definitions as above ...
<sink><EDGE_ID></sink>
... further sink definitions ...
</turn-defs>
理论上,当强制车辆沿同一个方向运行时路径可以是无限长,可以使用
max-edges-factor限制路径长度。该因数乘以使用的路网边数就得到路径的最大边数。使
用默认值2.0,路径可以包含的边数是网络路径数的两倍,任何长于该值的路径被标识为
无效的。我们假定对于每个网络该因数值必须重新选择(设置)。
在*.rou.xml文件中定义车辆类型分布、路径分布
<routes>
<vtypeDistribution id="typedist1">
<vtype id="type1" accel="0.8" length="5" maxspeed="70" probability="0.9"/>
<vtype id="type2" accel="1.8" length="15" maxspeed="50" probability="0.1"/>
</vtypeDistribution>
</routes>
<routes>
<routeDistribution id="routedist1">
<route id="route0" color="1,1,0" edges="beg middle end rend"
probability="0.9"/>
<route id="route1" color="1,2,0" edges="beg middle end" probability="0.1"/>
</routeDistribution>
</routes>
(3) 如果需要,计算动态用户分配
(4) 用给定的方法校正仿真
(5) 执行仿真,获得你所需要的输出

8.9.4.公交线路仿真

(1)我们需要定义公交站点的位置,并让公交车(busses)在预先给定的时间在站点处停车,
SUMO中公交站点的定义格式请参考8.6节。下面是一个例子(input_additional.add.xml):
<busStop id="busstop1" lane="2/1to1/1_0" startPos="10" endPos="50" lines="100 101
102"/>
(2)通过--additional-files parameter把公交站点添加到一个配置文件中(config),必须
通知车辆在公交站点处停止,例子如下(input_additional.add.xml):
<vtype id="BUS" accel="2.6" decel="4.5" sigma="0.5" length="15" maxspeed="70"
color="1,1,0"/>
<vehicle id="0" type="BUS" depart="0" color="1,1,0">
<route edges="2/0to2/1 2/1to1/1 1/1to1/2 1/2to0/2
0/2to0/1 0/1to0/0 0/0to1/0 1/0to2/0 2/0to2/1"/>
<stop bus_stop="busstop1" duration="20"/>
<stop bus_stop="busstop2" duration="20"/>
<stop bus_stop="busstop3" duration="20"/>
<stop bus_stop="busstop4" duration="20"/>
</vehicle>
这里定义了一个名为“0”的“BUS”。 “BUS”是一个先前已生成的参考类型。车辆的定
义中嵌入了路径信息和停止位置的列表。每个停止位置使用两个属性描述:"bus_stop" and
"duration"。其中"bus_stop" 是车辆要停车的公交站点的名字,"duration"是车辆需在该站
点等候的时间(单位秒)。请注意车辆将停车的公交站点的顺序必须是正确的。
你也可以让车辆在公交站点之外的其他位置停车。车辆停止的简要定义如下:
<stop bus_stop="<BUS_STOP_ID>" | ( lane="<LANE_ID>"
endPos="<POSITION_AT_LANE>" ) duration="<HALTING_DURATION>"/>这意味着你
可以使用公交站点或者车道位置来定义车辆必须在哪里停车。车辆的“stop”元素的完
整属性列表请参照Specification#Stops.(7.2.8节)。另外在道路属性里,可以设置公交专用
道。
总结一下:
input_additional.add.xml的文件内容如下:
<additional>
<busStop id="busstop1" lane="2/1to1/1_0" startPos="10" endPos="50" lines="100 101 102"/>
<busStop id="busstop2" lane="1/2to0/2_0" startPos="20" endPos="40" lines="100 101"/>
<busStop id="busstop3" lane="0/1to0/0_0" startPos="20" endPos="40" lines="100 101 102"/>
<busStop id="busstop4" lane="1/0to2/0_0" startPos="20" endPos="40" lines="100 101"/>
<vtype id="BUS" accel="2.6" decel="4.5" sigma="0.5" length="15" maxspeed="70" color="1,1,0"
guiShape="bus/city"/>
<vehicle id="0" type="BUS" depart="0" color="1,1,0">
<route edges="2/0to2/1 2/1to1/1 1/1to1/2 1/2to0/2 0/2to0/1 0/1to0/0 0/0to1/0 1/0to2/0 2/0to2/1"/>
<stop bus_stop="busstop1" duration="20"/>
<stop bus_stop="busstop2" duration="20"/>
<stop bus_stop="busstop3" duration="20"/>
<stop bus_stop="busstop4" duration="20"/>
</vehicle>

<vehicle id="1" type="BUS" depart="3" color="1,1,0">


<route edges="2/0to2/1 2/1to1/1 1/1to1/2 1/2to0/2 0/2to0/1 0/1to0/0 0/0to1/0 1/0to2/0 2/0to2/1"/>
<stop bus_stop="busstop1" duration="20"/>
<stop bus_stop="busstop2" duration="20"/>
<stop bus_stop="busstop3" duration="20"/>
<stop bus_stop="busstop4" duration="20"/>
</vehicle>
<vehicle id="2" type="BUS" depart="6" color="1,1,0">
<route edges="2/0to2/1 2/1to1/1 1/1to1/2 1/2to0/2 0/2to0/1 0/1to0/0 0/0to1/0 1/0to2/0 2/0to2/1"/>
<stop bus_stop="busstop1" duration="20"/>
<stop bus_stop="busstop2" duration="20"/>
<stop bus_stop="busstop3" duration="20"/>
<stop bus_stop="busstop4" duration="20"/>
</vehicle>
</additional>
*.sumo.cfg配置文件如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://sumo.sf.net/xsd/sumoConfiguration.xsd">
<input>
<net-file value="net.net.xml"/>
<additional-files value="input_additional.add.xml"/>
</input>
<output>
<vehroute-output value="vehroutes.xml"/>
</output>
<report>
<no-duration-log value="true"/>
<no-step-log value="true"/>
</report>
</configuration>

8.10.使用 GUISIM

8.10.1 基本使用描述

在windows环境下,基于视窗的应用程序可以鼠标左键双击来运行,Linux下单击就可以。
之后会出现一个如下图所示的空的窗口:

使用"File->Open Simulation..."菜单输入,或者使用"open"-图标 ( ),这样可以载入一个


已有的SUMO配置文件(已".sumo.cfg"为后缀)。如果配置文件有错误,SIMGUI会报告这些错误,
如果没错,你的配置文件参考的路网会被显示在窗口中。现在可以按下"play" button ( )来
启动仿真,仿真程序会像在命令行中启动一样正常运行。可以使用"stop" button ( )来停止
仿真的运行,使用"play"按钮继续运行。当停止时,可以使用"single step" button ( )启动单
步仿真。
仿真运行时,在“Time:”标签的右侧的数字域中会显示当前的仿真步。
除了载入仿真配置文件,也可以使用"File->Open Network..."菜单或"open network"-icon
( )载入路网。注意,一般情况下,GUISIM认为路网文件以".net.xml"为后缀,但也可以接受
其他后缀的文件。
不管是已载入的仿真,还是已载入的路网,都可以使用"reload" button ( )或
"File->Reload"菜单项来重新载入。
如果已经载入仿真或路网,就只能使用鼠标来导航路网。你可以使用左键在任何方向上
拖拽网络,使用鼠标轮改变网络比例(或者按下鼠标右键并上下移动)。改变比例的同时,若
按下"ctrl"键则以一半的速度进行,按下"shift"键则以2倍的速度进行。

8.10.2.与视图交互

(1)基本导航
一旦你的路网被显示出来,就可以与之交互。在视图里按下鼠标左键并移动鼠标(保持
按下状态),就可以移动路网。保持按下右键并上下移动鼠标则可以改变路网比例,也可使
用鼠标轮来改变路网比例。
你可以定义一个比例值和x,y偏移量,这些值定义了显示路网的哪一部分。这三个值定

义了视图接口(viewport),可以使用 按钮打开视图接口编辑器。该编辑器可以保存当前设

置( ),或载入先前保存的设置(使用视图接口编辑器内部的 )。
视图接口的定义如下:<viewport zoom="<ZOOM>" x="<X-OFFSET>" y="<Y-OFFSET>"/>.它可

以作为视图设置的一部分被载入。按下中心按钮( )将重新设置视图接口以使得全部路网可

以显示出来。
(2)改变仿真的外观/可视化效果
车辆的颜色模式和边界
Min Max
Name Measure Description
Value Value
All vehicles are colored
uniform - - -
uniformly
given/assigned The color given within the
- - -
vehicle color vehicle definition
given/assigned type The color given within the
- - -
color vehicle type definition
given/assigned route The color given within the
- - -
color vehicle route definition
The depart position of
each vehicle, relative to
the network center, is
depart position as used to color the vehicle.
- - -
HSV Direction will be used as
H(ue), distance from the
center as S(aturation),
V(alue) is always 1.
The arrival position of
arrival position as
- - - each vehicle, relative to
HSV
the network center, is
used to color the vehicle.
Direction will be used as
H(ue), distance from the
center as S(aturation),
V(alue) is always 1.
The direction and
distance between a
vehicle's departure and
arrival position, are
direction/distance
- - - used to color the vehicle.
as HSV
Direction will be used as
H(ue), distance from the
center as S(aturation),
V(alue) is always 1.
by speed m/s 0 150km/h The current vehicle speed
The time for which a
by waiting time s 0 5min
vehicle is halting
by time since last The time since the last
s 0 5min
lanechange lane change
Vehicle's maximum
by max speed m/s 0 150km/h
velocity
The amount of CO2
by CO2 emissions
g/s 0 5. currently emitted by the
(HBEFA)
vehicle
by CO emissions The amount of CO currently
g/s 0 0.05
(HBEFA) emitted by the vehicle
The amount of PMx
by PMx emissions
g/s 0 .005 currently emitted by the
(HBEFA)
vehicle
The amount of NOx
by NOx emissions
g/s 0 .125 currently emitted by the
(HBEFA)
vehicle
by HC emissions The amount of HC currently
g/s 0 .02
(HBEFA) emitted by the vehicle
by fuel consumption
l/s 0 .005 The consumed fuel
(HBEFA)
by noise emissions The noise produced by the
dbA 0 100
(Harmonoise) vehicle
The number of times this
by reroute number # 0 10
vehicle has bee rerouted
(3)道路/车道 可视化设置
车道着色模式和边界
Name Measure Min Value Max Value Description
all edges are drawn using
uniform - - -
the same color
selected lanes are drawn
by selection
- - - different than those that are
(lane-/streetwise)
not
by allowed speed The maximum velocity
m/s 0 150km/h
(lanewise) allowed on this lane
by current %/ By the amount of place
0 .95
density (lanewise) 100 that is covered by vehicles
by first vehicle
By the time the first
waiting time s 0 200
vehicle on the lane waits
(lanewise)
by lane number By the number of lanes
- 0 5
(streetwise) this edge has
The mean amount of
by CO2 emissions
g/s 0 .267 CO2 emitted per a lane's
(HBEFA)
meter
by CO emissions The mean amount of CO
g/s 0 0.0033
(HBEFA) emitted per a lane's meter
The mean amount of
by PMx .00001
g/s 0 PMx emitted per a lane's
emissions (HBEFA) 3
meter
The mean amount of
by NOx
g/s 0 0.0033 NOx emitted per a lane's
emissions (HBEFA)
meter
by HC emissions The mean amount of HC
g/s 0 .00006
(HBEFA) emitted per a lane's meter
The mean amount of
by fuel
l/s 0 .067 consumed fuel per a lane's
consumption (HBEFA)
meter

8.10.3.在 GUISIM 中使用贴图(背景图片)

为了修饰一下仿真程序的界面,你可以把贴图载入到GUISIM中。你可以使用 打开可
视化设置,选择背景也没,你会看到一个表格,各列为:picture file, center x, center y, width,
height, and rotation.
单击第一列"picture file",并输入完整的图片文件路径。按“TETURN”确定,这将是GUISIM
在路网之下载入并显示图片文件,如下图:
目前,GUISIM可以使用的图片格式有:gif,bmp。谨记:图象的长宽必须满足2的x方。
这就是说图象的宽必须是2,4,8,16,32,64。 。。像素,长也同样如此,这个限制来源于openGL。
从sumo0.10.0(确切的说是svn版7073)后,guisim自适应图象到最接近的值,而且支持更多的
图象格式,包括pcx,ico。tga,png,jpg,tif格式的支持与否取决于你的fox。很可能在Linux,unix
平台上是支持的,但在windows下的vs编译环境则不支持。关于更多信息,请参考fox源码包
的install文件。
现在可以使用center x, center y, width, height, and rotation来定位、伸缩、旋转图象。对
齐图象后,你可以使用"Save Decals"按钮保存当前设置,并在以后使用"Load Decals"按钮来
再次使用该配置。

8.10.4.配置文件

GUISIM使用与SUMO相同的配置文件,可以使用sumo –help命令获得相关选项,使用
sumo –save-template <file> --save-comented命令保存配置文件。GUISIM有专门的选项
gui-settings-file,这使得你可以载入先前保存的gui-settings文件。获得gui-settings文件的最简

单方法是view设置对话框 .,简单修改设置并保存 .。

记着,这种方法获得的gui-settings文件不包含视图接口的信息(zoom 和offset)。如果你
想包含这部分信息到你的gui-settings文件,你必须手工编辑。如下:

example.sumo.cfg
<configuration>
<net-file value="yournetwork.net.xml"/>
<gui-settings-file value="gui-settings.cfg"/>
</configuration>

gui-settings.cfg

<viewsettings>
<scheme name="...
...
</scheme>
<viewport zoom="200" x="100" y="-100"/>
</viewsettings>

9.SUMO 输出
SUMO有很多的可用输出,下面列出这些可用输出,并按主题或聚合类型分组。关于每
个输出的进一步信息可以在下面的连接里找到。
1)基于车辆的信息,不是固定不变的
•raw vehicle positions dump:随时间而变的所有的车辆位置
包括:所有仿真时间步的所有车辆的位置和速度
用于:获取节点的移动
•车辆类型调查(探索):对于某些车辆类型(或全部车辆),随时间而变的车辆位置信息
2)仿真的探测器
•e1-detectors: 仿真的感应线圈
•e2-detectors: 区域探测器,仿真的车辆追踪摄像头
•e3-detectors: 仿真的进口/出口探测器
3)街道或车道的值
•edgelane traffic: 基于街道/车道的路网性能度量
• edgelane hbefa: 基于街道/车道的车辆污染物排放(vehicular pollutant emission);基
于HBEFA数据库
•edgelane harmonoise基于街道/车道的车辆噪声排放,基于 Harmonoise
4)基于车辆的信息
•旅程信息:每个车辆行程的汇总信息
•车辆路径信息:仿真全过程的每个车辆的路径信息
5)基于仿真(路网)的信息
•排放量统计:关于当前的仿真状态的信息
6)基于交通灯的信息
•交通灯状态:关于交通灯状态的信息
•基于流交通灯切换:关于负责某一连接的交通灯信号切换的信息
•经切换后的交通灯状态:关于交通灯信号状态的信息,仅在有变化时重写(刷新)
存储
•藕接至交通灯系统的区域探测器:被交通灯系统约束的,仿真的车辆跟踪摄像头

9.1.车辆发射器状态

在SUMO的配置文件中加入:
<output>
<emissions-output value="emissions.xml"/>
</output>

9.2.感应线圈输出

在additional.xml文件中加入:
<sumo-detectors>
<detector id="1si_0" lane="1si_0" pos="200" freq="1" file="detector.xml"/>
<detector id="1si_1" lane="1si_1" pos="200" freq="1" file="detector.xml"/>
<detector id="1si_2" lane="1si_2" pos="200" freq="1" file="detector.xml"/>
</sumo-detectors>

输出文档detector.xml的内容大致如下:
<detector>
<interval begin="0.00" end="1.00" id="1si_0" nVehContrib="0" flow="0.00" occupancy="0.00"
speed="-1.00" length="-1.00" nVehEntered="0"/>
<interval begin="0.00" end="1.00" id="1si_1" nVehContrib="0" flow="0.00" occupancy="0.00"
speed="-1.00" length="-1.00" nVehEntered="0"/>
<interval begin="0.00" end="1.00" id="1si_2" nVehContrib="0" flow="0.00" occupancy="0.00"
speed="-1.00" length="-1.00" nVehEntered="0"/>
<interval begin="0.00" end="1.00" id="2si_0" nVehContrib="0" flow="0.00" occupancy="0.00"
speed="-1.00" length="-1.00" nVehEntered="0"/>
<detector>

9.3.道路性能均值

在SUMO的配置文件的<input>范围内输入:
<additional-files value="input_additional.add.xml"/>,在additional.xml文件中加入:
<add>
<meandata-edge id="dump_60" freq="60" file="edge_aggregated_60.xml"/>
<meandata-edge id="dump_300" freq="300" file=" edge_aggregated_300.xml"/>
<meandata-edge id="dump_900" freq="900" file=" edge _aggregated_900.xml"/>
</add>
对每条街道输出内容包括:该时段内的总采样时长(秒),平均旅行时间(秒),道路密度(辆
/(Km车道),道路阻塞密度一般位于115—155辆/Km范围内),道路占用率(按时间算,即在特
定地点,单位时间内通过车辆所用时间占总时间的百分比,或者表述为:观测期间所有车辆
在该路段上的占用时间与总观测时间的百分比率),等待时间(秒),平均速度(m/s),出发时
间,到达时间,进入车辆数,离开车辆数,从该道路变道出去的车辆数,变道进入该道路的
车辆数(在车道性能中才有意义)。

9.4.受约束的道路性能均值

在SUMO的配置文件的<input>范围内输入:
<additional-files value="input_additional.add.xml"/>,在additional.xml文件中
加入:
<add>
<meandata-edge id="dump_15" freq="15" file="aggregated_15.xml" begin="0" end="119"/>
<meandata-edge id="dump_60" freq="60" file="aggregated_60.xml" begin="0" end="119"/>
<meandata-edge id="dump_300" freq="300" file="aggregated_300.xml" begin="0" end="119"/>
<meandata-edge id="dump_900" freq="900" file="aggregated_900.xml" begin="0" end="119"/>

<meandata-edge id="dump_15" freq="15" file="aggregated_15.xml" begin="900" end="1019"/>


<meandata-edge id="dump_60" freq="60" file="aggregated_60.xml" begin="900" end="1019"/>
<meandata-edge id="dump_300" freq="300" file="aggregated_300.xml" begin="900" end="1019"/>
<meandata-edge id="dump_900" freq="900" file="aggregated_900.xml" begin="900" end="1019"/>
</add>
与道路性能均值的不同处是:添加了时间段约束,即只输出该时间段的道路性能数据。

9.5.车道性能均值

在additional.xml文件中加入:
<add>
<meandata-lane id="dump_60" freq="60" file="aggregated_60.xml"/>
<meandata-lane id="dump_300" freq="300" file="aggregated_300.xml"/>
<meandata-lane id="dump_900" freq="900" file="aggregated_900.xml"/>
</add>
这与道路性能均值类似,但具体到了每条车道。

9.6.路网最原始数据输出

在SUMO的配置文件中加入:
<output>
<netstate-dump value="rawdump.xml"/>
</output>
该功能输出整个路网的所有相关数据,即记录在每个仿真时间步,每条车道上的车辆的位
置和速度。

9.7.旅程信息输出

在SUMO的配置文件中加入:
<output>
<tripinfo-output value="tripinfos.xml"/>
</output>

9.8.车辆路径输出

在SUMO的配置文件中加入:
<output>
<vehroute-output value="vehroutes.xml"/>
</output>

9.9.车辆类型调查

在additional.xml文件中加入:
<additional>
<vtypeprobe id="test1" type="SUMO_DEFAULT_TYPE" freq="10" file="vtypeprobe.xml"/>
</additional>

10.TraCI

10.1.TraCI 简介

P106-

10.2.仿真步骤

P112-113

跟驰车辆在下一时间步的速度与以下因素相关:a)前方车辆 b)左方车道车辆 c)接近路


口时的右向规则 d)接近车道的速度限制
与前车交互影响
1)
11.选择研究主题的一些建议
第 113 页

11.1.车辆重新选择路径

11.1.1.基本描述

11.1.2.应该记住的事情

11.2.在线交通仿真

这个任务正在进行中

11.3.基于 GSM 的监视

11.3.1.怎样使用 GSM 跟踪车辆

11.3.2.SUMO在在线交通中的使用

11.4.开发自己的跟车模型

http://sourceforge.net/apps/mediawiki/sumo/index.php?title=VariableCarModel
警告:这只是一个工作文档

11.4.1.实现新的跟车模型

11.4.1.1.模型实现

SUMO平台的跟车模型是对抽象类MSCFModel的一个实现,下表列出了该类的接口:
方法 描述
SUMOReal moveHelper(MSVehicle * Adapts the vehicle's speed to its
const veh, const MSLane * const stops, and to the influence of
lane, SUMOReal vPos) lane-changing; sets the information
about the vehicle's acceleration
needed for emissions computation
SUMOReal ffeV(const MSVehicle *
const veh, SUMOReal speed,
SUMOReal gap2pred, SUMOReal
predSpeed) Returns the velocity of the vehicle in
SUMOReal ffeV(const MSVehicle * dependence to the vehicle's and its
const veh, SUMOReal gap2pred, leader's values and the distance
SUMOReal predSpeed) between them.
SUMOReal ffeV(const MSVehicle *
const veh, const MSVehicle *
const pred)
Returns the velocity of the vehicle
SUMOReal ffeS(const MSVehicle * when approaching a static object (such
const veh, SUMOReal gap2pred) as the end of a lane) assuming no
reaction time is needed.
Returns the maximum gap at which an
SUMOReal interactionGap(const interaction between both vehicles
MSVehicle * const , SUMOReal vL) occurs; "interaction" means that the
LEADER influences EGO's speed.
Returns whether the given gap is safe;
bool hasSafeGap(SUMOReal speed,
"safe" means that no collision occur
SUMOReal gap, SUMOReal
when using the gap, given other values.
predSpeed, SUMOReal
Note:
laneMaxSpeed)
Dismissed on 21.07.2010
Get the vehicle's maximum acceleration
[m/s^2]; As some models describe that
SUMOReal getMaxAccel(SUMOReal
a vehicle is accelerating slower the
v)
higher its speed is, the velocity is
given.
Returns the model's ID; the XML-Tag
int getModelID()
number is used
Method Description
SUMOReal getTau() Get the driver's reaction time [s]
Method Description
Incorporates the influence of the
void leftVehicleVsafe(const
vehicle on the left lane; in Germany
MSVehicle * const ego, const
vehicles on the right lane must not pass
MSVehicle * const neigh,
a vehicle on the lane left to the if the
SUMOReal &vSafe)
allowed velocity>60km/h
SUMOReal maxNextSpeed(SUMOReal Returns the maximum speed given the
speed) current speed; Due to air brake or other
influences, the vehicle's next maximum
speed may depend on the vehicle's
current speed (given).
Get the vehicle's maximum deceleration
SUMOReal getMaxDecel()
[m/s^2]
Returns the distance the vehicle needs
SUMOReal brakeGap(SUMOReal
to halt including driver's reaction
speed)
time
SUMOReal getSecureGap(const
Returns the minimum gap to reserve if
SUMOReal speed, const SUMOReal
the leader is braking at maximum
leaderSpeedAfterDecel)
SUMOReal
Returns the velocity after maximum
getSpeedAfterMaxDecel(SUMOReal
deceleration
v)

11.4.1.2.模型嵌入

(1)从XML文件读取参数
非常笨拙的方法,你必须:
1:在src\utils\common\SUMOVehicleClass.h文件中定义XML元素的名字;你应该寻找其他
已存在的定义,例如“Krauss”或“IDM”,然后决定你应该怎么做。
2:在src\utils\xml\SUMOXMLDefinitions.h和 src\utils\xml\SUMOXMLDefinitions.cpp文件
中添加"名字"到"整型值"的映射,以使XML解析器知道它们;需找SUMO_TAG_CF_KRAUSS作
为例子参考。
3:当在src\utils\common\SUMOVTypeParameter.cpp里的write方法里面写入车辆类型时
添加它们(XML元素名字);你同样应寻找SUMO_TAG_CF_KRAUSS作为例子参考。
4:在src\utils\xml\SUMOVehicleParserHelper.cpp::parseVTypeEmbedded里面添加一个对属
性解析方法的调用;该方法会像这样命名:parseVTypeEmbedded_<MODELNAME>。
5:使用模板再次实现该方法。
现在这个定义被读取并且被重写,例如在routers。小小建议:也许,你仅需要寻找一个
特定的名字唯一的跟车模型(例如IDM),然后让你的模型做完该特定模型所做的一切。
(2)实例化模型实例
src\microsim\MSVehicleType::build方法执行构建行为,除了调用构造函数,给出存储在
地图中的值,你还需包含你的模型实现的头文件(这里按字母顺序排列)

11.4.2.定义车辆类型

开始之前,我们应确定怎样刻画车辆类型。一些需注意的事实(未排序):
(OK)仿真和路由模块都必须能够解析车辆类型定义
最好可以根据XML模式进行验证
至少应定义两个子类型:跟车模型和车道变换模型(车道变换模型可能会分为导航和战
术两部分)
(OK)参数应该有默认值
(OK)必须存在默认车辆类型
靠参数设置来区分不同模型

11.4.2.1.可能的描述

序号 例子 正方/反方说辞
• (-) hard to verify - parameter change
<vtype cfModel="xxx" xxxParam1="..." in dependence to the value of
A
xxxParam2="..." "cfModel"

• (-) large number of different


<vtype-XXX xxxParam1="..."
B elements needed
xxxParam2="..."

• (+) straight forward; many


combinations possible
• (+) is similar to how every vehicle
<cfmodel id="#id" model="xxx"
references its vtype
C param1="..." param2="..." .../><vtype
• (-) hard to verify - parameter change
cfModelId="#id" .../>
in dependence to the value of
"cfModel"

• (--) parameter sets differ


between models
<vtype cfModel="xxx" • (-) hard to verify - parameter
D
param1="..." param2="..."> change in dependence to the
value of "cfModel"

• (+) straight forward


• (-) hard to verify - parameter
<vtype ...><cfmodel model="xxx" change in dependence to the
E
param1="..." param2="..." .../></vtype> value of "cfModel"
• 1 vote (Mayer)

• (+) straight forward


• (-) large number of different
<vtype ...><cfmodel-XXX model="xxx" elements needed
F
param1="..." param2="..." .../></vtype> • 2 votes (Behrisch,
Krajzewicz)
11.4.2.2.(目前)选择的描述

经过讨论,我们选择了以下的车辆类型描述:

<vtype id="..." ...>


<carFollowing-Krauss ...
<laneChanging-DK2002 ...
</vtype>
vtype还将包含那些既不作为车道变换模型也不作为车辆跟驰模型的参数,例如车辆类
型的颜色,车辆宽度等。目前仅用于可视化方面。而且车辆长度和其他参数不仅仅被这里的
模型所使用。
上述代码片段中的" carFollowing-Krauss "元素描述了车辆跟驰模型(这里是
Krauss模型)," laneChanging-DK2002"元素描述了车道变换模型(Daniel Krajzewicz's from
2002),每个模型都有自己的参数。
已知的vtype定义被保留下来,这样默认情况下Krauss模型仍可选择它。
注意:也许不太可能通过模式来验证这些内容。

11.4.3.跟车模型接口

目前,我们假定每个模型都需要重新实现以下方法;"通用"(generic)列表明在不同模型
中它们是一样的。
方法 是否通用 描述
ffeV no
ffeS no
maxNextSpeed no internal SUMO-tweak
should depend on maximum deceleration (a
brakeGap maybe
rather common value) and physics, only
almost same as brakeGap, only not
approachingBrakeGap maybe
incorporating the driver's reaction time
interactionGap no
hasSafeGap no
safeEmitGap no
dawdle no
decelAbility rather no
11.4.3.1.载入和解析车辆类型

当已实现车辆(类型)时,包含车辆类型描述的新的中间结构
<SUMO_HOME>/src/utils/common/SUMOVTypeParameter已被添加了。当读取XML定义时,路
由程序和仿真程序都使用<SUMO_HOME>/src/utils/xml/SUMOVehicleParserHelper的助手方法
的额外实现来填充这些结构。
SUMOVTypeParameter拥有成员变量,这些成员变量是车辆类型参数,但既不属于跟车
模型的参数,也不属于车道变换模型的参数,例如:id, length, maxSpeed, defaultProbability,
speedFactor, speedDev, emissionClass, color, vehicleClass, width, offset, shape。这些值使用默认
值初始化。当读取这些值时,SUMOVehicleParserHelper存储都设置了哪些值的信息,这些信
息来自于SUMOVTypeParameter::setParameter中的XML描述。这允许通过当把定义写进文件时
设置的值来保存,路由程序需要这么做。
车辆跟驰模型的参数被设置在映射中:SUMOVTypeParameter::cfParameter,作为
SUMOVTypeParameter::cfModel的模型名字。注意,并未实现车辆变换模型的参数处理,映
射中仅包含读取的XML文件中给出的模型参数,而且未插入默认值。为了处理旧的车辆类型
定义,对Krauss跟车模型来说,保存在vtype元素中的参数也被保存在该映射中。
路由程序假定SUMOVTypeParameter类无需直接生成ROVehicleType。仿真程序使用新方
法MSVehicleType::build来创建已描述的MSVehicleType/MSCFModel的结合体。为获得完整
的车辆类型/模型 描述,这个方法设置了(之前丢失的)默认值。

11.4.4.重新进行微观仿真

步骤1:除去批判的/未批判的移除方法
dkrajzew:"未批判"车辆指没有和它们的下一个交叉口相互作用的车辆。目前,它们被
首先移除,被车辆使用的所有车道都被访问过,车道上的最后一个车辆的状态(位置和速度)
被保存下来。这是需要的,因为总是随机地访问车道,但跟车模型需要前导车的位置和速度
(在更新之前的)。
现在,我希望移除车道上的这些迭代,因为:a)仿真会运行得更快。b)成倍减少代码
我的意图是保存最后车辆的两个状态。首先存储在当前仿真步中车道被接触前的车辆状
态,然后存储接触后的车辆状态。另外,当前仿真步保存在车道中,最为最后变化的"访问"
时间。
当请求该状态时,会给出当前仿真时间,之后就很容易知道应该使用哪个存储值,如果
给出的时间比访问时间大就使用旧值( the old one)。这个变化会使得非批判方法过时。
Tobias Mayer:这看起来合情合理,但是仍需要区分与交叉口交互和未与交叉口交互的
车辆。
步骤2:保存车辆的结束(状态)
dkrajzew:目前,车辆仅被放置到前方为"on"的车道上。为决定车辆与车道开始处重叠
了多少需要做几次调整。我希望保存车辆的第一个和最后一个车道,将会减少
moveCriticalCont中的计算量,并解决一些问题(主要是车道变换中的问题)。另外,这有利于
可视化。
Tobias Mayer:参考Christoph的评论(保持一张所有当前接触车道的列表)
步骤3:改变交通规则
dkrajzew:这是迈向亚秒级仿真的主要步骤。目前,被允许靠近道路交叉口的车辆知道
自己的目的地。然后交叉口决定哪些车辆可以通行,接着被允许通行的车辆就可以通过交叉
口。
现在,我还没有解决办法的问题是:每个车辆必须为它打算通过的交叉口决定是否必需
等待。多数情况下,这依赖于其它车辆是否接近交叉口。目前这个问题已象上面阐述的那样
解决了。但又有新的因素需对它做出改变:a)加快仿真速度。b)交叉口的重复访问和更多
现实行为。
我最初的想法是保存每个车辆到达交叉口的时间和在交叉口处的速度。之后车辆就可以
知道下次拥有高优先权的车辆是否将通过交叉口。我仍然不确定看到车辆的随机顺序有副作
用。
Tobias Mayer:我也认为怎么接近交叉口的决定应该留给车辆/司机,因为交叉口仅处理
"规则"。然后车辆可以决定自己的规则。因为速度原因,这需要与所有与之相关的车辆共享
(最好的方法是把它添加到交叉口列表中的每一个车辆中)。关于车辆注册的随机性:应该不
考虑任何其他车辆来计算规则值,并且是一个纯数值类型。当然每个仿真步都要计算,因为
车速的变化不可预知,但会产生影响。

11.4.5.新模型开发案例

1:在sumo/microsim/cfmodels/目录下实现新的跟车模型
2:在sumo/utils/common/SUMOVehicleClass.h中,定义有默认跟车模型,默认变道模型
等,也定义着模型的XML元素的名字。请参考“Krauss”,定义你的新模型的XML名字。
3:在sumo/utils/xml/目录下的SUMOXMLDefinitions.h和SUMOXMLDefinitions.cpp中,定
义名字到值的映射,可以把SUMO_TAG_CF_KRAUSS作为参考例子。
4:当在sumo/utils/common/SUMOVTypeParameter::write里面写入车辆类型时添加它们
(XML元素名字);你同样应寻找SUMO_TAG_CF_KRAUSS作为例子参考。
5:在sumo/utils/XML/SUMOVehicleParserHelper::parseVTypeEmbedded里面添加一个对属
性解析方法的调用;该方法会像这样命名:parseVTypeEmbedded_<MODELNAME>。
6:使用模板实现该解析方法。
现在这个定义被读取并且被重写,例如在routers。小小建议:也许,你仅需要寻找一个
特定的名字唯一的跟车模型(例如IDM),然后让你的模型做完该特定模型所做的一切。
7:实例化模型实例
在sumo/microsim/MSVehicleType::build方法执行构建行为,除了调用构造函数,给出存
储在映射中的值,你还需包含你的模型实现的头文件(这里按字母顺序排列)
8:默认的跟车模型在该路径下设置:src\utils\common\SUMOVehicleClass.h

12.附录 A

12.1.词汇表

第117页
induction loops:感应线圈
off- and on-ramps:出入口匝道
time step:时间步,仿真步
right of way rules:交通规则
left-hand traffic:靠左行驶的交通(交通规则)
同步流: 另一种处理方法是把突然慢下来的车流状态比作自然界中发生的
相变,例如,汽变水或水变冰.在往来车辆不多的情形,驾车人可以随意开车.当
道路变得拥挤时,驾车人会突然发现他们正被带进以共同的速度前进而且经常是
无法改换车道的车流中去随波逐流.这种称为“同步”流的中间相态更像流体.当交
通流经由瞬间发生的转移进入停停走走的状态时,汽车就像结晶成冰的水的质
点。
Boris Kerner发现从畅通到同步流动可能几乎是同时发生的----比科学家先前
设想的要快得多.这种现象常常发生在坡道附近,当突然出现许多车辆进入该坡
道时,就由可能造成交通流定形为一个单一移动的整体.这种呆滞的状态可以来
来回回地在道路上传播,在坡道畅通之后还会保持很久,或许会长达几小时之久。
上下班交通:
车道占用率:指在某一瞬间,已知路段上所有车辆的长度总和和与该路段长
度之比值,或者说,观测期间所有车辆在该路段上的占用时间与总观测时间的百
分比率。根据车道占用率的定义知, 道路空间占有率与车流密度的关系为:

式中,O为车道占有率;L为车辆平均长度,m;K为车流密度,辆/Km。

12.2.常见问题

12.2.1.综述性方面

(1)SUMO 是什么?
答:SUMO 是交通仿真软件包,就是说它可以用来仿真城市规模的交通网络,当然,你也可
以用它来仿真更小或者更大的路网(如果你的计算机性能足够强大)。
(2)“SUMO”代表什么意思?
答:“SUMO”是“Simulation of Urban MObility”(城市机动车流仿真)的简写。
(3)SUMO 属于什么交通类型的仿真?
答:SUMO 是微观的、空间连续的道路交通仿真,以后会扩展到多模型。

12.2.2.软件特性方面

(1)SUMO 支持交叉口交通仿真吗?
答:是的,从 0.9.5 版本之后,SUMO 开始支持平交路口交通(inner-junction)
(2)可以把 SUMO 连接到外部应用程序吗(例如:NS-2)
答:有几种方法来连接,详情参考:
http://sumo.sourceforge.net/wiki/index.php/Main_Page#Related_to_C2C
(3)SUMO 可以仿真左手交通吗?(即靠左行驶的交通)
答:不可以
(4)将来打算支持左手交通仿真吗?
答:我们会支持任何有这个想法的人来实现,但我们并不特别关注左手交通,我们自己也没
有这个能力来实现。
(5)SUMO 可以生成运动轨迹吗?
答:大多数的 C2C 扩展应用有这个功能,请参考:
http://sumo.sourceforge.net/wiki/index.php/Main_Page#Related_to_C2C

12.2.3.构建和安装方面

(1)怎么连接到 Subversion 代码库?


答:各平台都有许多可用的 Subversion 客户端,如果你使用命令行客户端,你可以使用如下
命令检出 SUMO 代码:
svn co https://sumo.svn.sourceforge.net/svnroot/sumo/trunk/sumo
SUMO 目录(已经创建)下的后续更新,可以简单键入:svn up
(2)怎么检出修订版 5499(或任何其它已过时的版本)?
答:可以在使用命令行检出时同时使用 SVN 选项“-r <revision_number>” 。如果你使用图形
用户接口的客户端,请参考用户文档。请注意我们对旧版本仅提供有限支持。
(3)SUMO 都支持什么平台?
答:我们定期在 windows XP 平台使用 Visual Studio 2005(aka MSVC8)编译,日常的编译工作
在 Linux 平台完成(openSUSE 10.3 和 11.1 ,使用 gcc4)。如果能听到在其它平台编译成功的
消息,我们将十分荣幸。我们已经听说在 MacOS X,Solaris,Cygwin 平台成功编译了非 GUI
版本。
(4)故障处理
答:参考 LinuxBuild or WindowsBuild. 章节(2.6.2 节)

12.2.4.基本使用方面

(1)如何在 SUMO 里设置交通灯参数?可以不使用 TRACI 程序来实现吗,如果可以,我要


修改那个源文件?
答:MSVehicle.h 文件中的函数可以用来仿真 TraCI 减速:
bool startSpeedAdaption(float newSpeed, SUMOTime duration, SUMOTime currentTime);
void adaptSpeed();
我在这里省略了从车辆到交通灯间的路长;。。 。
(2)系统都使用了哪些度量值?
答:所有的时间值单位为秒,所有长度值单位为米。这就是说速度值以 m/s 给出等。目前,
每个仿真步长为 1 秒(也就是说:每个仿真步仿真了真实世界的 1 秒时长)
(3)下面的错误是什么意思?
Warning: No types defined, using defaults...
Error: An exception occurred!
Type:RuntimeException,
Message:The primary document entity could not be opened. Id=<PATH>
Error: (At line/column 1/0).
Error: Quitting (conversion failed).
答:简单地说,是你使用<PATH>指定的文件不存在,这是 Xerces 的文件未找到所给出的错
误方式。

12.2.5.关于 NETCONVERT

(1)构建路网时分段错误(Segmentation Fault)
答:在Ubuntu Linux下,在第12步" Computing node shapes "时给出这个错误, NETCONVERT
终止。可能是因为GDAL库的不完整版本(broken version),你可能必须安装你自己的GDAL库,
或者构建不支持GDAL的版本
(2)有其它可用的自由路网吗?
答:事实上,我们并没有花费很多精力寻找开源路网。参考下以下链接以寻找进一步的
信息,我们目前仅知道这些:
http://sumo.sourceforge.net/docs/gen/sumo_moreon_arcview.shtml
(3)运行一会后应用挂起了(大多数时间是缺少内存,windows 平台下)
答:这可能是因为你使用了在调试模式下编译的程序,这种情况的内存消耗是正常情况
下的至少3倍。你可以使用正常编译版本:Release-mode(或者买内存)
(4)NETCONVERT 在第 12 步(Computing node shapes)终止了
答:请检查你是否使用了地理坐标,如果是,试着使用选项—proj.utm进行转换(对UTM
工程,最经常使用的就是这个了),或者使用选项—proj.dhdn(对一些旧的德国数据适用),或
者如果你熟悉proj工具,请使用参数—proj <PROJ_DEF> 正确定义映射

12.2.6.关于仿真方面

(1)怎么仿真交通事故?
答:目前,有两种可能的方法来仿真事故及类似情况:
·使车辆停在车道上一定时间,参考:
http://sumo.sourceforge.net/docs/gen/user_chp06.shtml#user_chp06-management-pub
lic,这种方式工作得非常好。
·在事故发生的地方(车道上)放置可变速度标志,以减小车速,参考:
http://sumo.sourceforge.net/docs/gen/user_chp06.shtml#user_chp06-management
-vss。这种方法会减小车道的交通量,但是未来的动态会不符合你所期望的事故动态。
·以上两种方法结合:在线仿真中,我们让车辆停在车道上,以减小其他车道车速,来
仿真交通事故。
(2)我改变路网,SUMO 就不能载入它了
答:事实上,SUMO网络不希望手工编辑。你必须正确输入并描述所有信息,让NETCONVER构
建你的路网。手工编辑很复杂,而且错误百出。
(3)没有出现车辆
答:我们再如下情况也遇到这种问题:当我们导入以km/h为单位给出最大车速的路网时,而
不是所期望的m/s。因为对即将到来的交通需要很大的空间,不会有车辆射入路网。请检查
你的路网描述里是否也使用了km/h,如果是的话请使用SUMO NETCONVERT -switch
"speed-in-kmh" 重新计算受限速度。
(4)车辆向后行驶:当我视图评估车辆排放时,偶尔车辆会出现向后跳跃(其位置比上一时
间步小)
答:为了避免因不当的车道变换行为导致拥堵,车辆可能交换它们的车道。这种情况下,每
个车辆获得其他车辆的位置和速度。因为车辆位置可能有少许不同,故车辆看起来像是向后
行驶了。从0.8版本之后不会再出现这种现象。
(5)怎么改变周期和相位的持续时间?
答:如果你的路网中有交通灯,你可以用文本编辑器打开路网文件。然后查找"tl-logic",这
样你可以找到交通灯的定义。现在你可以看到:在每个交通灯定义内部有"phase"定义的集
合。你可以在这之间修改相位时间。
可以参考交通灯部分文档,8.5节
(6)在我的仿真中看不到一辆车
答:可能有两个原因:
1:如果你的仿真区域太大,除非你在路网中放大该区域,否则无法显示车辆。这时因
为当车辆的可是大小大于1像素时才被显示。为了提高可视化速度,我们避免画出所有街道
和车辆,这导致车辆有时不可见。你可以单击guisim的彩色圆轮图标,选择"vehicles"面板,
更改要显示的最小值为零。
2:仿真太快了,在车辆出现前就已经消失了。为避免出现这种情况,你可以增加"Delay"
值,这使得在仿真步之间等待一会。
(7)不同的时间步长,会出现不同的出发时间
答:车辆随时间步长的减少进入路网。这个行为的出现是因为车辆在时间步的末端进入
路网。对于一秒的步长,意味着离开时间为0的车辆会在时间步0到1的末端被插入路网,即
在接近1秒时被插入路网(0.999..)。如果使用0.1秒的步长,相同车辆在时间步0到0.1的末端被
插入路网,即在接近0.1秒时。
(8)保存仿真状态以后再处理(或以不同方式处理)
答:目前(0.12版),SUMO不提供保存完整仿真状态,并在以后处理;或者保存几次最终
结果不同的仿真。
一个可能的变通方案是:在虚拟机里面运行SUMO程序,而虚拟机的状态任何时间都可
保存。在Linux平台的virtualBox下进行测试表明:如果给虚拟机分配足够的硬件资源(例如,
如果你同步运行另一个程序并通过TraCI 与SUMO通信,则你应该给虚拟机分配足够的CPU核
心),SUMO的运行速度不会明显变慢。

12.2.7.关于可视化

(1)GUISIM终止运行
答:有时GUISIM无故终止,多数情况下使用更新的opengl-driver可以解决问题
(2)光标所在区域出现闪烁(Windows平台)
答:没有Windows版本可以缓存鼠标所在区域以应用鼠标阴影。为了避免这个问题,请在系
统属性里禁用鼠标阴影,这是目前唯一解决方案。
(3)载入jpeg/png图片失败
答:目前,0.9.7版本不支持载入jpeg/png格式图片,随后会加入。
(4)出现了GUISIM的窗口和按钮,但没有路网和车辆
答:你一定遇到了openGL问题。
12.2.8.XML 模式定义

12.3.关于 SUMO 整体性的描述

第127页

13.附录 B
本章主要介绍 OSM 地图编辑工具 JSOM 软件的使用方法,当然你也可以不使用编辑工
具而直接在线编辑。OSM 地图的网站地址是:http://www.openstreetmap.org/

13.1.JOSM 入门

13.1.1.基本概念

结点(node):就是一个点
路线(ways):就是连接多个节点的线,这意味着地图中的“道路”不仅仅是现实中的道路,
而是一系列相连结点的通项。
关系:就是道路和结点的有序序列,一个成组元素的逻辑容器
区域:就是首尾相连的道路,其他并未明确

如果道路或轨迹(track)呈曲线状,则使用道路上的一系列结点来逼近,并使用短线连接
它们。道路拥有方向,这对一些“标签”很有意义,例如:"oneway=yes"表明仅沿图上画的
方向前进。其它标签涉及在左边和右边,沿道路的前进方向。

13.1.2.在 JOSM 中编辑地图

JOSM 是一个离线编辑器,它允许你试用、重复移动,标记,添加和删除元素而无需打
断任何事。在一个单一元素上的一系列子行为在上传至服务器时会变为单一修改行为。
真正编辑地图的第一步是往 OSM 数据中添加一个结点,该结点处是一个交叉口或者其
在方向上有重大变化。通过单击左侧边栏的第二个按钮或者敲击“A”键使得结点按钮呈高
亮状态。在 GPS 轨迹上移动光标,然后在你希望放置结点的位置单击鼠标,将会出现一个
已被选择的白点,并且会出现一条从该点到光标的延伸线。当创建了后继结点后,之前的点
变为黄色。一系列相连的结点构成了道路。
道路本身没多大意义,除非标明了它代表什么。“地图属性”列出了所有针对道路的目
前可用的键值对。请确认 JOSM 右侧的“属性”面板是打开的,这时左侧边栏的第七个按钮
应呈高亮状态,单击之可关闭属性面板,再次单击可以打开(快捷键为 Alt+shift+P)。属性面
板有三个按钮:加入、编辑、删除。
编辑属性作用于所有当前选择的对象,例如:高亮态的元素(结点和道路)。选择任何东
西必须处在选择模式下,这可以通过单击左侧边栏的第一个按钮来实现(或者单击“S”键)。
确认你新建的道路处于被选择的高亮态,然后单击“属性”面板“加入”按钮,将会出现一
个对话框,你可以选择一个键值对。键入一个代表当前你创建道路属性的键值对,例如:键
取为“highway”,值取为“secondary”
,然后单击“确定”
,你就标记了道路属性。

13.1.3.上传地图到 OSM 服务器

如果编辑好了地图,你可以单击按钮 来上传至服务器。JOSM 会给出将要上传内容


的概览,还要求你提供本次编辑的简短评述。这些描述和你的数据一起被存储在 JOSM 服务
器,为最近更新列表之类的应用提供服务。
单击“上传更新”按钮,你的数据得到上传,并且所有人都会看到。
惯例:
1)双向道路将被画成两条分开的、并行的道路因为每条道路都是不同的。
2)对于单向的街道(包括从双向道路中分裂出来的单独道路),应沿旅行的方向绘制。
3)键值对标签对大小写敏感,所有的键应使用小写字母。

13.1.4.How Tos

(1)选择共享通用结点的道路
多数情况下,两条或多条道路会共享一组结点。但使用“选择”工具你仅能选择一条道
路。
简单的方法:直接按住 CTRL 键,然后用鼠标左键选择所需元素。如果按住 ALT 键,再
用鼠标选择,则是二选一的操作(一次只能选一条道路)。

(2)怎样扩展道路
使用“选择”工具(S 键),选择已有道路的末尾,然后使用“绘制结点”工具(A 键)绘制
新的结点,这将自动扩展此道路。修改后的道路包括原有道路加上新加入的元素,如果你给
它命名或者添加属性,则扩展后的道路就拥有这些属性。

(3)怎样给道路添加结点
使用“绘制结点”工具,在道路上移动十字箭头至你希望添加结点的位置,这将会高亮
显示。然后在道路上单击此处,新结点将被添加。“绘制结点”工具等待你给新建道路添加
更多的结点。单击“ESC”键以结束对新道路的绘制。现在你已经向已有道路添加了一个新
结点。

(4)怎样把普通交叉口改为环状交叉口
其他人绘制了交叉口,但你更了解情况,需要把它改为环状交叉口。如果这是一个小的
交叉口,可以添加标签 highway=mini_roundabout 就可以实现。否则就做如下处理:
·绘制一条线,大约等于环状交叉口的直径。
·选择该线条,使用“工具”—>“创建圆形”

·如果你觉得这不够圆,就添加更多的结点,之后使用“工具”->“将结点
排成圆”。
·把该圆形移动至交叉口上面
·你还可以在选择模式下按住 CTRL+SHIFT 键来旋转该圆形。
下面我们开始肢解路口:
·选择中心结点,按“G”键分离它(“工具”->“分离路径”)。
·单击空白区域以取消选择。再次选择中心结点(其实现在是两个重叠的点)
并稍微移动一点,现在两条道路已经分开了。

·选择这两个结点之一,并按“P”键(“工具”->“切割路径”),再次选择
相同结点,分离它(快捷键 G),重新选择它并稍微移动一点。
·对另一条道路进行同样的操作,之后你会得到四个未受约束的终点。

·移动这点终点,逼近到它们应固定在圆形的位置。

·单击这些终点之一,并按“A”键
·单击圆形把道路添加到环状交叉口(接扣至已有结点或者单击路段以添加
新结点)
·再次选择同一个结点,并按“Delete”键删除
·对其余三个终点进行同样操作
·至此已完成任务

注意:
1) 确认圆形有正确的方向(可使用“工具”->“反转路径”)
2) 确认道路是否是关系的一部分,如果你不关心关系,请不要破坏它们。拥有整洁的
环状交叉口很好,但是关系确实有用。
13.1.5.快捷键

The following shortcuts are the default setting. This list might be

outdated. You can always look in the JOSM shortcut preferences to see all

active shortcuts (except for the different mode modifiers). modes

S Select objects
A or N Add / Draw nodes and ways
D Delete nodes or ways
X Stretch a part of a way (create a building or something else)
Z Zoom in by dragging

其它快捷键
B Distribute nodes
C Combine Ways
G Unglue ways
J Join Node to Way
L Align nodes into a straight line
M Merge Nodes
O Align nodes in circle
P Split Way
Q Orthogonalize Shape
R Reverse Way
U Unselect All
del Delete object but don't change into delete mode
+ Zoom in
- Zoom out
Ctrl-, Zoom in
Ctrl-. Zoom out
Shift-A Cycle through the different Auto zoom modes
Shift-M Mirror nodes
Shift-O Create circle
Shift-Q Undo Orthogonalization for certain nodes
1 Zoom to data
2 Zoom to layer
3 Zoom to selection
4 Zoom to conflict
5 Zoom to download
Ctrl-A Select all
Ctrl-C Copy Way/Node etc to buffer
Ctrl-X Cut Way/Node etc to buffer
Ctrl-V Paste from buffer
Ctrl-Shift-V Paste only the tags
Ctrl-D Duplicate
Ctrl-Shift-A Unselect all
Esc Unselect all
Ctrl-Shift-D Download
Ctrl-Shift-Alt-D Download incomplete ways
Ctrl-Shift-U Upload
Ctrl-← Move visible area
Ctrl-↑ Move visible area
Ctrl-→ Move visible area
Ctrl-↓ Move visible area
Shift-← Move object
Shift-↑ Move object
Shift-→ Move object
Shift-↓ Move object
Ctrl-Z Undo
Ctrl-Y Redo
Ctrl-N New file
Ctrl-O Open file
Ctrl-S Save file
Ctrl-Shift-S Save as
Ctrl-E Export to GPX
Ctrl-F Search
Ctrl-Q Exit Application
Ctrl-W Toggle between wireframe and mappaint mode
F1 Help
Shift-F1 About screen (with JOSM version number)
Ctrl-F1 Popup tooltip of current selected action
F12 Preferences
Shift-Alt-A Toggle display on / off of Authors dialog
Shift-Alt-C Toggle display on / off of Conflict dialog
Shift-Alt-T Toggle display on / off of Selection list dialog
Toggle display on / off of Display history dialog (history is not fully implemented
Shift-Alt-H
yet)
Alt-B Open dialog for setting a tag
Alt-L Toggle display on / off of Layers dialog
Shift-Alt-R Toggle display on / off of Relations dialog
Shift-Alt-O Toggle display on / off of Command stack (the undo buffer)dialog
Shift-Alt-P Toggle display on / off of Property for selected objects dialog
Shift-Alt-V Toggle display on / off of validation dialog (requires plugin)
select mode
Click Selects one object. Click in an empty area and drag selects more objects.
Clicking and dragging a red cross in the middle of a segment will insert a
Click
new node at the location of the cross.
Cycle through the different objects under the mouse cursor (for duplicated
Click-MiddleMouse nodes or ways sharing the same nodes). Holding "Ctrl" afterwards to directly
select an object.
Holding the "Shift" key when in select mode adds new element to existing
Shift-Click
selection.
Ctrl-Click Holding the "Ctrl" key toggles element selection.
Ctrl-Shift-LeftMouse Holding the "Shift" and "Ctrl" key allows rotating selected objects.
Ctrl-Alt-LeftMouse Holding the "Ctrl" and "Akt" key allows scaling selected objects.
Cycle through the different objects under the mouse cursor (without
Alt-Click
popup).
add mode
Double
Ends the current way.
Click
Shift-Click Holding the "Shift" key turns off extending the selected way
Ctrl-Click Holding the "Ctrl" key prevents snapping on existing ways and nodes.
Holding the "Alt" key creates a separated though connected way (same you could do
Alt-Click afterwards by selecting a node and press P). This mode is marked by a small bar at
the previous node.
delete mode
Holding the "Shift" key and clicking on a way segment only deletes this way segment
Shift-Click
and not the whole way.
Ctrl-Click Holding the "Ctrl" key deletes object and references (i.e. ways using this node).
Alt-Click Holding the "Alt" key and clicking on a way only deletes the way without its nodes.
extrude mode (X)
Holding the "Ctrl" moves way segments along their perpendicular (orthogonal to the
Ctrl-Click
arrow direction of the way segement).
all modes
Click-RightMouse Click and drag to span.
Scroll-Wheel Zoom in and out.

13.2.概念

对象
对象是 OSM 数据和地图的基本构造块。
JOSM 帮助你把真实世界对象的数据输入到 OSM
地理数据库中。尽管你可以绘制的真实世界对象极端复杂,JOSM 仅提供三种对象作为地图
的基本构建块:结点、道路、关系。
你可以给对象指定标签。正是给定的标签集使得代表餐馆的结点与代表教堂的结点有所
不同,或者住宅道路与河流路线有所不同,或者公交路线关系与自行车路线关系的不同。

13.2.1.结点、路线、关系

:一个结点就是在定义位置处的一个单独的点
:一条路线是一系列结点。尽管使用路线的名字,但它并不仅仅代表现实世界中的
道路。一条 OSM 路线还往往代表一条河流,国界,甚至一栋建筑。如果路线是封闭的(比
如终点和始点重合),则被称为一个区域。

:一个关系是其他对象的序列,比如路线(代表路段)和结点(代表公交站点)的序列,

这就代表了公交路线。关系中的每个对象都被分配一个角色,例如 stop 角色从属于公


交路线上的站点,forward 角色从属于从起点到终点站间公交路线的一部分路段。

13.2.2.标签

一个标签是分配给对象的键值对,它用来描述对象的细节。如果我们使用“foo=bar”

意味着标签的键是 foo,值是 bar。下面是一些例子:
·name=Main road 被分配给一条路线,表明路线名字是“Main road”
·amenity=restaurant 被分配给一个结点,表明该结点代表现实世界中的
餐馆
·route=bus 被分配给一个关系,该关系代表一个公交路线。
标签可以组合使用,一个对象可以根据需要使用多个标签。下面是一个更复
杂的例子:
highway=living_street
name=Main road
name:de=Hauptstrasse
maxspeed=30
hgv=no
oneway=yes
以上标签分配给一条路线,表明该路线代表名字为“Main road”的真实街道,其限速到
30Km/h,不允许重型货车通行,并且是单向行驶街道。
如果你觉得必要,可以自由的给对象分配标签。但是,有一些被称为地图属性的标签,
例如良好定义的规范列表,是被大家经常使用的。强烈建议你使用这些标签,因为地图渲染
器、路由引擎、其它软件模块依赖于这些标准标签。

13.2.3.对象 ID

OSM 服务器给每个对象分配一个唯一的号码,即对象 ID 或 OSM ID。一个新对象没有 ID,


直到首次上传到服务器时才被分配一个 ID。

• TODO: how to enable displaying of object ids


• TODO: download object you now the id of
• TODO: browse an object with a specific id on the server

13.2.4.对象版本

每个对象都有一个对象版本。版本是增量的,无论何时把对象上传至服务器,OSM 服
务器不仅存储最新版本,还存储完整的历史版本。

在历史对话框 中,你可以载入对象的历史,并使用历史浏览器(它会向你展示指定对
象的各个版本)。
或者使用“查看”->“对象历史记录”来重定向到 OSM 站点,这也可以显示对象历史。

13.3.JOSM 接口

13.3.1.地图视图

这是 JOSM 的主视图,这里可以编辑,展示地球资源卫星图和其他图像。可以使用鼠标
右键拖动视图。

13.3.2.主菜单

根据你安装的插件不同,你可能在该菜单总有更多的选项。

13.3.2.1.文件

文件菜单里的标准菜单实体如下:
13.3.3.工具栏

主工具栏:JOSM 主窗口的上方,该工具栏可以高度定制,即可以从“首选项”窗口添
加、删除菜单项。
编辑工具栏:在主窗口的左侧

13.3.4.切换工具栏

在主窗口的右侧。有如下对话框:
图层对话框:
属性对话框:该对话框显示已选对象存在的属性,允许你添加、修改或者删除属性.属
性一般添加到结点或者路线。如要编辑任何对象,必须在使用任何控制选项之前选择该对象。
OSM 使用的键值对可以在如下页面中找到:
http://wiki.openstreetmap.org/wiki/Zh-hans:Map_Features

13.3.5.其他工具栏

You might also like