Note
simpla 是为 SUMO 版本 > 0.30.0 编写的。如果可能,我们强烈建议定期更新到最新的 SUMO 版本。每日快照可以在这里找到。
由于 simpla 使用 TraCI 的 StepListener 接口,它不能与从同一个客户端控制多个 sumo 实例结合使用。
简介#
simpla 是一个可配置的、用于 TraCI Python 客户端 的编队(platooning)插件。它管理车辆编队的自发形成,并允许您定义在编队中行驶的车辆的特定行为。
这是通过定义额外的车辆类型来实现的,这些类型代表编队模式,并提供信息说明哪种类型(模式)用于正常的单独行驶,以及哪种用于激活编队时。此外,可以指定“追上(catch-up)”模式,当潜在的编队伙伴在前方更远的下游时使用。
除了正常的行驶模式外,最多可以指定四种编队操作模式(详情见配置部分):
- 编队领头车模式(参数化位于编队最前方的车辆)
- 编队跟随车模式(参数化在编队中跟随另一辆车行驶的车辆)
- 编队追上模式(参数化在编队范围内、适合加入的车辆)
- 编队追上跟随车模式(参数化在编队中行驶、且领头车处于追上模式的车辆)
Note
相应的 vTypes 必须在 SUMO 启动时已知。这意味着,它们应该放在需求定义的开头。当使用 duarouter 生成路径时,请使用选项 --vtype-output 生成一个包含 vTypes 的单独文件,该文件可以预先加载。
仅指定编队领头车模式即可使用 simpla。对应于跟随车模式的行为将在未指定跟随车模式时使用领头车模式。对应于追上模式的情况将在未指定单独的追上模式时使用单独行驶模式。对应于追上跟随车模式的情况将在未指定单独的追上跟随车模式时使用跟随车模式。
Note
Simpla 目前不支持为了加入编队而换道。但是,已经在编队中的车辆如果领头车换道,它们会尝试换道。
配置#
simpla 的配置是通过提供一个包含应用的强制和可选参数的 xml 文件来完成的。它有一个根元素 configuration,带有由参数名标记的子元素,并包含对应于不同参数值的属性。所有可能的属性列在下面的属性表中。一个非常简单的配置文件可能如下所示(一个更完整的示例,作为模板,可以在安装目录 <SUMO_HOME>/tools/simpla 中找到):
<configuration>
<vehicleSelectors value="pkw" />
<vTypeMap original="simple_pkw" leader="simple_pkw_as_platoon_leader" follower="simple_pkw_as_platoon_follower"/>
...
</configuration>
以下表格总结了所有允许的配置参数:
| 参数名称 | 值类型 | 描述 |
|---|---|---|
| vehicleSelectors | string | 如果车辆的类型 ID 包含给定的车辆选择器字符串作为子字符串,则该车辆由 simpla 控制。给定的值可以是逗号分隔的选择器列表。默认为空字符串,这会选择所有车辆进行控制。 |
| controlRate | float | 编队管理逻辑的更新次数(每秒)。默认为 1.0 秒。 注意: 该速率不能增加到超过 1/时间步长。 |
| maxVehicles | int | 编队内的最大车辆数。默认为 10。 |
| maxPlatoonGap | float | 车辆被视为一个编队的间隙(米),前提是它们的 vType 参数允许在实际情况下安全行驶。默认为 15 米。 |
| maxPlatoonHeadway | float | 车辆被视为一个编队的车头时距(秒),前提是它们的 vType 参数允许在实际情况下安全行驶。默认为 1.5 秒。在静止时,使用 maxPlatoonGap。 |
| platoonSplitTime | float | 如果车辆与其在编队中的领头车保持的距离大于 maxPlatoonGap(或行驶在不同的车道上,或在其编队之外的车辆后面),则经过该时间(秒)后该车辆将被分离。默认为 3.0 秒。 |
| catchupDist | float | 如果定义了追上模式,一旦编队在前方距离小于给定值(米),车辆就会将其类型切换到相应的追上车辆类型。默认为 50.0 米。 |
| catchupHeadway | float | 如果定义了追上模式,一旦编队在前方车头时距小于给定值(秒),车辆就会将其类型切换到相应的追上车辆类型。默认为 6.0 秒。 |
| switchImpatienceFactor | float | 切换急躁因子决定了由于安全约束导致等待模式切换的时间增加对车辆活动速度因子的影响程度。活动速度因子计算公式为 activeSpeedFactor = modeSpecificSpeedFactor/(1+impatienceFactor*waitingTime)。切换急躁因子的默认值为 0.1。 |
| edgeLookAhead | int | 跟随车必须与潜在领头车一起行驶的边(edge)的数量。要加入编队,只需满足 distLookAhead 或 edgeLookAhead 条件中的一个。默认为 3。 |
| distLookAhead | float | 跟随车必须与潜在领头车一起行驶的距离(米)。要加入编队,只需满足 distLookAhead 或 edgeLookAhead 条件中的一个。默认为 500。 |
| lcMinDist | float | 距离下一个路口的距离(米),低于此距离不发出换道建议。默认为 100。 |
| lcMode | integers (binary code) | 指定在相应操作模式期间要使用的换道模式(例如 <lcMode leader=597 follower=514 .../>)。模式 leader 和 original 默认为 594,follower 和 catch-up 模式默认为 514。 |
| speedFactor | floats for attributes: original, leader, follower, catchup, catchupFollower | 指定在相应操作模式期间要使用的速度因子(例如 <speedFactor follower="1.1" catchup="1.2" .../>)。所有模式默认为 1.0。 |
| useHeadway | bool | 是否应使用车头时距参数代替间隙参数。默认启用。 |
| vTypeMap | strings for attributes: original, leader, follower, catchup, catchupFollower | 指定在相应操作模式期间要使用的车辆类型(例如 <vTypeMap original="type1" leader="leader_type1" .../>)。如果未定义 catchup,则使用原始类型;如果未定义 catchupFollower,则使用 follower。original 车辆类型指定了离开编队时要恢复到的类型。 |
| vTypeMapFile | string | 指定包含车辆类型映射规范的文件名。引用的文件应包含以下形式的行:origTypeID:leaderTypeID:followerTypeID:catchupTypeID:catchupFollowerTypeID。给定的车辆类型 ID 可以是空字符串,导致如上所述的默认行为。注意:在此类文件中指定的映射会覆盖作为 vTypeMap 类型的 xml 元素给出的映射。 |
| verbosity | int | 指定模拟期间的输出级别。 |
将 simpla 集成到您的 traci 脚本中#
首先,您应确保目录 <SUMO_HOME>/tools 在您的 PYTHONPATH 中(参见此处获取进一步说明)。要在您的 python 脚本中使用 simpla,还需要提供一个如上所述的配置文件。假设这样一个名为 simpla.cfg 的文件位于您的工作目录中,您需要做的就是将 simpla 作为 python 模块导入:
import simpla
并在建立 TraCI 连接到 SUMO 之后,加载您的配置。
traci.start(...)
...
simpla.load("simpla.cfg")
调用 simpla.load 会自动安装一个 TraCI-stepListener,编队管理将在每次调用 traci.simulationStep() 结束时执行。
Caution
(1) simpla 会更改所有连接车辆的车辆类型、速度因子和换道模式。如果您的应用程序也这样做,可能会产生意想不到的后果。
(2) 目前,不支持长度不为 DeltaT 的步长(即,如果在 simpla 运行时调用带有参数的 traci.simulationStep(),可能会产生不良行为)。
(3) simpla 添加了对 VAR_SPEED、VAR_ROAD_ID、VAR_LANE_ID 和 VAR_LANE_INDEX 的订阅,并在停止时(通过 simpla.stop())移除它们。
(4) 如果您从同一个 python 脚本启动多个模拟运行,请确保在它们之间调用 traci.close() 或 simpla.stop() 以重置 simpla 的状态。
实用函数#
计划在 simpla 中添加用于车辆控制的实用函数。可以通过 simpla.<function_name> 引用它们。目前,仅实现了一个。
openGap()#
该函数的语法如下:
openGap(vehID, desiredGap, desiredSpeedDiff, maximumDecel, duration)
参数如下:
| 参数名称 | 值类型 | 描述 |
|---|---|---|
| vehID | string | 要控制的车辆的 ID。 |
| desiredGap | float>0 | 应建立的间隙。 |
| desiredSpeedDiff | float>0 | 如果可能,间隙打开的速率。 |
| maximumDecel | float>0 | 试图近似 desiredSpeedDiff 时的最大减速度。 |
| duration | float>0 | 间隙控制应保持活动状态的时段。 |
该方法为给定车辆前方添加一个用于打开间隙的控制器,该控制器在给定的持续时间内保持活动状态。如果领头车比 desiredGap 更近,控制器会尝试通过产生给定的速度差来建立 desiredGap,同时刹车力度不超过 maximumDecel。在内部,会创建一个 GapCreator 类的对象来管理车辆状态,并将其作为 stepListener 添加到 traci 中。
统计辅助函数#
下面列出了一些统计辅助函数,用于获取有关现有编队的信息。在启动 simpla 后(如上文所述)即可使用。
getAveragePlatoonLength()#
该函数计算所有当前形成的编队中车辆的平均编队长度:
avgLength = simpla.getAveragePlatoonLength()
getAveragePlatoonSpeed()#
该函数计算所有当前形成的编队中车辆的平均速度:
avgSpeed = simpla.getAveragePlatoonSpeed()
getPlatoonLeaderIDList()#
此实用函数返回 simpla 管理的所有当前编队的领头车 ID:
currentLeaderIDs = simpla.getPlatoonLeaderIDList()
getPlatoonIDList() 和 getPlatoonInfo()#
可以通过其在道路网络上的位置(使用相关的边 ID)来查找编队。 该函数返回当前在由 edgeID 给定的边上至少有一辆成员车辆的编队的 ID。 即使编队已经离开该边,也可以使用编队 ID 通过 getPlatoonInfo 获取更新:
platoonIDs = simpla.getPlatoonIDList(edgeID)
if len(platoonIDs) > 0:
platoonInfo = simpla.getPlatoonInfo(platoonIDs[0])
platoonSize = len(platoonInfo["members"])
getPlatoonInfo 函数返回一个包含有关编队值的字典,使用下表中的键:
| 键名称 | 值类型 | 描述 |
|---|---|---|
| laneID | string | 领头车当前所在车道的 ID。 |
| members | list(string) | 编队中车辆的 ID。 |
getPlatoonID()#
此实用函数允许检查给定车辆是否是 simpla 中编队的一部分。如果由其 ID 给定的车辆由 simpla 控制,该函数返回数字编队 ID(否则为 -1)。编队 ID 可用作 getPlatoonInfo 的输入,以获取有关编队结构的信息。
vehID = "myExampleVehicle"
platoonID = simpla.getPlatoonID(vehID)
示例#
可以从每日测试套件下载一个示例。
可以通过调用 python runner.py 来执行此操作。
