昨天通过一个demo给大家简单介绍了一下Plexe-Sumo,但Sumo自身的底层逻辑仍然是入门者亟需补充的知识!
因此,今天从导入实景地图出发,给大家普及一下Sumo的底层逻辑!
Ps1:以前一直以为Sumo很简单,交通人均会,这段时间才知道Sumo还是略微有点门槛的(主要是很麻烦!
Ps2:本来是想画个思维导图的!但是到了这个点又想偷懒了!还是下次吧
根据 OSM Web Wizard for Sumo 获取指定位置osm文件
-
运行’M:\Exe\Sumo\tools\osmWebWizard.py’后,打开网页(使用期间,请勿关闭!具体文件路径根据安装目录自行修改)
-
定位想要的详细位置。
-
确认相关设置:
Part 1
- Select Area:选择指定矩形区域;
- Duration:持续时间(s);
- Add Polygon:保留地图上的所有信息(比如我们只做道路交通研究,但是它会保留铁路等信息);
- left-hand Traffic:遵从左侧行驶规则;
- Car-only Network:只显示轿车相关的地图信息;
- Import Public Transport:导入公共交通信息;
Part 2——各类交通工具
-
‘through traffic factor’ 表示路线穿越所选区域的车辆数与路线在所选区域内车辆数的对比。生成的车辆会随机在我们划定的区域中选择行驶的起点和终点(起点与终点均在区域边界上),需要注意的是如果起点和终点在区域内,那么就是非’through traffic’。该参数即为两者的车辆数之比。
-
‘count’ 表示与车道数和道路长度有关的每小时生成车辆数。当该值为90时,此时地图中有一条5km长度的道路,该道路是2车道的,那么每小时会生成9025=900辆车。这样计算的话相当于每4秒生成一辆车(900/60/60=0.25车/s 4s*0.25车/s=1车)。
-
本文仅考虑Cars和Trucks在仅考虑汽车和货车的情况下,参数分别被设置为[(5,12),(5,8)]。
Part 3——其它交通路线
- 本文仅考虑Highway。
- Generate Scenario 生成场景’M:\Exe\Sumo\tools’下,所处文件夹以当前时间命名。
根据生成的osm文件重新定义仿真
cfg文件
.sumocfg 仿真主文件
仿真运行的逻辑模块
包括input, time, processing, routing, report, gui_only等部分,路径可以在调整后自己进行更改。
<input>
<net-file value="osm.net.xml"/> <!--路网文件-->
<route-files value="osm.passenger.trips.xml,osm.truck.trips.xml"/> <!--行程文件,包括乘客和货车两部分-->
</input>
<time>
<begin value="0"/>
<end value="81600"/>
<step-length value="0.01"/>
</time>
<processing>
<ignore-route-errors value="true"/> <!--定义路线错误的处理方式,如果车辆无法按照指定路线行驶,将不会导致仿真中止。-->
<collision.action value="remove"/> <!--定义碰撞后的处理方式,移除碰撞车辆-->
<collision.stoptime value="10"/> <!--定义碰撞后的处理方式-->
</processing>
<routing>
<device.rerouting.adaptation-steps value="18"/> <!--定义碰撞后重新规划路线的步数-->
<device.rerouting.adaptation-interval value="10"/> <!--定义碰撞后重新规划路线的间隔时间-->
</routing>
<report>
<verbose value="true"/> <!--启用详细日志输出-->
<duration-log.statistics value="true"/> <!--启用仿真持续时间的统计信息记录-->
<no-step-log value="true"/> <!--不记录仿真步骤的信息-->
</report>
<gui_only>
<gui-settings-file value="osm.view.xml"/><!--指定了GUI设置文件的路径-->
</gui_only>
.netcfg osm-net准换文件
应用osm.xml文件到net.xml文件的转化模块netconvert
,主要转换节点、道路、车道、交通规则等,在此不详细阐述
.polycfg osm-poly转换文件
应用osm.xml文件到net.xml文件的转化模块polyconvert
, 但区别于netconvert
,polyconvert
转换一些其它元素,如湖、森林等,在此同样不详细阐述
xml文件
.net.xml 路网文件
边(edge)定义
<edge id="0#1" from="1" to="2" name="长沙绕城高速" priority="14" type="highway.motorway" spreadType="center" shape="2268.22,8902.44 2203.70,9038.84 2144.01,9187.29 2116.73,9267.56 2098.93,9329.71 2076.12,9432.76 2071.49,9453.69">
<lane id="0#1_0" index="0" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="39.44" length="583.88" shape="2268.98,8904.60 2205.17,9039.48 2145.51,9187.85 2118.26,9268.04 2100.48,9330.11 2077.68,9433.11 2073.44,9452.29">
<param key="origId" value="965757795 965757790 965757788"/>
</lane>
<lane id="0#1_1" index="1" allow="private emergency authority army vip passenger hov taxi bus coach delivery truck trailer motorcycle evehicle custom1 custom2" speed="39.44" length="583.88" shape="2266.08,8903.23 2202.24,9038.20 2142.51,9186.74 2115.20,9267.08 2097.38,9329.32 2074.56,9432.41 2070.31,9451.60">
<param key="origId" value="965757795 965757790 965757788"/>
</lane>
<param key="ref" value="G107"/>
</edge>
上述代码是两个道路边的示例,每条边的属性含义如下表所示
edge | 道路边定义,属性如下(该边包括两个车道) |
---|---|
id | 边标识符 |
from | 起点标识符 |
to | 终点标识符 |
name | 名称 |
priority | 优先级 |
type | 类型('Highway.motorway’表示高速公路) |
spreadType | 边的分布类型 |
shape | 边的形状(由一系列点坐标表示) |
lane | 车道定义,属性如下 |
id | 车道标识符 |
index | 车道索引 |
allow | 车道允许车辆类型 |
speed | 车道限速(m/s) |
length | 车道长度 |
shape | 车道形状(由一系列点坐标表示) |
key = ‘ref’ | value = “G107” 高速编号 |
交叉口(junction)定义
<junction id="0#0-AddedOffRampNode" type="priority" x="2114.64" y="8808.36" incLanes="1087703260#0_0" intLanes=":1087703260#0-AddedOffRampNode_0_0 :1087703260#0-AddedOffRampNode_0_1" shape="2117.98,8805.64 2112.38,8802.54 2111.30,8811.08 2114.10,8812.64">
<request index="0" response="00" foes="00" cont="0"/>
<request index="1" response="00" foes="00" cont="0"/>
</junction>
上述代码是一个交叉口的示例,交叉口的每个属性含义如下表所示
junction | 交叉口定义,属性如下(该交叉口包括两个request) |
---|---|
id | 交叉口标识符 |
type | 交叉口类型(=‘priority’,按照规定的优先级顺序通行,没有交通信号控制;=‘traffic_light’,按照交通信号灯通行;…) |
x | 地理坐标 |
y | 地理坐标 |
incLanes | 进入交叉口的车道 |
intLanes | 在交叉口内的车道 |
shape | 交叉口的形状(由一系列点坐标表示) |
request | 对车辆在交叉口上的请求和响应情况及进行定义 |
index | 请求索引,用于唯一标识请求 |
response | 请求的响应,通过两位字符编码分别表示横向方向(左、直行、右)和纵向方向(前进、停车等)的动作。 |
foes | 对手车辆的请求响应 |
cont | 控制情况,表示车辆的特殊控制行为。 |
连接处(connection)定义
<connection from=":9965927983_7" to="1087703262#1" fromLane="0" toLane="0" dir="l" state="M"/>
<connection from=":9965927983_8" to="-1087703263" fromLane="0" toLane="0" dir="t" state="M"/>
上述代码是一个连接处的示例,连接处的每个属性含义如下表所示
connection | 连接处定义,属性如下 |
---|---|
from | 连接的起始道路边的标识符 |
to | 连接的目标道路边的标识符 |
fromLane | 连接的起始道路边车道的标识符 |
toLane | 连接的起始道路边车道的标识符 |
via | 通过哪个通道或车道进行链接(通常以’:'开头,后面跟标识符) |
dir | 连接方向(‘r’, ‘l’, ‘s’, ‘t’, 分别表示右转、左转、执行和掉头或返回) |
state | 连接状态('m’表示连接不受限,'M’表示存在限制或需要特殊规则) |
.rou.xml 车辆条目文件
<vType id="veh_passenger" vClass="passenger"/>
<vehicle id="veh0" type="veh_passenger" depart="0.00" departLane="best">
<route edges="955279653#3-AddedOnRampEdge 955279653#3 955279651#0 955279651#1 955279651#1-AddedOffRampEdge 955279651#2 955279651#3 955279651#4 -955279631#0"/>
</vehicle>
上述代码是rou车辆条目文件的一个示例,rou中的每个属性含义如下表所示
rou | 车辆条目文件中的定义,各属性如下 |
---|---|
vType | 定义车辆类型,包括id和vClass两个属性 |
id | 车辆类型的标识符 |
vClass | 车辆类型的分类 |
vehicle | 定义某一车辆 |
id | 定义该车辆的标识符 |
type | 定义该车辆的类型 |
depart | 定义该车辆的出发时间 |
departLane | 定义该车辆的出发车道 |
route edges | 定义该车辆的行程路线 |
.trips.xml 路线文件
<vType id="veh_passenger" vClass="passenger"/>
<trip id="veh0" type="veh_passenger" depart="0.00" departLane="best" from="955279653#3" to="-955279631#0"/>
上述代码是trip文件的一个示例,rou中的每个属性含义如下表所示
trip | 路线文件中的定义,各属性如下 |
---|---|
vType | 定义车辆类型,包括id和vClass两个属性 |
id | 车辆类型的标识符 |
vClass | 车辆类型的分类 |
trip | 定义某一车辆,其中部分与rou中保持一致 |
from | 该车辆的出发位置 |
to | 该车辆的目的地 |
bat文件
build.bat
该bat文件的目的是通过randomTrips.py自动创建符合net.xml的路由,即rou.xml和trip.xml。
randomTrips.py是 SUMO 提供的用于自动生成车辆的工具,可以根据随机性或特定概率分布生成车辆,并将它们放置在网络中的随机或预定义的位置,适用于模拟更灵活的交通情况,如城市中的随机车辆生成。
Tips: 对于需要生成不同的情况,可以根据更改文件中的具体参数调整随机生成的路由文件。
run.bat
该bat文件的目的是在sumo-gui中运行sumofig文件。
以上就是对一个可以运行sumo例子的简单介绍,希望能给大家带来帮助!
如有错误,敬请指正!
REF:
[1]【SUMO学习】初级 OSMWebWizard-优快云博客
[2] 交通系统仿真软件 —— SUMO - 简书 (jianshu.com)
Tool:
[1] ChatGPT