概述#
尽管 SUMO 提供了关于排放以及能源/燃料使用情况的输出,但默认情况下,SUMO 中的车辆会按需行驶,无需充电。 用于纯电动汽车的充电站已通过电池设备引入。
Stationfinder 设备让装备该设备的车辆在行驶过程中监控其能量缓冲区(目前仅限电池),并在无法到达目的地的情况下重新规划路线前往附近的充电站。车辆可能会因电池电量过低而故障(参见 rescueAction 参数)。
Note
从 SUMO 1.21 开始,该设备实现仅适用于配备电池设备的车辆。
配置#
下表列出了 stationfinder 设备的所有可能参数。每个参数必须作为相应需求定义元素(例如 <vehicle ... />、<vType ... /> 或 <flow ... />)的子元素以 <param key="device.stationfinder.<参数名称>" value="<参数值>" 的形式指定。
这些参数仅对通过设备分配选项分配了 stationfinder 设备的车辆生效。
| 参数 | 类型 | 范围 | 默认值 | 描述 |
|---|---|---|---|---|
| rescueTime | float (s) | ≥0 | 1800 | 电池耗尽时在路边等待救援车辆的时间 |
| rescueAction | enum | {remove; tow; none} | remove | 对处于救援模式的车辆执行的操作:remove 立即从模拟中移除,tow 等待后传送到充电站,none 不执行任何操作 |
| reserveFactor | float | ≥1 | 1.1 | 按此因子缩放电池需求,以应对意外的交通状况 |
| emptyThreshold | float | [0;1] | 0.05 | 进入救援模式的电池百分比 |
| radius | float (s) | ≥0 | 180 | 以行驶时间秒为单位的搜索半径 |
| maxEuclideanDistance | float (m) | -1 | 以米为单位的欧几里得搜索半径(负值表示禁用此限制) | |
| repeat | float (s) | ≥0 | 60 | 如果未找到充电站,何时触发新的搜索 |
| maxChargePower | float (W) | ≥0 | 100000 | 车辆电池的最大充电速度 |
| chargeType | enum | {charging} | charging | 能量传输类型(目前未使用) |
| waitForCharge | float (s) | ≥0 | 600 | 经过此等待时间后,如果初始充电站被占用,车辆将搜索新的充电站 |
| saturatedChargeLevel | float | [0;1] | 0.8 | 车辆停止充电的目标荷电状态 (SoC) |
| needToChargeLevel | float | [0;1] | 0.4 | 车辆开始搜索充电站的荷电状态 (SoC) |
| replacePlannedStop | float | [0;inf[ | 0 | 在下一个计划停靠点出发前用于充电的时间比例(值 >1 将导致跳过下一个计划停靠点) |
| maxDistanceToReplacedStop | float | ≥0 | 300 | 从充电站到下一个计划停靠点沿网络的距离(米) |
| chargingStrategy | string | {balanced; latest; none} | none | 选择的充电策略(balanced 会在整个停靠期间平均分配充电,latest 会将充电推迟到停靠结束时) |
| opportunisticChargeLevel | float | [0;1] | 0 | 荷电状态低于此值时,车辆即使不需要完成路线,也会希望在计划停靠点附近(同一车道上)充电(称为机会性充电) |
| minOpportunityDuration | float (s) | ≥0 | 3600 | 计划停靠点用于机会性充电的最小预期持续时间 |
| checkEnergyForRoute | bool | {true; false} | true | 检查当前电池电量是否足以完成路线,从而跳过搜索充电站 |
充电决策逻辑#
本段旨在阐述设备决策逻辑中使用的主要条件。设备必须决定是否以及将车辆重新规划路线至何处进行充电。用户可以配置多个阈值来改变不同车辆的行为。
- 只要电池荷电状态 (SoC) 高于
needToChargeLevel,就不采取任何行动。每当 SoC 降低 10% 时,会重新检查此条件。 - 如果 stationfinder 设备估计电池电量仍足以到达目的地并保持至少
emptyThreshold的荷电状态,则不采取任何行动。通过将checkEnergyForRoute设置为false可以停用此检查。 - 当 SoC 达到
needToChargeLevel时,会搜索可能的充电站并使用目标函数进行评估。只有提供正确充电类型(如为车辆电池充电)的充电站才被视为有效目的地。如果当前 SoC 仍能到达目的地且不会使 SoC 低于emptyThreshold,则不针对任何充电站。如果在radius行驶时间(以及可选的maxEuclideanDistance直线距离)内找到有效的充电站,车辆将立即重新规划路线前往该站。其他计划的停靠点将在充电后执行。 - 如果没有可用的充电站,车辆将继续其原始路线。它将在
repeat秒后再次搜索。 - 如果到达时充电站被占用,车辆将等待
waitForCharge秒,然后再寻找替代站点。 - 车辆将充电至足以完成计划路线(乘以
reserveFactor)的程度,并尝试保持 SoC 高于emptyThreshold。 - 装备该设备的车辆每秒(不一定每个时间步)监控电池荷电状态 (SoC) 是否低于
emptyThreshold。如果是,则执行配置的rescueAction。
充电站目标函数#
当有多个站点可供选择时,设备根据目标函数对充电站进行排序,并选择得分最低的站点。目标函数的工作方式与停车搜索的目标函数相同。它由分量和相应的权重因子的线性组合构成。每个参数必须作为相应需求定义元素(例如 <vehicle ... />、<vType ... /> 或 <flow ... />)的子元素以 <param key="device.stationfinder.<参数名称>" value="<参数值>" 的形式指定。
可用的分量及其权重因子如下表所述:
| 参数名称 | 默认值 | 描述 | 逆序 (越大越好) |
|---|---|---|---|
| charging.probability.weight | 0 | 当前不适用 | yes |
| charging.capacity.weight | 0 | 充电站的总容量 | yes |
| charging.absfreespace.weight | 0 | 空闲位置的绝对数量 | yes |
| charging.relfreespace.weight | 0 | 空闲位置的相对数量 | yes |
| charging.distanceto.weight | 0 | 到充电站的道路距离 | no |
| charging.timeto.weight | 1 | 到充电站的预计行驶时间 | no |
| charging.distancefrom.weight | 0 | 从充电站到车辆目的地/下一个停靠点的道路距离 | no |
| charging.timefrom.weight | 1 | 从充电站到车辆目的地/下一个停靠点的预计行驶时间 | no |
| charging.chargingTime.weight | 1 | 在充电站的预计充电时间 | no |
| charging.waitingTime.weight | 1 | 在充电站等待空闲充电点的预计等待时间 | no |
归一化是通过将单个值除以在搜索范围内所有可用充电站中找到的最大值来完成的。逆序意味着取归一化值相对于 1 的余数,而不是归一化值本身。
当 charging.probability.weight 设置为正值时,会为每个候选充电站抽取一个 0 到 1 之间的随机数。
然后通过除以所有充电站元素的最大概率值,将该值归一化到 [0,1] 范围内。归一化后的逆序值随后乘以 charging.probability.weight 以计入候选得分。
影响充电站搜索行为的其他参数#
每个参数必须作为相应需求定义元素(例如 <vehicle ... />、<vType ... /> 或 <flow ... />)的子元素以 <param key="device.stationfinder.<参数名称>" value="<参数值>" 的形式指定。
| 参数名称 | 默认值 | 描述 |
|---|---|---|
| charging.frustration | 100 | 随时间增加对明显空闲充电站的偏好(在 x 次不成功的尝试后,未知占用情况的目标将被假定为几乎满) |
| charging.knowledge | 0 | 让驾驶员以 x 的概率“猜测”不可见充电站的确切占用情况 |
检查目标函数结果#
可以在 sumo-gui 中检查车辆每个搜索到的充电站的目标函数值。请按照以下步骤在充电站旁边查看结果:
- 打开车辆可视化设置并勾选“Show charging info”
- 移动到感兴趣的车辆,右键打开其上下文菜单,然后选择“Show Current Route”
某些充电站可能不会显示目标函数结果。它们可能由于 stationfinder 设备设置(如 radius 和 maxEuclideanDistance)而被预先排除。
因能量不足而故障#
车辆并不总是能在能量耗尽前到达空闲的充电点。这可能由多种原因造成:
- 电池容量低(实际或最大电池容量)
- 能耗高
- 附近充电站数量少
- 充电站占用率高
Stationfinder 设备可以使用参数 rescueTime 和 rescueAction 进行配置,以以下方式处理能量不足:
rescueAction="none":让车辆继续沿路线行驶,尽管它们没有足够的能量rescueAction="remove":车辆将停止,然后从模拟中移除rescueTime="TIME" rescueAction="tow":车辆将停止并等待TIME秒(等待拖车的时间)。然后它将被传送到空闲的充电点,充电并继续其路线。因此,从故障点到充电站的行程不计入排放输出。
与其他计划停靠点的交互#
默认情况下,stationfinder 设备会在不改变任何其他计划停靠点的情况下添加充电站停靠点。但是,它会检查是否存在并非由设备本身创建的计划充电站停靠点。 如果检测到充电需求且车辆下一个停靠点是充电站,且电池容量估计足以到达该停靠点,设备将避免规划额外的停靠点。
添加额外的停靠点可能会影响车辆的行驶时间。在现实条件下,用户可能更喜欢在活动地点附近为车辆充电,然后步行剩余距离。
这可以使用参数 replacePlannedStop 和 maxDistanceToReplacedStop 以及通过 until 属性定义了出发时间的停靠点(参见停靠点)进行建模:
replacePlannedStop> 0:定义从下一个计划停靠点转移到充电的停靠时间比例。如果值超过 1,则跳过下一个计划停靠点。如果值设置为 0,则不转移停靠时间。maxDistanceToReplacedStop定义充电站与模拟活动地点的停靠点之间可接受的距离(米)。如果距离超过此阈值,则不会转移停靠时间。
充电策略#
充电过程由时间、地点和充电功率定义。时间和地点使用 stationfinder 逻辑确定,如所述。 当车辆连接到充电站的时间超过需要时,就有机会改变充电功率曲线,从而在时间上移动充电。 这里,充电策略定义为车辆与充电站之间约定的充电功率曲线。电网运营商可以使用此类策略来降低其必须提供的峰值能量。
目前,可以使用 chargingStrategy 参数在 stationfinder 设备中设置两种充电策略:
chargingStrategy="balanced":限制充电功率,使得充电至目标 SoC 需要整个停靠持续时间(“平坦”充电曲线)chargingStrategy="latest":仍以最大充电速率充电,但不是在到达后立即开始充电,而是尽可能晚地开始充电,以达到目标 SoC
TraCI#
可以使用以下命令直接访问 stationfinder 设备的内部状态: traci.vehicle.getParameter 和 traci.vehicle.setParameter。
上面解释的一些设备参数以及更多只读属性可用(请注意,您需要向 TraCI 函数提供完整名称 device.stationfinder.<参数名称>):
| 参数 | 获取 | 设置 | 描述 |
|---|---|---|---|
| chargingStation | yes | no | 车辆正前往的充电站 ID(否则为空字符串) |
| batteryNeed | yes | no | 完成剩余路线所需的估计能量 |
| needToChargeLevel | yes | yes | 参见上文 |
| saturatedChargeLevel | yes | yes | 参见上文 |
| waitForCharge | yes | yes | 参见上文 |
| repeat | yes | yes | 参见上文 |
| radius | yes | yes | 参见上文 |
| reserveFactor | yes | yes | 参见上文 |
