行人仿真#
本页面描述了 SUMO 中的行人仿真。行人即 行走的人。要构建一个包含道路车辆与行人之间正确交互的多模式仿真场景,与纯车辆仿真相比,需要采取额外的步骤。当使用多种模式时,所有边和车道都需要具有 正确的权限以分离不同的交通模式。
在下文中,仅允许行人交通的边被称为人行道 (footpaths)。对于允许两种模式的边,通常最右侧的车道(索引为 0 的车道)仅允许行人,而其他车道禁止行人。最右侧的车道随后被称为人行步道 (sidewalk)。

构建用于行人仿真的网络#
当沿着边行走时,行人会使用可用的人行步道。人行步道是仅允许 sumo vClass pedestrian 的车道。当在交叉口过马路时,行人使用类型为 crossing 的特殊车道。连接人行步道与交叉口的区域由类型为 walkingarea 的特殊车道建模。在下文中,我们将描述如何构建一个包含人行步道、交叉口和行走区域的仿真网络。
在执行行人路径规划时,路由器会区分包含行走区域的网络和不包含行走区域的网络。在前者中,行人只能在有行人过街处过马路。在后者中,它们可以在交叉口允许行人的任意两条边之间“跳跃”。
生成带人行步道的网络#
人行步道是仅允许 vClass pedestrian 的车道。有多种不同的选项可用于生成带人行步道的网络,下文将对此进行解释。
Caution
当前的行人模型假设每条仿真边最多有一条人行步道。为了在单行道两侧都有人行步道,必须添加一条反向的仿真边(该边仅允许行人)。
Note
下面描述的方法会执行检查以防止生成重复的人行步道。如果最右侧的车道被识别为人行步道(它只允许 vClass pedestrian),则不会添加额外的人行步道。
显式指定附加车道#
在描述边 (plain.edg.xml) 时,可以在纯 XML 输入中显式定义人行步道。这是通过定义一个仅允许 vClass “pedestrian” 并设置适当宽度的附加车道来完成的。在这种情况下,必须禁止所有其他车道上的行人。此外,任何预先存在的连接定义都必须修改以考虑新人行步道车道。
显式指定人行步道#
与上述方法不同,在从 .edg.xml 文件加载边时,可以使用 <edge> 属性 sidewalkWidth。这将导致向该边添加指定宽度的人行步道,重新映射连接,并从所有其他车道移除行人权限。
Note
下面描述的启发式方法也会自动执行连接移位和从非人行步道车道移除行人权限。
直接导入#
当导入 OSM 时,可以使用选项 --osm.sidewalks 来导入所有包含此信息的道路的人行步道。
基于类型生成#
当导入具有定义类型的边时,也可以声明某些类型应接收人行步道。这可用于在导入 OSM 数据时自动为人行道生成人行步道,同时省略高速公路的人行步道。示例类型文件可以在 <SUMO_HOME>/data/typemap/osmNetconvertPedestrians.typ.xml 中找到。
<types>
<type id="highway.motorway" numLanes="3" speed="44.44" priority="13" oneway="true" disallow="pedestrian bicycle"/>
<type id="highway.unclassified" numLanes="1" speed="13.89" priority="5" sidewalkWidth="2" disallow="pedestrian"/>
<type id="highway.residential" numLanes="1" speed="13.89" priority="4" sidewalkWidth="2" disallow="pedestrian"/>
<type id="highway.living_street" numLanes="1" speed="2.78" priority="3"/>
<type id="highway.service" numLanes="1" speed="5.56" priority="2" allow="delivery pedestrian"/>
...
</types>
启发式生成#
如果不可用边类型,第三种选择是使用基于边速度的启发式方法。它会为给定速度范围内的所有边添加人行步道。这通过使用以下 netconvert 选项进行控制:
| 选项 | 描述 |
|---|---|
| --sidewalks.guess <BOOL> | 基于边速度猜测行人步道 |
| --sidewalks.guess.max-speed <FLOAT> | 为速度等于或低于给定限值的边添加人行步道 默认:13.89 |
| --sidewalks.guess.min-speed <FLOAT> | 为速度高于给定限值的边添加人行步道 默认:5.8 |
| --sidewalks.guess.exclude <ID>[,<ID>]* | 指定不应接收人行步道的边列表 |
基于权限生成#
选项 --sidewalks.guess.from-permissions <BOOL> 适用于指定其边权限的网络(例如 DlrNavteq)。它会为所有允许在其任何车道上行人的边添加人行步道。选项 --sidewalks.guess.exclude <ID>[,<ID>]* 在此同样适用。
使用 netedit 添加人行步道#
要在 netedit 中向一组边添加人行步道,请选择这些边并在其上右键单击。从上下文菜单中选择 车道操作->添加限制车道->人行步道。
非排他性人行步道#
在存在歧义的情况下,使用以下规则来确定人行步道车道:
- 如果有多条允许 pedestrian 权限的车道,则使用最右侧的一条
- 如果有些车道仅允许行人,而有些车道允许行人与其他车辆类型,则使用仅允许行人的最右侧车道
- 如果没有仅允许行人的车道,但有些车道允许行人与其他车辆类型,则使用这些车道中最右侧的一条
生成带交叉口和行走区域的网络#
为了能够过马路,必须在网络中的交叉口定义过街处。这些位置模拟以下三种情况:
- 优先过马路(斑马线)
- 无优先过马路
- 在交通灯处过马路
要符合过马路的资格,必须有被一条或多条禁止行人交通的车道隔开的人行步道或人行道。
Note
如果要在两个相距较远的交叉口之间过马路,则必须通过分割交叉口之间的边并在插入的交叉口定义过街处来插入额外的交叉口。
可以在描述连接 (plain.con.xml) 时,在纯 XML 输入中显式定义交叉口,使用 XML 元素 crossings。也可以使用 netedit 放置它们。
向网络添加交叉口信息的第二种可用方法是使用 netconvert 选项 --crossings.guess <BOOL>。这将启用一种启发式方法,在具有相似角度的人行步道被禁止行人的车道隔开的地方添加交叉口。如果要跨越的边之间有足够的距离或角度差异足够大,则会生成两个带有一个中间行走区域的交叉口。对于限速超过 50km/h 的道路,仅在 tls 控制的交叉口生成交叉口。此阈值可以通过选项 crossings.guess.speed-threshold 设置。要使用此选项成功生成交叉口,应为人行步道定义 网络。
Caution
为确保正确生成交叉口,道路车道需要通过设置 disallow="pedestrian" 或使用属性 allow 显式指定所有其他允许的类来禁止行人。当通过属性 sidewalkWidth 或上述任何启发式方法添加人行步道时,将在剩余车道上自动禁止行人。
行走区域#
在每个交叉口角落,多条人行步道和人行道可能交汇。这些元素之间的连接性使用行走区域建模。只要设置了 netconvert 选项 --crossings.guess 或网络中至少有一个用户定义的交叉口,这些行走区域就会自动生成。如果网络中不需要交叉口,也可以通过设置选项 --walkingareas 来启用行走区域的创建。
Note
不需要在 .con.xml 文件中定义人行步道或人行道之间的连接。相反,到行走区域的连接以及从行走区域出发的连接会随行走区域一起自动生成。
示例:如果多条人行道在一个交叉口交汇,它们将通过一个单一的行走区域自动连接,该区域允许所有方向的连接性。
Caution
如果在没有行走区域的网络中模拟行人,它们将假设在每个交叉口都具有完全连接性。
共享空间#
如果人员未被限制在道路上行走(即未定义任何人行步道并保持道路的默认权限),则网络模拟共享空间。由共享空间道路接近的每个交叉口将被建模为覆盖整个交叉口的单个行走区域。 因此,在 sumo-gui 中,共享空间仿真通过灰色而非黑色的交叉口区域来指示。
当在共享道路车道上遇到行人或经过被行人使用的行走区域时,车辆会与行人互动(通过减速或停车)。同样,行人也会注意避免走入车辆。
简短概览#
| 输入 | 期望的输出 | 使用的选项 |
|---|---|---|
| shapefile 或其他没有行人信息的数据 | 没有行人基础设施 | 无 |
| 适用处的人行步道和交叉口 | --sidewalks.guess --crossings.guess | |
| OpenStreetMap | 没有行人基础设施 | 无(使用不含人行道的类型映射) |
| 与输入中相同的人行步道和交叉口 | --osm.sidewalks --osm.crossings | |
| 猜测的人行步道和交叉口(丢弃输入) | 为所有应接收人行步道的街道类型提供人行步道宽度的类型映射或 --sidewalks.guess --crossings.guess |
上述选项仅适用于为现有街道添加更多车道。单独的人行道始终会被导入(如果类型映射或其他过滤选项未阻止)。
生成行人需求#
显式#
行人需求可以按照 Specification/Persons#Walks 中的描述显式指定,也可以生成。自版本 1.2 起,直接支持行人流。在旧版本中,也可以使用工具 <SUMO_HOME>/tools/pedestrianFlow.py。
随机#
工具 Tools/Trip#randomTrips.py 支持使用选项 --pedestrians 生成随机行人需求。选项 --max-dist <FLOAT> 可用于限制行人行走的最大直线距离。
行人需求也可能来自多模式路径规划。获取此类场景的一种方法是使用 Tools/Trip#randomTrips.py 并使用选项 --persontrips。
基于 OD#
od2trips 应用程序在设置选项 --pedestrians 时生成行人需求。或者,它通过设置选项 --persontrips 生成多模式需求。
来自本地计数数据#
工具 routeSampler 和 flowrouter 都支持选项 --pedestrians,以基于计数数据生成行人而不是车辆交通。另请参阅选择正确的工具。
行人相关属性#
参见人员属性
行人模型#
可以通过使用仿真选项 --pedestrian.model <STRING> 来选择要使用的行人模型,可用参数为 nonInteracting、striping 或 jupedsim(默认为 striping)。行人模型与仿真其余部分之间的接口旨在实现新模型实现的高度自由。
模型 nonInteracting#
这是一个非常基本的行走模型。行人沿着普通边双向行走并“跳跃”过交叉口。它们可以配置为在固定时间内完成行走,或者以固定速度沿边移动。行人与车辆或其他行人之间不发生任何交互。此模型执行速度非常快,如果行人动态不重要,可能很有用。
模型 striping#
此模型为每个行人在车道(人行步道、行走区域或交叉口类型)内分配 2D 坐标。这些坐标相对于车道起点的最左侧定义,并在每个仿真步骤中更新。这与车辆的坐标形成对比,车辆(通常)在其各自的车道内仅具有 1D 坐标(除非使用了子车道模型)。行人沿着车道向下一个节点前进,该节点可能对应于车道的自然方向(向前移动),也可能相反(向后移动)。因此,x 坐标在车道上单调增加或减少。一旦到达车道末端,行人将被放置在下一条车道上(该车道可能是唯一的,也可能是通过路径规划算法动态确定的)。
行人交互最重要的特征是避免碰撞。为此,“条纹”模型将车道的横向宽度划分为固定宽度的离散条纹。此宽度可由用户使用选项 --pedestrian.striping.stripe-width <FLOAT> 进行配置,默认为 0.65 米,并且不必与子车道模型的横向分辨率匹配。这些条纹类似于多车道道路的车道。因此,避免碰撞简化为在同一条纹内保持足够的距离。每当一个行人与同一条纹内的另一个行人过于接近时,它会沿 y 方向(横向)以及 x 方向移动以切换到不同的条纹。y 坐标连续变化,导致行人暂时占据两个条纹,因此需要确保在两个条纹中都有足够的距离。选择首选条纹的算法基于运动方向(对于迎面而来的行人,倾向于向右躲避)以及行人在该条纹中能够行走而不会发生碰撞的预期距离。该模型假设行人在其中心行走时可以适合单个条纹。当 --pedestrian.striping.stripe-width <FLOAT> 低于给定路径宽度时,在共享车道上不能保证 100% 的安全性,即可能发生碰撞。此时将在仿真期间显示更改条纹宽度的警告。
在每个仿真步骤中,每个行人尽可能快地前进,同时仍避免碰撞。更新对于每个行走方向都是单次通过的,最前面的行人先更新,然后其跟随者按 x 坐标排序。x 方向的速度可能会因随机量而降低,最大量定义为最大速度的一部分,使用全局选项 --pedestrian.striping.dawdling <FLOAT>(默认为 0.2)。作为上述运动规则的结果,行人在足够宽的人行道上倾向于并排行走。他们在交叉口前以宽队列等待,并且如果流入车道的流量大于其流出量,则会形成堵塞。
在行走区域上移动时,适用更复杂的运动规则。在这里,行人路径在多个方向上交叉。穿过行走区域的实际路径由 1-3 个线段组成,并且对于每对相邻的人行步道或交叉口是唯一的。这些路径上的行人计算他们的运动,就像在人行步道上一样。然而,所有其他行人都被映射到该路径的坐标系中,以实现避免碰撞。
堵塞#
在几种情况下可能发生行人堵塞
- 来自不同方向的高流量接近同一个行走区域
- 与共享空间上的车辆互动
- 试图到达已达到其
personCapacity限制的公交站 - 窄人行道上的迎面交通
有几种缓解措施可以防止堵塞的发生频率并在发生后解决它们
- 在交叉口和行走区域,行人为迎面交通预留 1/3 的道路空间(可通过选项 --pedestrian.striping.reserve-oncoming.junctions 配置)
- 在普通车道/人行步道上,可以使用选项 --pedestrian.striping.reserve-oncoming 激活此类预留
- 如果行人无法移动超过 300 秒(可通过选项 --pedestrian.striping.jamtime 配置),它将进入“堵塞”状态,并伴随警告“Person ... is jammed ...”。在此状态下,人员开始移动,无视障碍物,速度为最大速度的 1/4。在堵塞状态下,不会记录行人碰撞。一旦人员前方不再有障碍物,堵塞状态即结束。
- 在过街时,注册为堵塞的时间减少到 10 秒(可通过 --pedestrian.striping.jamtime.crossing 配置)
- 在仅允许单个行人并排的网络元素上,注册为堵塞的时间设置为 1 秒(可通过选项 pedestrian.striping.jamtime.narrow 配置)
模型 jupedsim#
JuPedSim 是由 Jülich 研究中心开发的行人模拟器。它基于先进的社会力模型,并已与 SUMO 耦合。耦合正在进行中,信息将根据需要定期更新。有关 JuPedSim 本身的更多信息,请参阅此页面。
安装#
如果您使用的是 Windows,最新版本的 JuPedSim 与 SUMO 软件分发版一起分发,因此不需要额外的步骤。或者,如果您想在 Windows 上构建最新的 JuPedSim 版本,请参阅构建说明。如果您使用的是 Linux 或 MacOS,则需要构建 JuPedSim,然后构建 SUMO。
使用#
要激活 JuPedSim,请设置选项 --pedestrian.model jupedsim 或将以下行添加到您的 SUMO 配置文件中:
<pedestrian.model value="jupedsim"/>
与 SUMO 中的行人一样,您还需要在您的 SUMO 场景(路线文件)中添加至少一个行人以激活模型。JuPedSim 提供了基于社会力模型的几种行人子模型。但是目前 SUMO 仅使用一种,并且其参数尚未完全暴露。
当 SUMO 网络加载时,所有行人车道、行走区域和交叉口都会被收集,并且几何算法会创建对应于行人网络连通分量的大多边形。此过程称为_几何生成_。目前 SUMO 仅支持一个连通分量;如果您的 SUMO 行人网络有多个连通分量,则面积最大的那个将被保留用于仿真。
除了 SUMO 为 JuPedSim 创建的此几何图形外,还可以使用 SUMO 附加文件(参见此处)的形式提供附加多边形。这些多边形必须是简单的(不自相交)。被视为可行走区域的多边形必须具有类型 jupedsim.walkable_area,而被视为障碍物的多边形必须具有类型 jupedsim.obstacle。为了说明这一点,这里有一个玩具示例:
<additional xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/additional_file.xsd">
<poly id="walkable_area_22F" type="jupedsim.walkable_area" color="179,217,255" fill="True" layer="0" shape="32.00,46.00 32.00,36.00 42.00,36.00 42.00,46.00 62.00,46.00 62.00,56.00 32.00,56.00 32.00,46.00"/>
<poly id="walkable_area_230" type="jupedsim.walkable_area" color="179,217,255" fill="True" layer="0" shape="60.00,60.00 60.00,20.00 100.00,20.00 100.00,60.00 60.00,60.00"/>
<poly id="obstacle_233" type="jupedsim.obstacle" color="255,204,204" fill="True" layer="1" shape="70.00,30.00 90.00,30.00 90.00,50.00 70.00,50.00 70.00,30.00"/>
<poly id="obstacle_48F" type="jupedsim.obstacle" color="255,204,204" fill="True" layer="1" shape="63.21,35.00 62.82,37.34 61.69,39.43 59.94,41.04 57.77,41.99 55.40,42.19 53.10,41.60 51.12,40.31 49.66,38.43 48.89,36.19 48.89,33.81 49.66,31.57 51.12,29.69 53.10,28.40 55.40,27.81 57.77,28.01 59.94,28.96 61.69,30.57 62.82,32.66 63.21,35.00"/>
</additional>
因为目前 SUMO 仅支持一个连通分量,所以这些多边形需要与 SUMO 行人网络相交,否则如果它们的面积小于 SUMO 行人网络的总面积,它们将不会在仿真中被考虑。另请注意,多边形需要具有与 SUMO 网络相同的坐标系中的坐标。可以使用工具 dxf2jupedsim 从 DXF 文件生成此类附加文件,以下是调用该工具的示例:
python %SUMO_HOME%/tools/import/dxf/dxf2jupedsim.py polygons.dxf
DXF 文件应仅由两个图层组成,一个用于可行走区域,一个用于障碍物。这些图层的默认名称分别为 walkable_areas 和 obstacles,但可以使用脚本的选项 --walkable-layer 和 --obstacle-layer 提供自定义名称。然后需要将脚本生成的附加文件添加到您的 SUMO 配置文件中。目前,仅 POLYLINE 和 CIRCLE DXF 实体可以转换。
如果您想可视化为 JuPedSim 创建的行人网络的几何形状,请使用选项 --pedestrian.jupedsim.wkt 后跟某个文件名,以及布尔值 --pedestrian.jupedsim.wkt.geo 来强制或不强制使用地理坐标。
在 JuPedSim 中,行人具有半径。目前,半径计算为行人长度和宽度最大值的一半,这两个量都可以在自定义 vType 中设置。通过更改路线文件中任何 vType 的 desiredMaxSpeed 属性,您可以自定义行人的“自由流”速度。
堵塞#
有时行人在代表其旅程最后一个航点的闸门前被卡住。在这种情况下,您可以通过创建一个名为 jupedsim.vanishing_area 的特殊多边形类型来移除行人。此多边形的 period 属性定义了在此特殊多边形中移除行人的速率(每隔 period 秒移除一个行人)。
速度修改#
为了根据位置修改代理的速度,可以定义一个名为 jupedsim.influencer 的特殊多边形类型。此多边形的 speed 属性定义了进入该多边形的任何代理的新最大速度。请注意,当前速度变化是永久性的(即使代理离开多边形也会持续)。这可能会在未来的版本中更改。此外,该功能可能会被调整以允许更改其他参数。
行人路径规划#
如果用户未指定行走的完整边列表,行人将根据沿道路边的最快路径进行路径规划。这通常也是最短路径,因为边通常没有对行人相关的速度限制。这种路径规划可以在仿真开始前发生(使用 duarouter),也可以在仅将起点和终点加载到仿真中时在插入时进行。路径规划后可以通过 TraCI 影响。
由于人员可以在两个方向上使用每条边,因此在共享空间场景中可能需要一些额外的配置。选项 --persontrip.walk-opposite-factor 可与 duarouter 和 sumo 一起使用,以设置在共享空间上逆交通流行走时的因子。低于 1 的因子会阻止逆流行走。
当使用 striping 模型时,行人还将在交叉口内进行路径规划,以选择一系列行走区域和交叉口来移动到交叉口的另一侧。这种类型的路径规划采用最短路径,但尽可能避免红灯。目前无法影响交叉口内的路径规划行为。
当使用 jupedsim 模型时,行人根据该几何形状的 Delaunay 三角剖分中的最短路径通过生成的几何形状进行路径规划。此外,可以在行人网络中的任何位置创建_航点_,以确保行人遵循特定路线,包括在附加的可行走区域内。要创建这些航点,请使用 NetEdit 的边模式并单击“创建默认边短”(在左侧面板顶部)。然后,您可以在需求模式中像往常一样使用这些边。

