概述
2 sumo路网
这里的记录的内容,并不以如何绘制或者如何建立一个路网体系为主,而是较为详细的介绍,在sumo中是如何定义路网格式的。这里所有的内容都是来自于sumo的软件说明翻译,其中部分夹杂着自己对于sumo软件的理解,可能存在一些纰漏,欢迎大家及时指正。
这是一副德国的城市地图的截图,也是在sumo官网上面能够看到的一副地图。
sumo路网特点 | 基本说明 |
---|---|
文件扩展名 | .net.xml |
内容类型 | 地图 |
开放格式? | 是 |
SUMO特定? | 是 |
XML模式 | http://sumo.dlr.de/xsd/net_file.xsd |
一个SUMO路网文件(.net.xml)描述了一个地图,地图包括模拟车辆沿道路或横跨运行街道和路口。粗略地说,SUMO路网是有向图。在sumo中,nodes 通常被定义为“路口”和 edges 被定义为道路或街道。请注意,edges是单向的。
具体来说,SUMO网络包含以下信息:
- 每个edge是车道(lane)的集合,包括每个车道的id,位置,形状和速度限制,
- 路口拥有交通信号灯逻辑,
- 交汇处junction,包括其通行权监管,
- lanes之间有交叉口(nodes)连接。
另外,根据使用的输入格式和设置处理选项,还可以找到
- 地形,
- 环形交叉口描述。
尽管SUMO路网XML文件可以被人们读取,但并不意味着可以手动进行编辑。相反,您应该将SUMO XML描述文件 与netconvert一起使用。您也可以从各种格式转换使用现有的地图 netconvert或产生几何形状简单,抽象的路线图与netgenerate。要修改现有的*.net.xml*文件,您可以将它与patch文件一起用netconvert加载。您也可以使用netedit来构建自己的道路网络或对从netconvert或 netgenerate获得的道路网络进行重建。
netconvert允许转换其他地图文件重新生成的SUMO道路网络。
2.1 路网格式
SUMO道路网络被编码为XML文件。内容按实例按以下顺序分组:
- 适用于该网络的地图投影
- edge 首先提供的是internal edge,然后给出 plain edge;每个edge都包含属于它的 lane 列表
- 交通灯逻辑
- junctions路口,包括通行权定义;首先是plain junction ,然后是internal junction
- 连接器 connections,首先是plain connection ,然后是internal connection
- 可选的回旋处
2.2 坐标和对齐
sumo的路网使用笛卡尔坐标,其中最左侧的节点位于x = 0,而最底部的节点位于y = 0。这意味着,如果原始路网未使用笛卡尔坐标和/或度量坐标,则在导入时,netconvert和 netgenerate会投影网络。然后,他们将道路网移至(0,0)的原点。
该过程记录在元素内的生成网络中location
。您可以在此处找到以下属性:
名称 | 类型 | 描述 |
---|---|---|
netOffset | 偏移量(<2D-POSITION>) | 用于将路网移动到(0,0)的偏移量 |
convBoundary | 边界(<2D-BOUNDING_BOX>) | 跨越转换后的网络(现在给出的网络)的节点的边界 |
origBoundary | 边界(<2D-BOUNDING_BOX>) | 投影和转换之前的网络初始边界 |
projParameter | 投影参数 | 信息网络的投影方式(见下文) |
projParameter
可能具有以下值之一:
编码方式 | 描述 |
---|---|
‘!’ | 没有应用投影。 |
‘-’ | 应用了“简单”投影 |
'. ’ | ? |
proj-definition (PROJ_DEFINITION) | 投影是使用proj完成的,并使用这些参数对其进行了初始化。 |
为了从x / y坐标SUMO报告中获得原始坐标,必须先减去路网偏移。然后,关于,必须对初始投影进行逆变换 projParameter
。对于投影项目的路网,可以使用名为pj_inv的proj函数执行逆变换。首先必须使用来自的投影参数来初始化proj projParameter
。对于项目投影的网络,这看起来像:
Position2D cartesian = sumoXY(x, y);
projPJ myProjection = pj_init_plus(projParameter.c_str());
cartesian.sub(netOffset);
projUV p;
p.u = cartesian.x();
p.v = cartesian.y();
p = pj_inv(p, myProjection);
p.u *= RAD_TO_DEG;
p.v *= RAD_TO_DEG;
cartesian.set(p.u, p.v);
对于没有投影的网络(projParameter
=’!’),仅必须应用偏移量。对于具有“简单”投影(projParameter
=’-’)的网络,当前尚不知道反投影方法。
SUMO道路网络意在向北对齐。当然,这取决于用户如何定义道路网络,但是当从“开放街道地图”或形状文件的来源中导入时,向上方向应对应于北方。
2.3 Edges和Lanes
在sumo中定义的plain edge(并不是internal edge)如下图所示,这个edge由两条lane组成
其中shape="7.20,-4.80,100.00,-4.80"中7.20是起点的横坐标,-4.8是起点的纵坐标,(100,-4.8)表示终点的横纵坐标。
<edge id="gneE0" from="gneJ0" to="gneJ1" priority="-1">
<lane id="gneE0_0" index="0" speed="13.89" length="92.80" shape="7.20,-4.80 100.00,-4.80"/>
<lane id="gneE0_1" index="1" speed="13.89" length="92.80" shape="7.20,-1.60 100.00,-1.60"/>
</edge>
“Normal”和“Internal”的edges的编码方式几乎相同,但是它们在强制属性和使用属性方面有所不同。
2.3.1 Normal Edge(正常的Edge或者一般的Edge)
一般的edge是两个交叉点(junction)之间的连接。
例如2.3中交叉点分别是"gneJ0"、“gneJ1”
<edge id="<ID>" from="<FROM_NODE_ID>" to="<TO_NODE_ID>" priority="<PRIORITY>">
... one or more lanes ...
</edge>
在此,ID(上面示例中的<ID>)是在路网导入期间读取的ID。在属性from
和 to
中分别指定了开始节点和结束节点的ID 。优先级是确定路权规则的抽象序数。function
上面的示例中省略了该属性,因为该属性默认为normal(一般的)。
边的属性是:
名称 | 类型 | 描述 |
---|---|---|
ID | id(字符串) | edge的id |
from | id(字符串) | 它开始于的node的id |
to | id(字符串) | 它结束于的node的id |
priority优先 | 整数 | 指明道路的路权高低(可选) |
功能 | 枚举(“ normal ”,“ internal ”,“ connector ”,“ crossing ”,“ walkingarea ”) | 抽象edge目的(可选,默认为“ normal ”) |
对于仿真,仅关注“功能”属性。它描述了边的使用方式,以及它是在现实世界中可以找到的边还是仅用于分配的辅助构造。定义了以下目的:
normal
:edge是路网的常见部分,例如高速公路或连接两条道路的普通街道connector
:连接器是宏观连接器-并非真实世界道路网络的一部分。尽管如此,在模拟中,“连接器”道路和一般的node之间没有区别。只有sumo-gui允许隐藏连接器边缘。internal
:edge是交叉口的一部分(位于交叉口内),请参见上文。crossing
:walkingarea
:
2.3.2 lane 车道
每个edge都包括其组成的车道的定义。以下示例显示了具有两个车道的单个边。注意,坐标既可以是2D也可以是3D。
<edge id="<ID>" from="<FROM_NODE_ID>" to="<TO_NODE_ID>" priority="<PRIORITY>">
<lane id="<ID>_0" index="0" speed="<SPEED>" length="<LENGTH>" shape="0.00,495.05 248.50,495.05"/>
<lane id="<ID>_1" index="1" speed="<SPEED>" length="<LENGTH>" shape="0.00,498.35,2.00 248.50,498.35,3.00"/>
</edge>
可以看到,该ID由车道所属的edge的ID和行驶编号组成,两者均由下划线(_)分隔。如"<ID>_0",最右边车道的行驶数字从零开始。“ index
”属性中也给出了相同的数字。车道也按此数字排序。
车道的属性是:
名称 | 类型 | 描述 |
---|---|---|
ID | id(字符串) | 车道编号 |
索引 | 运行编号 (无符号整数) | 一个运行数字,从最右边的车道以零开始 |
速度 | float | 此车道上允许的最大速度[m / s] |
长度 | float | 该车道的长度[m] |
形状 | 位置向量 | 车道的几何形状,由描述车道中心线的折线给出;不能为空或少于两个位置 |
应当注意,即使边缘的所有车道与形状的几何长度不同,当前其所有车道也具有相同的长度。 netconvert甚至明确允许覆盖几何长度。此外,即使将网络移到(0,0)开始,也不能保证网络的所有部分都具有正坐标。
警告
最小edge长度为0.1m。
Internal Edges(内部Edges)
内部edge位于路口内,并将传入的法线边缘与传出的法线edge连接起来 。如果使用**–no-internal-links**选项构建网络,则不包括内部edge。内部edge的示例可能如下所示:
<edge id="<ID>" function="internal">
... one lane ...
</edge>
内部edge的ID组成为:<NODE_ID> _ <EDGE_INDEX> 其中*<NODE_ID>*是edge所在节点的ID, *<EDGE_INDEX>*是围绕该节点顺时针运行的运行编号(从北开始) )。请注意,该ID的前缀为“:”。如果由内部edge连接的传入和传出edge具有多个通道,则内部edge也具有多个通道(根据这两个edge之间的连接数)。如果是多车道内部edge,则INDEX会以车道数跳跃,因此EDGE_INDEX + LANE_INDEX = CONNECTION_INDEX。
下表中给出了属性。
名称 | 类型 | 描述 |
---|---|---|
ID | id(字符串) | 内部边缘的id |
功能 | “ internal ” | 始终以“ internal ”表示内部edge |
Stop Offset
每个edge或车道可携带一个stopOffset
子元素,以为某些类别的车辆指定附加的停车偏移量:
<edge id="<ID>">
<stopOffset value="<distance in m.>" vClasses="<space-separated list of vClasses>" />
<lane id="<ID>" index="<INDEX>" ... >
<stopOffset value="<distance in m.>" exceptions="<space-separated list of vClasses>" />
</lane>
...
</edge>
为edge定义此元素将影响edge的所有不拥有自己stopOffset
元素的车道。请注意,可以定义受停止偏移量影响的所有车辆类别(属性vClasses
),也可以定义不受影响的所有车辆类别(属性exceptions
)。您不能同时使用两个属性。value
-attribute指定从车道末端停止指定车辆类别所需的距离。
名称 | 类型 | 描述 |
---|---|---|
值 | 值(双精度) | 停止偏移量为正值,以米为单位。 |
vClasses | vClass列表 | 指定stopOffset适用于哪些车辆类别。 |
例外情况 | vClass列表 | 指定stopOffset不适用于哪些车辆类别。 |
有关车辆类别的说明,请参见 此处。
2.4 交通灯模块
交通信号灯程序定义交通信号灯的阶段。
<tlLogic id="<ID>" type="<ALGORITHM_ID>" programID="<PROGRAM_ID>" offset="<TIME_OFFSET>">
<phase duration="<DURATION#1>" state="<STATE#1>"/>
<phase duration="<DURATION#1>" state="<STATE#1>"/>
... further states ...
<phase duration="<DURATION#n>" state="<STATE#n>"/>
</tlLogic>
有关属性和语义的说明,请查阅 Simulation / Traffic Lights。请注意,通常,生成的程序的ID为“ 0”。
2.5 交叉口(Junctions)和路权(Right-of-Way)
Plain 交叉口
交叉口代表不同的道路交叉处的区域,包括车辆穿越交叉路口时必须遵循的通行规则。一个示例可能是:
<junction id="<ID>" type="<JUNCTION_TYPE>" x="<X-POSITION>" y="<Y-POSITION>"
incLanes="<INCOMING_LANES>" intLanes="<INTERNAL_LANES>"
shape="<SHAPE>">
... requests ...
</junction>
Junction本身由以下属性描述:
名称 | 类型 | 描述 |
---|---|---|
ID | id(字符串) | 联结的ID;请注意,控制该路口时,交通信号灯定义必须使用相同的ID。 |
X | X位置(真实) | 相交的x坐标 |
y | y位置(真实) | 相交的y坐标 |
z | z位置(真实) | 相交的(可选)z坐标 |
incLanes | 编号清单 | 在交叉路口结束的车道编号;按方向(顺时针)排序,方向向上= 0 |
intLanes | 编号清单 | 交叉路口内车道的ID |
shape | 职位清单 | 描述十字路口道路边界的多边形 |
customShape | 布尔 | 形状是否由用户自定义(因此不应由netconvert或netedit重建),默认为False |
请注意,连接点的x / y位置描述的是给定值,而不是连接点的计算中心。允许两个节点具有相同的位置。
警告
从0.25.0版开始,每个结点的最大连接数(链接)限制为256。在sumo的早期版本中,限制为64。
要求
以下是“ request
”,如下所示:
<request index="<INDEX>" response="<RELATIVE_MAJOR_LINKS>" foes="<FOE_LINKS>" cont="<MAY_ENTER>"/>
他们描述了对于每个link(给定为“ index
”),哪些车流具有更高的优先级(“ response
”),并迫使link“ index
”上的车辆停止,哪些流发生冲突。“ foes
”是“ ”的超集response
,添加优先级比被称为“ index
”的流低的流。
可以按以下方式读取请求:索引描述了交叉路口进出车道之间的特定连接。索引是按连接方式计算的,顺序如下:首先,从0°(向上)开始按edge的方向对边缘进行排序;第二,使用车道顺序(最右优先);第三,从最右边开始,按照连接的方向进行排序。
从右开始,在“响应”和“敌人”字段中应用相同的顺序。这意味着:
<request index="2" response="001" foes="011" cont="0"/>
使用索引为“ 2”的连接的车辆必须等待使用连接“ 0”的车辆。连接“ 0”和“ 1”是它的敌人。request元素的属性是:
名称 | 类型 | 描述 |
---|---|---|
指数 | 索引(无符号整数) | 在路权矩阵中描述的连接的索引 |
响应 | 位集(字符串) | 一个位串,用于描述每个连接是否禁止该连接处的车辆通过减速路口。最右边的位对应于索引0。 |
敌人 | 位集(字符串) | 一个位串,用于描述每个连接是否与此连接冲突。最右边的位对应于索引0。 |
续 | 布尔 | 车辆是否可以通过第一条停车线在交叉路口内等待,直到没有更高优先级的车辆。从优先方向左移的流通常是这种情况。 |
警告
在属性位串`response`和`foes`必须从右到左被读(响应于链路0是最右边的条目)在对比`tlLogic`-`state`其被读取从左到右字符串(链路0的状态是最左侧的条目)。
内部交叉口
“内部”路口用于 为某些交通关系定义路口内的等待位置。通常用于优先方向左转的车辆或必须等待直行人的右转车辆。
从0.25.0版开始,用户可以自定义内部结的位置(和存在)
这些路口不需要通行权矩阵,而只需遵循以下信息
- 进入内部路口所在路口的车道,并在车辆驶近时禁止通过内部路口
- 穿越内部路口不得占用的内部车道
内部结点的编码如下:
<junction id="<ID>" type="internal" x="<X-POSITION>" y="<Y-POSITION>"
incLanes="<INCOMING_PROHIBITING_LANES>"
intLanes="<INTERNAL_PROHIBITING_LANES>"/>
ID与穿越内部路口本身时使用的通道相同。该类型始终为“内部”。请注意,内部结通常编码为一行。内部联结的属性是:
名称 | 类型 | 描述 |
---|---|---|
ID | id(字符串) | 联结的ID;请注意,控制该路口时,交通信号灯定义必须使用相同的ID。 |
X | X位置(真实) | 相交的x坐标 |
y | y位置(真实) | 相交的y坐标 |
z | z位置(真实) | 相交的(可选)z坐标 |
内嵌 | 编号清单 | 在内部交界处的交叉路口处结束的车道的ID,并禁止越过内部交界处 |
互联网 | 编号清单 | 内部交汇点位于交叉路口内的车道编号,并禁止越过内部交汇点 |
Connections 连接器
Plain Connections 普通连接器
普通连接或“链接”描述可以从输入车道到达哪些输出车道。另外,给出了用于通过交叉路口的第一个车道。其他信息描述了连接的方向和“状态”。如果连接由交通信号灯控制,则会给出交通信号灯的名称以及在交通信号灯的相位定义内控制该连接的信号的索引。连接编码为:
<connection from="<FROM_EDGE_ID>" to="<TO_EDGE_ID>" fromLane="<FROM_LANE_INDEX>" toLane="<TO_LANE_INDEX>"
via="<VIA_LANE_ID>" tl="<TRAFFIC_LIGHT_ID>" linkIndex="12" dir="r" state="o"/>
这些属性是:
名称 | 类型 | 描述 |
---|---|---|
从 | 边缘ID(字符串) | 连接开始的入站边缘的ID |
至 | 边缘ID(字符串) | 连接结束的出站边缘的ID |
fromlane | 索引(无符号整数) | 连接开始的入站边缘的车道 |
tolane | 索引(无符号整数) | 连接终止的输出边缘的通道 |
通过 | 车道编号(字串) | 用来在连接处传递此连接的通道的ID |
tl | 交通灯ID(字符串) | 控制此连接的交通灯的ID;如果连接不受交通信号灯控制,则缺少属性 |
linkIndex | 索引(无符号整数) | 负责交通信号灯内连接的信号的索引;如果连接不受交通信号灯控制,则缺少属性 |
目录 | 枚举(“ s” =直行,“ t” =转弯,“ l” =左,“ r” =右,“ L” =部分左,R =部分右,“无效” =无方向) | 连接方向 |
state | 枚举(“-” =死角,“ =” =相等,“ m” =次要链接,“ M” =主要链接,仅红绿灯:“ O” =控制器关闭,“ o” =黄色闪烁,“ y” =黄色次要链接,“ Y” =黄色次要链接,“ r” =红色,“ g” =绿色次要,“ G”绿色主要) | 连接状态 |
在不使用netconvert创建这些连接时(不推荐),应考虑到具有内部通道的连接遵循特殊模式。例如,当通道1_f_0需要通过1_v_0连接到1_t_0时,存在以下连接条目:[从= 1_f_0,经由= 1_v_0到= 1_t_0]和[从= 1_v_0到= 1_t_0]。如果省略后者,SUMO将不会加载网络。如果在必要的连接旁边存在连接[从= 1_f_0到= 1_v_0],它也不会加载。
connection索引
每个连接都有关联的索引,可以通过自定义gui设置并激活Junctions-> Show … index来在 sumo-gui中显示该索引。这些索引通常是相同的,但可以彼此独立配置。
-
Junction Index:此索引在#Requests部分中进行了 描述。无法修改。索引对应于
<junctions>
s incLanes属性的顺序,也对应于元素的顺序<connection>
。这些索引从顶部开始沿顺时针方向(在右侧网络中)围绕结点运行。 -
TLS索引:此索引分配给由交通信号灯控制的连接 。对于连接的交通信号灯(控制多个路口),此索引不同于**路口索引,**因为后者不再唯一。TLS索引可以使用*.con.xml* 文件配置。自定义索引可用于创建信号组(始终具有相同状态并共享相同索引的多个连接),从而简化交通灯阶段的状态定义。
环形交叉口
路网中的环形交叉口会影响通行权(在网络构建过程中在路口的Requests <request>
元素中进行了编码 )。它们在路网文件中的存在有两个原因:
- 它有助于使用netconvert重新导入*.net.xml-*文件
- 变道模型可能会考虑回旋处
每个回旋处均由其节点和边线定义(有些冗余):
<roundabout nodes="nodeID1 nodeID2 ..." edges="edgeID1 edgeID2 ..."/>
查看,编辑和处理软件
要创建SUMO路网文件,netconvert有助于从其他格式的地图生成文件,并 netgenerate构造具有简单几何形状的新地图。sumo直接在此文件的映射中执行其模拟。大多数其他SUMO工具都会读取此类文件以生成或导入必须映射到道路路网的信息。
可以使用netedit图形化地创建和编辑路网 。
SUMO net文件不适用于手动编辑。而是 使用netconvert将其转换为 SUMO本机XML描述。然后,您可以手动处理这些文件,并使用netconvert重建路网 。
更多文件
- 路网导入
-
- 使用XML和netconvert定义自己的路网
- 使用netconvert从其他应用程序导入路网
- netconvert手册
-
- 生成抽象道路路网
- 使用netgenerate生成抽象路网
- 路网生成手册
- netedit手册
- 开发人员/路网建设流程
注意
处理旧版本的netconvert / netgenerate生成的网络时,请参阅ChangeLog。
最后
以上就是如意夕阳为你收集整理的sumo学习——sumo的路网介绍2 sumo路网的全部内容,希望文章能够帮你解决sumo学习——sumo的路网介绍2 sumo路网所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复