该篇教程中,官网首先给了我们一个示例。如下图所示:
该示例将让我们用sumo分析交通状态。示例网络包括四个起点、四个终点以及两个无信号交叉口。在调查区域内,每条出城道路都有三条车道,每条车道上允许的交通流都受到限制。所有交叉路口都禁止掉头。此外,东行和西行交通具有更高的优先级。要注意,上图只是一个示意图,不代表真实的图。
数据准备
按照官网教程上的流程,我们应该按照下表建图。
该表给出了网络的坐标信息。
使用netedit构建网络
根据表和图 中基于节点链接的网络布局,用 netedit 程序给出各自的 x 坐标和 y 坐标,将交叉点、起点和终点分别编码为节点 1-6 和节点 91-94。打开 netedit,您可以在 SUMO 软件包的 bin 目录中找到它。然后,创建一个新网络(“文件” -> “新建网络…”)
让我们打开netedit,首先画出如下的网络:
然后使用inspect模式修改这个线段两点的坐标信息:
在这里我将一个点设置为91(-1000,+1000),另外一个点为911(-500,1000)。
接下来保存网络( Save Network As),名称命名为quickstart.net.xml。
接下来让我们添加双向车道,首先还是用inspect模式,点击线段进行选择,然后点击鼠标右键,在Edge operations—>Reverse edge:
此时我们就会获得相反方向的车道线。为了达到图中所示的网络效果,我们还需要增加每个方向的车道线数。我们需要改变左侧栏中的numLanes数量,如下图所示:
路口 911-914 并不是真正需要的。当速度或车道数等属性发生变化时,有必要将一段道路分割成多个边缘。不同的边缘也有助于更详细地分析交通性能。要对弯曲道路进行建模,只需使用 "移动模式 "修改边缘的形状即可。
整体画好的图大概是这个样子:
需要注意的地方是,当一个点两边的numlanes数量不同时,稍等一段时间会自动生成连接处,如图:
- 下一步是定义边之间的连接。要查看已自动建立的连接,请选择 "显示连接 "复选框。
SUMO 中的默认设置是基于所有可能的合理交通流的几何设计。如果没有相应的规范,则允许掉头。默认设置是每个连接线的最右侧车道与相应下游连接线的最右侧车道对齐。在我们的示例中,预计会出现以下连接:
这个图显示了边与边之间的连接信息。含义如下: - (a) from:指定交通流的链路 ID。
- (b) 至:上述已定义链路的下游链路的 ID。
- © fromLane/toLane:(a) 中定义的链路的车道编号和 (b) 中连接的链路的车道编号。
如果切换到 “连接模式”,则可以指定新的连接或更改现有的连接。这可以通过点击所选边来实现。如下图左侧所示,图例中显示了染色边缘的不同含义。
选择connection模式,然后选择一下需要通过的道路。这个地方博主也没有搞很懂。。。。
另一个主题是每条边缘的优先级。在我们的示例中,默认优先级为 1。要更改优先级,请选择要修改的边缘。切换到检查模式。然后,您就可以通过单击其中一条选定的边缘来更改所有选定边缘的优先级信息。示例中 3 车道和 2 车道的东行和西行道路的优先级应为 3,而北行 (L16) 和南行 (L15) 道路的(较低)优先级应为 2。
首先是选择selection模式,将边选定后然后切换到inspect模式,修改优先级priority选项。
交通需求
在交通需求方面,示例网络中有四种车辆类型(A、B、C 和 D)。所有驾驶员的驾驶性能均为 50%。相应信息见表 1.1。在 15:00 至 15:15 的调查时间段内,每种车辆类型每 30 秒有一辆车从出发地出发前往目的地。
交通需求和路线数据与车辆类型数据一起定义在扩展名为 .rou.xml 的文件中。示例网络的相应格式如清单 1.5 所示。
车辆类型
清单 1.5 显示,首先根据表 1.1 中的信息定义了所有车辆类型。相关属性包括:
- id:车辆类型的 ID,由用户用数字、字串或两者定义;
- accel:相应车辆类型的最大加速度(单位 m/s2);
- decel:相应车辆类型的最大减速度(单位 m/s2); sigma:驾驶员的驾驶瑕疵(介于 0 和 1 之间;
- 长度:车辆长度(以米为单位)
- maxSpeed:车辆最大速度(单位:米/秒);
- color:车辆类型的颜色。用 3 个数字(介于 0 和 1 之间)分别代表红色、绿色和蓝色。数值之间用逗号和引号分隔,中间不留空格。例如,1,0,0 代表红色,0,1,0 代表绿色,0,0,1代表蓝色。
表1.5的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<routes>
<vType accel="3.0" decel="6.0" id="CarA" length="5.0" minGap="2.5" maxSpeed="50.0" sigma="0.5" />
<vType accel="2.0" decel="6.0" id="CarB" length="7.5" minGap="2.5" maxSpeed="50.0" sigma="0.5" />
<vType accel="1.0" decel="5.0" id="CarC" length="5.0" minGap="2.5" maxSpeed="40.0" sigma="0.5" />
<vType accel="1.0" decel="5.0" id="CarD" length="7.5" minGap="2.5" maxSpeed="30.0" sigma="0.5" />
<route id="route01" edges="D2 L2 L12 L10 L7 D7"/>
<route id="route02" edges="D2 L2 L12 L15 L18 L5 D5"/>
<route id="route03" edges="D2 L2 L12 L15 L13 L3 D3"/>
<route id="route04" edges="D4 L4 L14 L18 L5 D5"/>
<route id="route05" edges="D4 L4 L14 L16 L10 L7 D7"/>
<route id="route06" edges="D4 L4 L14 L16 L11 L1 D1"/>
<route id="route07" edges="D6 L6 L17 L13 L3 D3"/>
<route id="route08" edges="D6 L6 L17 L16 L11 L1 D1"/>
<route id="route09" edges="D6 L6 L17 L16 L10 L7 D7"/>
<route id="route10" edges="D8 L8 L9 L11 L1 D1"/>
<route id="route11" edges="D8 L8 L9 L15 L13 L3 D3"/>
<route id="route12" edges="D8 L8 L9 L15 L18 L5 D5"/>
<vehicle depart="54000" id="veh0" route="route01" type="CarA" color="1,0,0" />
<vehicle depart="54000" id="veh1" route="route02" type="CarA" />
<vehicle depart="54000" id="veh2" route="route03" type="CarA" />
<vehicle depart="54000" id="veh3" route="route04" type="CarA" />
<vehicle depart="54000" id="veh4" route="route05" type="CarA" />
<vehicle depart="54000" id="veh5" route="route06" type="CarA" />
<vehicle depart="54000" id="veh6" route="route07" type="CarA" />
<vehicle depart="54000" id="veh7" route="route08" type="CarA" />
<vehicle depart="54000" id="veh8" route="route09" type="CarA" />
<vehicle depart="54000" id="veh9" route="route10" type="CarA" />
<vehicle depart="54000" id="veh10" route="route11" type="CarA" />
<vehicle depart="54000" id="veh11" route="route12" type="CarA" />
<vehicle depart="54000" id="veh12" route="route01" type="CarB" color="1,0,0" />
<vehicle depart="54000" id="veh13" route="route02" type="CarB" />
<vehicle depart="54000" id="veh14" route="route03" type="CarB" />
<vehicle depart="54000" id="veh15" route="route04" type="CarB" />
<vehicle depart="54000" id="veh16" route="route05" type="CarB" />
<vehicle depart="54000" id="veh17" route="route06" type="CarB" />
<vehicle depart="54000" id="veh18" route="route07" type="CarB" />
...
</routes>
交通路线数据
在车辆类型信息之后,还需要定义交通路线数据。输入属性包括
- id:某条路线的 ID,由用户用数字、词串或两者定义。
- 边:组成已定义路线的链接名称序列。
交通需求
交通需求数据有四个属性:
- 出发:某辆车的出发时间。
- id:某辆车的 ID,由用户用数字、词串或两者定义。
- 路线:所定义车辆使用的路线。
- 类型:已定义车辆类型的 ID。
sumo的运行流程如下:
命令行
使用命令行可以实现高效的交通仿真执行,尤其是在处理大型复杂交通网络时。为简化执行过程,建议在配置文件中指定所有必要的执行操作,如输入文件的路径和名称、输出类型、输出目录和模拟时间段。
我们在这里使用选项来禁止自动移除在十字路口前等待时间过长的车辆。
quickstart.sumocfg内容如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<configuration xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/sumoConfiguration.xsd">
<input>
<net-file value="quickstart.net.xml"/>
<route-files value="quickstart.rou.xml"/>
</input>
<time>
<begin value="54000"/>
<end value="54900"/>
</time>
<time-to-teleport value="-1"/>
</configuration>
之后运行sumo -c quickstart.sumocfg命令行,如果出现这种报错:
ros@ros-virtual-machine:~/paper/sumo/test$ sumo –c quickstart.sumocfg:未找到命 令
sumo –c quickstart.sumocfg:未找到命令:未找到命令
可能是因为复制粘贴的时候包含了中文的空格。我们重新输入命令即可。
成功的路上当然不会一帆风顺,接下来又出现了别的类型的报错,比如这个:
ros@ros-virtual-machine:~/paper/sumo/test$ sumo -c quickstart.sumocfg
Error: The edge 'L2' within the route 'route01' is not known.
The route can not be build.
Quitting (on error).
可能的原因有在netedit中没有正确的定义道路。我们用inspect检查一下,如果没有正确定义的话则需要修改对应道路的名称。
接下来又出现了新的报错如下:
ros@ros-virtual-machine:~/paper/sumo/test$ sumo -c quickstart.sumocfg
Step #54000.00Error: Vehicle 'veh1' has no valid route. No connection between edge 'L18' and edge 'L5'.
Quitting (on error).
经过我们的检查,发现这个地方没有形成连接(connection),所以车辆无法找到通行的道路,所以报错。
接下来运行命令行出现这个:
ros@ros-virtual-machine:~/paper/sumo/test$ sumo -c quickstart.sumocfg
Step #54900.00 (0ms ?*RT. ?UPS, vehicles TOT 19 ACT 0 BUF 0)
如果你看到这样一段输出,就说明没有问题了.
ros@ros-virtual-machine:~/paper/sumo/test$ sumo -c quickstart.sumocfg
Step #54900.00 (0ms ?*RT. ?UPS, vehicles TOT 19 ACT 0 BUF 0)
接下来我们需要注意的是在sumo-gui中打开配置文件,然后我们就可以看到小车的运行啦!
总结
这个教程讲了如何自己创建路网,然后运行小车的情况。
首先我们需要自己创建路网,然后创建道路之间的连接,然后建立好配置文件quick.rou.xml和quick.sumocfg。这篇文章是告诉我们了rou和sumocfg文件,真正自己创建的时候还是要多注意。