行人与其他模式之间的互动#
希望在无控制交叉口过马路的行人,只有在其使用交叉口的预期时间槽不与接近车辆的预期时间槽冲突时才能过马路。应该注意的是,在非优先交叉口的动态在估计所需时间间隔方面是保守的。在仿真中,行人只有在交叉口的整个长度在过街所需的整个时间内都没有车辆时才会使用此类交叉口。在优先交叉口,行人过马路时无需考虑车辆。
车辆被阻止驶过被行人占据的行人过街处。如果发现行人尚未通过交叉点(在过街处和车辆轨迹之间),但距离该点的距离在阈值内(可通过 交叉口参数 jmCrossingGap 配置),则认为过街处被阻塞。
当车辆和行人在同一车道上移动时,它们将尽力避免碰撞。如果车辆占据整个车道宽度并且过于接近行人,行人可能会短暂地移动到车道一侧以让车辆通过。
Note
使用模型 'nonInteracting' 时,行人与其他模式之间不会发生任何互动。
行人输出#
行人包含在以下输出中:
行人检测器#
检测器属性 'detectPersons' 用于配置行人和乘车人员的输出,可与以下检测器一起使用:
- 电感线圈检测器 (E1)
- 车道区域检测器 (E2)(仅支持单车道检测器)
- 多入口出口检测器 (E3)
如果使用属性 'detectPersons',所有检测器输出值将与人员相关(即 'nVehContrib')。 属性 'detectPersons' 支持以下值:
- walk : 检测任何方向的行人
- walkForward : 检测沿边方向行走的行人
- walkBackward : 检测逆边方向行走的行人
- bicycle : 检测骑自行车的人员
- public : 检测乘坐公共交通(巴士或任何轨道车辆)的人员
- taxi : 检测乘坐出租车的人员
- car : 检测乘坐任何其他车辆的人员
网络和模型行为概述#
本节概述了如何生成不同类型的行人基础设施网络、它们的用例以及关于模型行为的预期。
禁止行人#
- 用例:纯车辆网络
- 生成方式:来自 osmWebWizard 的纯汽车网络;使用明确丢弃所有人行道的类型映射导入 OSM
- 行人路径规划:始终失败,因为没有可用的边
- 条纹模型:无法工作,没有可用的边
- 非交互模型:无法工作,没有可用的边
无专用基础设施#
- 用例:具有通用权限的通用网络
- 生成方式:netgenerate;shapefile 导入;所有未设置权限/显式添加基础设施的内容
- 行人路径规划:行人双向使用所有边,交叉口被假定为提供完全连接性(无论是否存在连接)
- 条纹模型:行人在街道上行走并与车辆互动,但在交叉口跳跃
- 非交互模型:行人在街道旁行走并在交叉口跳跃
仅有人行步道但没有行走区域或交叉口#
- 用例:相当例外
- 生成方式:所有通过类型映射添加人行步道或使用 netedit 但未使用 --crossings.guess 的内容
- 行人路径规划:行人双向使用所有允许的边(通常是有步道的边),交叉口被假定为提供完全连接性(无论是否存在连接)
- 条纹模型:行人在人行步道或共享车道上行走并相互互动,但在交叉口跳跃
- 非交互模型:行人在人行步道上行走并在交叉口跳跃
您可以在此处考虑其他子类型,例如仅包含行走区域而没有交叉口,反之亦然,但这会使事情变得过于复杂。将这些网络与下一种类型区分开来的唯一属性是至少存在一个行走区域。
完整的行人基础设施#
- 用例:所有需要知道行人在哪里行走和过马路的地方
- 生成方式:osmWebWizard(如果选择了行人需求)或其他添加人行步道并使用 --crossings.guess 的流程
- 行人路径规划:行人双向使用所有允许的边(通常是有步道的边),交叉口连接性由交叉口和行走区域确定
- 条纹模型:行人在人行步道或共享车道上行走,相互互动,并像人行步道一样使用交叉口和行走区域
- 非交互模型:行人在人行步道、交叉口和行走区域上行走,但没有互动
